OpenGL 优化天空盒渲染

OpenGL optimizing skybox rendering

我正在学习如何使用立方体贴图绘制天空盒 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,因此它会将其值写入 z-buffer 小于 1.0f 的值。现在,如果我们将天空盒的深度函数设置为 GL_LESS,它将只传递深度值小于 z-buffer 中实际深度值的片段,这可能只会传递其他对象不传递的片段覆盖,那么为什么我们需要 GL_LEQUAL?

当您最初在帧的开头清除帧缓冲区时,您可能会这样做到 1.0f 的值。所以如果你想绘制天空盒,你需要允许天空盒在具有清除深度值的区域中绘制。