Странная проблема с glReadPixels - PullRequest
       6

Странная проблема с glReadPixels

0 голосов
/ 09 сентября 2011

У меня странная проблема при использовании объекта GL10 вне переопределенных функций Renderer.

Например, с целью выбора геометрии с помощью цветовых кодов я пытался считывать буфер цвета с помощью glReadPixels.

@Override
public void onDrawFrame(GL10 gl) {

...

    ByteBuffer pixel = ByteBuffer.allocateDirect(4);
    pixel.order(ByteOrder.nativeOrder());
    gl.glReadPixels(0, 0, 1, 1, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, pixel);

    while (pixel.hasRemaining()){
    Log.v(TAG,""+(int)(pixel.get() & 0xFF));
    }

}

Это работает и дает мне значения цвета в диапазоне 0..255 для пикселя в левом нижнем углу. Теперь, когда я беру свой объект GL10 и делаю его доступным для всего класса в качестве поля, он больше не работает:

@Override
public void update(Observable observable, Object data) {
Log.v(TAG, "update Observer glsurfaceviewrenderer");
if (data instanceof MotionEvent){
    MotionEvent event = (MotionEvent) data;

    ByteBuffer pixel = ByteBuffer.allocateDirect(4);
    pixel.order(ByteOrder.nativeOrder());
    gl.glReadPixels(0, 0, 1, 1, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, pixel);


    while (pixel.hasRemaining()){
    Log.v(TAG,""+(int)(pixel.get() & 0xFF));

    }

}
}

Это не работает, все цвета имеют значение 0. Разница лишь в том, что я использовал объект gl через поле, а не через аргумент функции. Я проверил указатель памяти на gl-объект, напечатав его в Log, и оба имеют одинаковый адрес.

Я сейчас в тупике ... у кого-нибудь есть идеи?

1 Ответ

4 голосов
/ 13 сентября 2011

Две проблемы:

1) Вы можете выполнять вызовы OpenGL только из потока, к которому привязан контекст. onDrawFrame выполняется в потоке, созданном GLSurfaceView, в то время как я предполагаю, что ваш метод обновления вызывается из основного потока пользовательского интерфейса.

2) glReadPixels читает из буфера, который вы в данный момент визуализируете. После возврата onDrawFrame GLSurfaceView вызовет eglSwapBuffers. Вы больше не сможете читать буфер, в который вы рисовали.

Вам нужно будет реорганизовать свой код, чтобы вы знали, какой пиксель нужно прочитать во время вызова onDrawFrame. Единственный другой вариант - каждый раз получать весь кадр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...