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 的值。所以如果你想绘制天空盒,你需要允许天空盒在具有清除深度值的区域中绘制。
我正在学习如何使用立方体贴图绘制天空盒 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 的值。所以如果你想绘制天空盒,你需要允许天空盒在具有清除深度值的区域中绘制。