【问题标题】:Does a fragment shader only run for visible fragments?片段着色器是否仅针对可见片段运行?
【发布时间】:2019-05-20 10:06:39
【问题描述】:

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

【问题讨论】:

  • 我认为这取决于是否启用了深度测试。

标签: opengl glsl fragment-shader raytracing


【解决方案1】:

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

早期深度测试本身不会拯救你。从前到后渲染每个三角形不会拯救你;在 OpenGL 中不能保证片段是按顺序生成的(仅“好像”按顺序生成)。这忽略了无法正确排序的重叠情况。就 OpenGL 而言,即使在其自己的单独渲染命令中发出每个三角形也保证没有

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    相关资源
    最近更新 更多