我正在使用片段着色器,该片段着色器使用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。我找到了足够接近的主题,但没有找到特别的主题。在执行dispose关键字之前,将使用片段的深度来更新我的深度缓冲区吗?
否,在包含discard
或向gl_FragDepth
写入任意值的着色器中明确禁止这种行为。这是因为在这样的着色器中,片段着色后的深度可能与初始栅格化(预着色)期间生成的位置无关。
[无需写入gl_FragDepth
或丢弃,实际上,在执行实际片段着色器之前很久就知道了片段的深度,这为早期深度测试奠定了基础。如果可以确定对片段着色器进行深度测试,则可以跳过某些(单个平铺区域)或所有图元的光栅化/着色操作,或者可以跳过所有着色器,但是如果片段着色器本身决定片段的深度,然后所有的赌注都关闭。
在DX11 / OpenGL 4.x中,此规则有一个例外。如果以确保输出深度将始终保留深度测试结果(与光栅化期间生成的深度相同的结果)的方式编写着色器,则可以在使用discard
的着色器中启用早期片段测试或写入gl_FragDepth
。此功能称为conservative depth,除非您使用此功能,否则通常认为discard
将全面破坏早期的深度优化。
gl_FragDepth
可能不同)或片段是否仍然存在(可以使用discard
)之前,永远不要写入深度缓冲区。 ,您可以看到为什么由包含discard
的片段着色器着色的图元在评估着色器之前无法写入深度缓冲区。 我认为您正在寻找的信息在该页面上: