glreadpixel gl_depth_component返回0?

时间:2012-08-18 07:30:07

标签: opengl-es-2.0 intersection depth-buffer glreadpixels depth-testing

我正在寻找立方体和线的交叉点的解决方案。所以我用了

GLES20.glReadPixels(touchX, touchY, 1, 1, GLES20.GL_DEPTH_COMPONENT, GLES20.GL_FLOAT, zz);

我显示了zz,但结果是0.所以当我触摸立方体时(实际上在2d屏幕上),我怎么能得到立方体的深度缓冲值。我使用GLES20和Android API level15。我的代码如下。

        ByteBuffer PixelBuffer = ByteBuffer.allocateDirect(4);
    ByteBuffer zBuffer = ByteBuffer.allocateDirect(4);

    PixelBuffer.order(ByteOrder.nativeOrder());
    PixelBuffer.position(0);
    zBuffer.order(ByteOrder.nativeOrder());
    zBuffer.position(0);
    FloatBuffer zz;
    zz = zBuffer.asFloatBuffer();
    GLES20.glReadPixels(touchX, touchY, 1, 1, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, PixelBuffer);
    GLES20.glReadPixels(touchX, touchY, 1, 1, GLES20.GL_DEPTH_COMPONENT, GLES20.GL_FLOAT, zz);
顺便说一句,采摘颜色很好。

谢谢!

1 个答案:

答案 0 :(得分:0)

你忘了准备目标帧缓冲来阅读......试试这样:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
glReadPixels(0, 0, deviceWidth, deviceHeight, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

或者只是编写简单的着色器并将zbuffer数据渲染到您的FBO中,像

一样
gl_FragColor = vec4(vec3(gl_FragCoord.z), 1.0);

然后从这个FBO中读取颜色信息...