OpenGL早期深度测试不起作用。

4
这是我的片元着色器代码:
#version 420 core
#extension GL_ARB_explicit_uniform_location : enable
#extension GL_ARB_shader_storage_buffer_object : require
layout(early_fragment_tests) in;
layout(binding = 4, offset = 0) uniform atomic_uint num_fragments;
// ...
void main(void)
{
    atomicCounterIncrement(num_fragments);
    frag_color = vec4(1.0, 0.0, 0.0, 0.0);

    atomicAdd(...);
}

我的三角形完全覆盖了屏幕。预期行为是num_fragments等于像素数(640*480 = 307200),对于单层三角形来说确实如此。然而,当我在现有三角形后面添加一个三角形时,num_fragments变成了更高的值,就好像片段着色器正在执行被遮挡的三角形。
为什么会这样呢?我认为early_fragment_tests指令应该可以防止这种行为。这不仅仅是一种优化,因为着色器中有原子存储,应该只运行未被遮挡的像素。

你是否遇到了这些限制中的任何一个? - Andrew Williamson
@Joel:你检查过深度测试是否已启用,并且深度缓冲区是否存在了吗? - derhass
1个回答

6
我的三角形完全覆盖了屏幕。预期的行为是num_fragments等于像素数(640*480 = 307200),对于一个三角形层,它确实如此。
不,这不是预期的行为。
早期深度测试并不是“魔法”。它们不能保证随机组合的三角形具有零重叠。它们只是强制片段测试在执行片段着色器之前进行。这样做只是确保测试已通过或失败。因此,片段着色器仅对已通过的片段执行。
重叠与早期深度测试无关。重叠涉及你渲染的三角形的顺序。如果按照从前到后的顺序进行排序,则会得到零重叠。如果按照从后向前的顺序排序,则会得到最大可能的重叠。
这发生在片段测试是否发生在片段着色器之前无关的情况下。
这不仅仅是一种优化,因为着色器中有原子存储应仅为未遮挡的像素运行。
唯一的方法是进行仅深度的预通道。必须将场景呈现到深度缓冲区(没有片段着色器)。然后,当您真正呈现场景时,仅通过深度测试的片段将是可见的片段。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接