OpenGL - 如何访问深度缓冲区值? - 或 : gl_FragCoord. z 与纹理渲染深度

标签 opengl glsl shader fragment-shader

我想访问像素着色器中当前处理的像素处的深度缓冲区值。

我们怎样才能实现这个目标?基本上,似乎有两个选择:

  1. 渲染纹理的深度。我们怎样才能做到这一点以及权衡是什么?
  2. 使用 gl_FragCoord.z 提供的值 - 但是:这是正确的值吗?

最佳答案

关于问题1:你不能直接从片段着色器中的深度缓冲区读取(除非有我不熟悉的最新扩展)。您需要渲染到帧缓冲区对象 (FBO)。典型步骤:

  1. 创建并绑定(bind) FBO。查找类似 glGenFramebuffers 的调用和glBindFramebuffer如果您以前没有使用过 FBO。
  2. 创建一个纹理或渲染缓冲区用作颜色缓冲区,并将其附加到 GL_COLOR_ATTACHMENT0您的 FBO 的附着点为 glFramebufferTexture2DglFramebufferRenderbuffer 。如果您只关心此渲染 channel 的深度,则可以跳过此步骤并在没有颜色缓冲区的情况下进行渲染。
  3. 创建深度纹理,并将其附加到 GL_DEPTH_ATTACHMENT FBO 的附着点。
  4. 进行渲染以创建您想要使用的深度。
  5. 使用glBindFramebuffer切换回默认帧缓冲区。
  6. 将深度纹理绑定(bind)到片段着色器使用的采样器。
  7. 您的片段着色器现在可以从深度纹理中进行采样。

关于问题2:gl_FragCoord.z是着色器正在操作的片段的深度值,不是片段位置处深度缓冲区的当前值。

关于OpenGL - 如何访问深度缓冲区值? - 或 : gl_FragCoord. z 与纹理渲染深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23362076/

相关文章:

c++ - 使用 OpenGL 使用 C++ 制作 3D 橱柜图像

opengl - 如何创建透视投影矩阵,给定焦点和相机主中心

c++ - GLSL - 何时何地调用顶点和片段?

c++ - 如何使用 Arnold API 实现兰伯特着色器?

opengl - 将实时网络摄像头纹理添加到 OpenGL

java - 在带有着色器的 opengl es 中围绕自身旋转矩形

c++ - 在 OpenGl 中旋转一个正方形

c++ - 如何在每个角上绘制一个带有自己纹理的三角形?

opengl - 如何在 GLSL 中创建纬度(水平)等高线?

c++ - 手动计算gl_FragCoord