【问题标题】:Does a fragment shader only run for visible fragments?片段着色器是否仅针对可见片段运行?
【发布时间】:2019-05-20 10:06:39
【问题描述】:
我们需要在 OpenGL 中编写一个光线追踪器。现在,我决定为每个片段着色器调用拍摄一条射线,因为据我所知,片段是可以由几何对象写入的屏幕像素。所以我想知道片段着色器是否只针对可见像素或所有像素运行。如果它只针对可见光运行,则假定主光线(从屏幕到对象)没有被阻挡。这将节省大量计算。
【问题讨论】:
标签:
opengl
glsl
fragment-shader
raytracing
【解决方案1】:
绝对不能保证片段着色器的执行意味着片段肯定是可见的。
早期深度测试本身不会拯救你。从前到后渲染每个三角形不会拯救你;在 OpenGL 中不能保证片段是按顺序生成的(仅“好像”按顺序生成)。这忽略了无法正确排序的重叠情况。就 OpenGL 而言,即使在其自己的单独渲染命令中发出每个三角形也保证没有。
要确保这一点,您唯一能做的就是执行深度预传递。也就是说,渲染整个场景,但没有激活片段着色器(并关闭对帧缓冲区的颜色写入)。这会将所有深度数据写入深度缓冲区。这样,如果您使用早期深度测试,当您再次渲染场景时,唯一通过深度测试的片段将是可见的片段。
深度预传递可能非常快,具体取决于您的顶点着色器和渲染管道的其他方面。