glReadPixels的奇怪问题

时间:2011-09-09 18:09:07

标签: android opengl-es

在重写的渲染器函数之外使用GL10对象时,我遇到了这个奇怪的问题。

例如,为了通过颜色代码选择几何体,我尝试通过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-object而不是通过函数参数。我通过将其打印到Log来检查gl-object的内存指针,两者都有相同的地址。

我现在真的很难过......任何有想法的人?

1 个答案:

答案 0 :(得分:4)

两个问题:

1)您只能从绑定上下文的线程进行OpenGL调用。 onDrawFrame在由GLSurfaceView创建的线程中运行,而我假设您的更新方法是从主UI线程调用的。

2)glReadPixels从您当前渲染的缓冲区中读取。在onDrawFrame返回后,GLSurfaceView将调用eglSwapBuffers。您将无法再读取您要绘制的缓冲区。

您需要重新组织代码,以便了解在调用onDrawFrame时需要读取的像素。您唯一的另一种选择是每次都获取整个帧。