我正在学习如何使用以下 resource 中的立方体贴图绘制天空盒.
我已经到了他谈到我们如何优化天空盒渲染的部分。我明白了,而不是先渲染天空盒,这将导致 width*height
您的视口(viewport)片段要计算然后只被其他对象 overdraw ,最好最后绘制它并将其深度值伪造为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。因此,如果您想绘制天空盒,您需要允许天空盒在深度值已清除的区域中绘制。
关于OpenGL优化天空盒渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58695670/