【问题标题】:Generate a depth texture in OpenGL ES 2.0 or 3.0在 OpenGL ES 2.0 或 3.0 中生成深度纹理
【发布时间】:2023-03-20 02:48:01
【问题描述】:

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

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

【问题讨论】:

  • 您尝试从中生成深度纹理的 scene 是什么意思?

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


【解决方案1】:

对于任何后期处理效果,您需要将主场景渲染到 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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-03-29
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      相关资源
      最近更新 更多