opengl - 如何使用 OpenGL 和 GLSL 手动填充深度缓冲区

标签 opengl glsl shader fragment-shader depth-buffer

我做了很多关于如何手动填充深度缓冲区但没有成功的研究。直到这里,我所知道的是附加到 FBO 的深度纹理 (GL_DEPTH_COMPONENT) 在渲染过程中由 OpenGL 自动填充。

例如,以下片段着色器代码有效:

/*
** Output pixel color value.
*/
layout (location = 0) out float FragmentDepth;

/*
** Fragment shader entry point.
*/
void main(void)
{
     //Depth filled automatically
}

所以如果我将下面这行代码写到 main 中:

FragmentDepth = 0.0f; //the texture should be black

结果是一样的!

所以我想知道如何“告诉”OpenGL 不要自动写入深度缓冲区并考虑我的深度方程?

我尝试了 glDepthMask(false) 函数,但当然这个解决方案不起作用!

实际上,我想自定义我的深度缓冲区填充,而不依赖于 OpenGL 在后台的操作。

我该怎么做?

唯一的方法是使用颜色缓冲区(如 GL_RGB 纹理格式)手动存储深度值吗?

非常感谢您的帮助!

最佳答案

可以使用 gl_FragDepth 在片段着色器中写入自定义深度值。看这里:https://www.opengl.org/sdk/docs/man/html/gl_FragDepth.xhtml

一些附加说明:

  • 所有分支或所有分支都必须分配 gl_FragDepth 否则你会得到未定义的行为
  • 使用 gl_FragDepth 禁用可能的早期 Z 测试,因此通常会降低性能。所以只有在确实有必要时才使用它

关于opengl - 如何使用 OpenGL 和 GLSL 手动填充深度缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31729762/

相关文章:

glsl - WebGL 是否支持 1D 纹理?

javascript - 在 WebGL 中的两个着色器之间使用相同的统一变量

opengl - 在 GLSL 中对矩阵使用预乘顺序有什么缺点吗?

java - 现代 GLSL 基础知识

C++ SOIL 不加载小图像

three.js - 光照模型的计算在着色器程序中是如何工作的?

c++ - 着色器未按预期工作

c# - 在带有简单着色器的 XNA 4.0 中使 Sprite 变白(alpha 问题)

c++ - 如何在具有透明度的大型广告牌渲染中避免距离排序

c++ - 当我添加 Opengl 转换时,我的图像不断消失