c - 在 OpenGL ES 2.0 中,当将 FBO 与纹理深度缓冲区一起使用时,深度纹理缓冲区不起作用

标签 c opengl-es render-to-texture

目前我正在开发一个项目,首先将应用程序渲染到帧缓冲区对象 (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 );
}

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

最佳答案

我终于解决了。最终原因是缺少从客户端应用程序启用的 GL_DEPTH_TEST

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

感谢所有的建议和回答。

关于c - 在 OpenGL ES 2.0 中,当将 FBO 与纹理深度缓冲区一起使用时,深度纹理缓冲区不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30893021/

相关文章:

opengl-es - 跨步在OpenGL | ES中是什么意思

iphone - 像素空间中的 OpenGL 纹理坐标

textures - 从多个纹理创建新纹理 SDL-2

c - MiniFMOD编译

c - 是否有 sscanf 的变体,它带有指向输入字符串而不是缓冲区的指针?

java - LibGDX : Rendering a TextureRegion renders whole texture

opengl - 在两个应用程序之间共享 OpenGL 帧缓冲区/渲染缓冲区

c++ - 将渲染目标数据复制到 D3DPOOL_MANAGED?

c++ - Linux 应用程序中的架构建议

c - IAR EWARM PC-LINT 禁止来自包含 -header 选项的 header 的消息