我们需要用OpenGL写一个射线追踪器。现在,我决定为每个片段着色器调用拍摄一条射线,因为据我所知,片段是一个可以被几何对象写入的屏幕像素。所以我想知道片段着色器是只对可见像素运行还是对所有像素运行。如果它只对可见光运行,那么主光线(从一个屏幕到另一个物体)就不会被阻挡。这样就省去了很多计算。
发布于 2019-05-18 15:31:25
绝对不能保证片段着色器的执行意味着片段一定是可见的。
早期深度测试本身并不能拯救你。呈现每个三角形前后都不会拯救您;在OpenGL中无法保证按顺序生成片段(只按顺序“似乎”)。这就忽略了重叠的情况,在这种情况下,不可能有适当的排序。即使在自己单独的呈现命令中发出每个三角形,对于OpenGL来说也不能保证什么。
要确保这一点,唯一能做的就是执行深度预过。也就是说,渲染您的整个场景,但没有片段着色器活动(并关闭写到帧缓冲区的颜色)。这将将所有深度数据写入深度缓冲区。这样,如果您使用早期深度测试,当您再次呈现场景时,唯一通过深度测试的片段将是那些可见的片段。
深度预过可以相当快,取决于你的顶点着色器和渲染管道的其他方面。
https://stackoverflow.com/questions/56199983
复制相似问题