目前,我正在开发一个项目,首先将应用程序渲染到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 );
}
那么,如果颜色缓冲区工作正常,而深度缓冲区不起作用,会出现什么问题呢?
答案 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));