如果我使用early_fragment_tests在着色器中丢弃片段,深度缓冲区会发生什么?

问题描述 投票:3回答:2

我正在使用片段着色器,该片段着色器使用discard关键字丢弃一些片段。我的着色器还使用early_fragment_tests(图像存储加载义务)。

EDIT:我不写gl_FragDepth,我让标准OpenGL处理​​深度值。

在执行dispose关键字之前,将使用片段的深度来更新我的深度缓冲区吗?

EDIT:在我的NVidia Quadro 600和K5000上,它[[没有看起来像它。

有什么线索可以找到该信息吗?

仅供参考,我搜索了http://www.opengl.org/registry/specs/ARB/shader_image_load_store.txt。我找到了足够接近的主题,但没有找到特别的主题。
opengl graphics glsl shader fragment-shader
2个回答
4
投票
在执行dispose关键字之前,将使用片段的深度来更新我的深度缓冲区吗?

否,在包含discard或向gl_FragDepth写入任意值的着色器中明确禁止这种行为。这是因为在这样的着色器中,片段着色后的深度可能与初始栅格化(预着色)期间生成的位置无关。

[无需写入gl_FragDepth或丢弃,实际上,在执行实际片段着色器之前很久就知道了片段的深度,这为早期深度测试奠定了基础。如果可以确定对片段着色器进行深度测试,则可以跳过某些(单个平铺区域)或所有图元的光栅化/着色操作,或者可以跳过所有着色器,但是如果片段着色器本身决定片段的深度,然后所有的赌注都关闭。

在DX11 / OpenGL 4.x中,此规则有一个例外。如果以确保输出深度将始终保留深度测试结果(与光栅化期间生成的深度相同的结果)的方式编写着色器,则可以在使用discard的着色器中启用早期片段测试或写入gl_FragDepth。此功能称为conservative depth,除非您使用此功能,否则通常认为discard将全面破坏早期的深度优化。

现在,由于您在知道所写入的值是通过还是未通过深度测试(gl_FragDepth可能不同)或片段是否仍然存在(可以使用discard)之前,永远不要写入深度缓冲区。 ,您可以看到为什么由包含discard的片段着色器着色的图元在评估着色器之前无法写入深度缓冲区。

我认为您正在寻找的信息在该页面上:


1
投票
如果启用了早期碎片测试,则由片段着色器无效。此外,深度缓冲,模板缓冲区,甚至可以更新遮挡查询样本数片段着色器后将丢弃的片段或样本由于每个片段操作(例如Alpha至覆盖或alpha测试。
© www.soinside.com 2019 - 2024. All rights reserved.