优化OpenGL天空盒渲染

4
我正在学习如何使用立方体贴图绘制天空盒,参考资料resource
我已经了解了如何优化渲染天空盒的部分。我明白了,与其先渲染天空盒,导致视口中的width*height片段被计算,然后再被其他对象覆盖,最好将其放在最后绘制,并将其深度值伪造为1.0f,通过将天空盒顶点着色器的gl_Position赋值为gl_Position = pos.xyww,从而使每个gl_FragCoord.z由于透视除法而等于1.0f
现在,在我们得到每个片段最大深度值为1.0f的天空盒之后,他将深度函数从GL_LESS更改为GL_LEQUAL
这里我有点困惑。 如果我们最后渲染天空盒,并且其深度值等于1.0f,为什么需要将深度函数改为GL_LEQUAL?如果我们在场景中渲染其他对象的深度值可能会小于1.0f,因此将其设置为GL_LESS是否就足够了呢?现在,如果我们将天空盒的深度函数设置为GL_LESS,它只会通过深度值小于实际在z-buffer中的值的片段,这可能只通过其他对象没有覆盖的片段,那么我们为什么需要GL_LEQUAL呢?

我认为这是一个不好的教程,使用立方体几何和VAO对于屏幕空间效果来说是极度浪费的。例如,可以参考https://webglfundamentals.org/webgl/lessons/webgl-skybox.html。此外,首先绘制天空盒而不是最后一步可以跳过帧缓冲区的颜色和深度清除,我会在调用两个选项中的一个性能改进之前进行大量测试。 - mOfl
1个回答

5

当您在帧的开始时首次清除帧缓冲区时,您很可能将其清除为1.0f。因此,如果您想绘制天空盒,则需要允许天空盒在已清除深度值的区域中进行绘制。


哦,我明白了,如果它是GL_LESS,那么它就不足以通过测试。 所以,如果我将天空盒的深度值设置为0.999f,使用GL_LESS应该是可以的吧? - Jorayen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接