片段着色器是否仅 运行 用于可见片段?

Does a fragment shader only run for visible fragments?

我们需要在 OpenGL 中编写光线追踪器。现在,我决定为每个片段着色器调用发射一条光线,因为据我所知,片段是一个可以由几何对象写入的屏幕像素。所以我想知道片段着色器是否只会 运行 用于可见像素或所有像素。如果只有 运行s 用于可见的,则可以假定主光线(从屏幕到物体)没有被阻挡。这样可以省去很多计算。

绝对不能保证片段着色器的执行意味着片段一定是可见的。

早期的深度测试本身救不了你。渲染每个三角形 front-to-back 不会救你;在 OpenGL 中不能保证片段是按顺序生成的(只有 "as if" 按顺序生成)。这忽略了不可能有正确排序的重叠情况。就 OpenGL 而言,即使在其自己单独的渲染命令中发出每个三角形也保证

要确保这一点,您唯一可以做的就是执行深度 pre-pass。也就是说,渲染整个场景,但不激活片段着色器(并关闭对帧缓冲区的颜色写入)。这会将所有深度数据写入深度缓冲区。这样,如果您使用早期深度测试,当您再次渲染场景时,唯一通过深度测试的片段将是那些可见的片段。

深度 pre-passes 可以非常快,具体取决于您的顶点着色器和渲染管道的其他方面。