как использовать glreadpixels с Android - обычно получают нули - PullRequest
2 голосов
/ 23 июля 2011

Я пытаюсь обнаружить объект OpenGL под курсором ... Я прочитал его, как сбор.Вот мой код:

public int makeBuffer(GL10 gl, int x, int y) {

    ByteBuffer PixelBuffer = ByteBuffer.allocateDirect(4);
    PixelBuffer.order(ByteOrder.nativeOrder());
    PixelBuffer.position(0);
    int mTemp = 0;
    gl.glReadPixels((int)x, (int) y, 1, 1, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, PixelBuffer);
    Log.e("Picking", " xy: x" + x + " y"+ y);
    byte b [] = new byte[4];
    PixelBuffer.get(b);
    Log.e("Picking", " rgba: r"+ PixelBuffer.get(0) + " g" + PixelBuffer.get(1) + " b" +
            PixelBuffer.get(2) + " a" + PixelBuffer.get(3));
    Log.e("Picking", " rgba: r"+ b[0] + " g" + b[1] + " b" +
            b[2] + " a" + b[3]);

    //mTemp = PixelBuffer.get(0);
    mTemp = b[0];

    Log.e("Picking", "result:" + mTemp );

    return mTemp;
}

Обратите внимание, что большая часть кода выше - это операторы logcat.Мой код выводит нули на экран для r, g и b.Для альфы выводится «-1», который переводится в 255 (без знака) как «полная альфа».Я пытаюсь определить цвет на экране в заданной позиции х / у.Я был бы счастлив с красным значением, которое находится где-то между 1 и 15, поскольку это цвет, который должен быть ниже касания.Я ожидал бы, что, если бы я делал это совершенно неправильно, я получал бы все нули, но я должен делать это по крайней мере частично правильно, поскольку я получаю альфу.Я также включил в свой манифест строки, которые сообщают телефону, что я использую разрешения для «flinger поверхности» и «буфера чтения кадра».Я не знаю, работают ли эти строки.

<uses-permission
android:name="android.permission.ACCESS_SURFACE_FLINGER" />
<uses-permission android:name="android.permission.READ_FRAME_BUFFER" /

любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 05 сентября 2012

Эти разрешения доступны только для приложений подписи.Приложения, которые были подписаны при сборке Android ROM.Так что они ничего не делают для обычных приложений.

android:name="android.permission.ACCESS_SURFACE_FLINGER"
android:name="android.permission.READ_FRAME_BUFFER" 
2 голосов
/ 28 ноября 2011

Я также сталкивался с подобными проблемами при создании приложения openGL ES на Android.

До сих пор я обходил решение изменить приложение с RGB565 на RGBA8888.Вставьте эти строки перед настройкой рендерера:

getHolder().setFormat(PixelFormat.RGBA_8888);
setEGLConfigChooser(8, 8, 8, 8, 0, 0);

Вы должны знать, что это решение будет работать только на устройствах, которые поддерживают RGBA8888.

...