繁体   English   中英

glReadPixels的奇怪问题

[英]Strange issue with glReadPixels

在重写的Renderer函数之外使用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对象。 我通过将其打印到Log来检查了指向gl对象的内存指针,并且两者都具有相同的地址。

我现在真的很沮丧...有人有想法吗?

两个问题:

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

2)glReadPixels从当前渲染到的缓冲区读取。 在onDrawFrame返回之后,GLSurfaceView将调用eglSwapBuffers。 您将不再能够读取要绘制到的缓冲区。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM