在使用具有纹理深度缓冲区的FBO时,OpenGL ES 2.0深度纹理缓冲区不起作用

时间:2015-06-17 13:26:22

标签: c opengl-es render-to-texture

目前,我正在开发一个项目,首先将应用程序渲染到Framebuffer Object(FBO),然后使用OpenGL ES 2.0中的FBO颜色和深度纹理附件渲染应用程序。

现在使用颜色缓冲区可以很好地渲染多个应用程序。当我尝试使用深度纹理缓冲区的深度信息时,它似乎无法正常工作。

我尝试通过使用纹理坐标对其进行采样来渲染深度纹理,它全部为白色。人们说灰度可能略有不同,即使在阴影部分它也接近1.0。所以我将片段着色器修改为如下:

    vec4 depth;
    depth = texture2D(s_depth0, v_texCoord);

    if(depth.r == 1.0)
        gl_FragColor = vec4(1.0,0.0,0.0,1.0);

毫不奇怪,它全是红色。

申请代码:

void Draw ( ESContext *esContext )
{
UserData *userData = esContext->userData;

// Clear the color buffer
glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// Draw a triangle
GLfloat vVertices[] = {  0.0f,  0.5f, 0.5f, 
                       -0.5f, -0.5f,-0.5f,
                        0.5f, -0.5f,-0.5f };

// Set the viewport
glViewport ( 0, 0, esContext->width, esContext->height );

// Use the program object
glUseProgram ( userData->programObject );

// Load the vertex position
glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 0, vVertices );

glEnableVertexAttribArray ( 0 );

glDrawArrays ( GL_TRIANGLES, 0, 3 ); 

eglSwapBuffers ( esContext->eglDisplay, esContext->eglSurface );
}

那么,如果颜色缓冲区工作正常,而深度缓冲区不起作用,会出现什么问题呢?

2 个答案:

答案 0 :(得分:1)

我终于解决了。这个原因最终导致客户端应用程序缺少GL_DEPTH_TEST

因此,如果您遇到同样的问题,请务必在OpenGL ES初始化期间通过调用GL_DEPTH_TEST来启用glEnable(GL_DEPTH_TEST);。默认情况下,我认为它是为了性能而禁用的。

感谢所有建议和答案。

答案 1 :(得分:0)

深度纹理需要线性化才能在视口中看到,因为它以指数形式保存。在片段中尝试这个:

uniform float farClip, nearClip;

float depth = texture2D(s_depth0, v_texCoord).x;
float depthLinear = (2 * nearClip) / (farClip + nearClip - depth * (farClip - nearClip));