我正在从以下resource中学习如何使用立方体贴图绘制天空盒。
我已经到了他谈到如何优化天空盒渲染的部分。我了解到,与其先渲染天空盒,不如先计算width*height
的视口片段,然后再将其覆盖其他对象,最好最后绘制它,然后将其深度值设为{通过将天空盒顶点着色器的1.0f
分配给gl_Position
,gl_Position = pos.xyww
实质上使每个gl_FragCoord.z
等于1.0f
(由于透视划分)。
现在,当我们得到一个天空盒,其中每个片段的最大深度值为1.0f
时,他将深度函数更改为GL_LEQUAL
而不是GL_LESS
。
在这里我有点困惑。
如果我们最后渲染天空盒并使其深度值等于1.0f
,为什么需要将深度函数更改为GL_LEQUAL
?将其设置为GL_LESS
是不够的,因为如果我们渲染场景中的所有其他对象,则深度值可能会小于1.0f
,因此它将其值写入{{ 1}}的值小于z-buffer
。现在,如果我们将天空盒的深度函数设置为1.0f
,则它将仅传递深度值小于GL_LESS
中实际值的片段,这可能只会传递其他对象不包含的片段覆盖,那么为什么我们需要z-buffer
?
答案 0 :(得分:5)
最初在帧开始时清除帧缓冲区时,您可能将其清除为1.0f。因此,如果您想完全绘制天空盒,则需要允许天空盒绘制深度值已清除的区域。