片段着色器仅针对可见片段运行吗?

时间:2019-05-18 14:41:56

标签: opengl glsl fragment-shader raytracing

我们需要在OpenGL中编写一个raytracer。现在,我决定为每个片段着色器调用拍摄射线,因为据我所知,片段是可以由几何对象写入的屏幕像素。所以我想知道片段着色器是只对可见像素还是对所有像素运行。如果只对可见光运行,则可以认为主光线(从屏幕到物体)没有被遮挡。这样可以节省很多计算。

1 个答案:

答案 0 :(得分:2)

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

深度测试本身并不能拯救您。前后渲染每个三角形不会节省您的时间;在OpenGL中,不能保证片段是按顺序生成的(只能按顺序“好像”生成)。这就忽略了不可能有正确顺序的重叠情况。就OpenGL而言,甚至用自己独立的渲染命令发布每个三角形都不会保证没有

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

深度预传递可能非常快,具体取决于顶点着色器和渲染管线的其他方面。