【发布时间】:2020-02-29 21:38:45
【问题描述】:
我正在学习如何使用来自以下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吗?
【问题讨论】:
-
我认为这是一个糟糕的教程,使用立方体几何和 VAO 对于屏幕空间效果来说是一种极端的过度杀伤力,例如参见 webglfundamentals.org/webgl/lessons/webgl-skybox.html。此外,首先绘制天空盒而不是最后绘制允许您跳过帧缓冲区的颜色和深度清除,我会在将这两个选项之一称为性能改进之前对其进行大量分析。
标签: opengl skybox zbuffer depth-testing