如何使用 OpenGL 和 GLSL 手动填充深度缓冲区
How to fill depth buffer manually using OpenGL and GLSL
我对如何手动填充深度缓冲区做了很多研究,但没有成功。直到这里,我所知道的是附加到 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
结果是一样的!
所以我想知道如何 "tell" OpenGL 不自动写入深度缓冲区并考虑我的深度方程?
我尝试了 glDepthMask(false) 函数,但当然这个解决方案不起作用!
实际上,我想自定义我的深度缓冲区填充,而不依赖于 OpenGL 在后台的操作。
我该怎么做?
唯一的方法是使用颜色缓冲区(如 GL_RGB 纹理格式)手动存储深度值吗?
非常感谢您的帮助!
可以使用 gl_FragDepth
在片段着色器中写入自定义深度值。看这里:https://www.opengl.org/sdk/docs/man/html/gl_FragDepth.xhtml
一些补充说明:
- 所有分支或所有分支都必须分配
gl_FragDepth
否则你会得到未定义的行为
- 使用
gl_FragDepth
会禁用可能的早期 Z 检验,因此通常会降低性能。所以只有在真正需要的时候才使用它
我对如何手动填充深度缓冲区做了很多研究,但没有成功。直到这里,我所知道的是附加到 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
结果是一样的!
所以我想知道如何 "tell" OpenGL 不自动写入深度缓冲区并考虑我的深度方程?
我尝试了 glDepthMask(false) 函数,但当然这个解决方案不起作用!
实际上,我想自定义我的深度缓冲区填充,而不依赖于 OpenGL 在后台的操作。
我该怎么做?
唯一的方法是使用颜色缓冲区(如 GL_RGB 纹理格式)手动存储深度值吗?
非常感谢您的帮助!
可以使用 gl_FragDepth
在片段着色器中写入自定义深度值。看这里:https://www.opengl.org/sdk/docs/man/html/gl_FragDepth.xhtml
一些补充说明:
- 所有分支或所有分支都必须分配
gl_FragDepth
否则你会得到未定义的行为 - 使用
gl_FragDepth
会禁用可能的早期 Z 检验,因此通常会降低性能。所以只有在真正需要的时候才使用它