1

我有一个在 Android 中使用 OpenGL ES 渲染的场景(使用 Java 库)。我想在场景中应用一些效果,例如景深。我找到了一个不错的散景着色器,它需要深度纹理来完成这项工作。那么我需要的是生成一个深度纹理以传递给着色器。我已经在互联网上搜索了一天半,试图弄清楚这一点,但似乎找不到一个很好的例子来说明如何从现有场景中生成深度纹理。看来我需要做几遍,可能使用屏幕外渲染到帧缓冲区,然后从中生成深度纹理以传递给我的散景着色器以实际渲染场景。

如何生成深度纹理?一个很好的工作示例将不胜感激。

4

2 回答 2

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

于 2015-01-18T01:13:27.303 回答
1

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

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

使用这个片段着色器将你的场景渲染到一个纹理,你最终会得到一个深度图。

于 2015-01-15T04:27:58.363 回答