【问题标题】:How to fill depth buffer manually using OpenGL and GLSL如何使用 OpenGL 和 GLSL 手动填充深度缓冲区
【发布时间】:2015-07-30 16:56:14
【问题描述】:

我对如何手动填充深度缓冲区进行了大量研究但没有成功。在此之前,我只知道附加到 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
}

所以如果我将以下代码行写入主代码:

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

结果是一样的!

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

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

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

我该怎么做?

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

非常感谢您的帮助!

【问题讨论】:

标签: opengl glsl shader fragment-shader depth-buffer


【解决方案1】:

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

一些补充说明:

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

【讨论】:

    猜你喜欢
    • 2015-10-22
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多