在OpenGL ES 2.0或3.0中生成深度纹理

时间:2015-01-14 19:32:41

标签: android opengl-es-2.0 opengl-3 opengl-es-3.0

我有一个场景,我在Android中使用OpenGL ES进行渲染(使用Java库)。我想在场景中应用景深等景点效果。我发现了一个很好的散景着色器,它需要一个深度纹理来完成这项工作。我需要的是生成一个深度纹理以传递到着色器。我一直在网上闲逛一天半,试图解决这个问题,而且似乎无法找到如何从现有场景生成深度纹理的好例子。似乎我需要做几次传递,可能使用屏幕外渲染到帧缓冲区,然后从中生成深度纹理以传递到我的散景着色器以实际渲染场景。

如何生成深度纹理?一个好的工作实例将非常感激。

2 个答案:

答案 0 :(得分:2)

对于任何后期处理效果,您需要将主场景渲染为FBO,以便在后续渲染中使用颜色和深度附件数据。

渲染到深度纹理非常容易。您只需将深度纹理绑定到FBO目标,例如

glGenFramebuffers(1, &m_fbo);
glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_depth_texture, 0);

PowerVR SDK的RenderToTexture和ShadowMapping演示应该包含您需要的所有参考代码:

https://github.com/powervr-graphics/Native_SDK/blob/3.4/Examples/Intermediate/RenderToTexture/OGLES2/OGLES2RenderToTexture.cpp https://github.com/powervr-graphics/Native_SDK/blob/3.4/Examples/Intermediate/ShadowMapping/OGLES2/OGLES2ShadowMapping.cpp

答案 1 :(得分:0)

您可以使用gl_FragCoord从片段着色器内部访问每像素深度值。编写一个片段着色器,将深度写入gl_FragColor,如下所示:

gl_FragColor = vec4(gl_FragCoord.z, 0.0, 0.0, 1.0);

使用此片段着色器将场景渲染为纹理,您最终会得到深度贴图。