OpenGL优化天空盒渲染

标签 opengl skybox zbuffer depth-testing

我正在学习如何使用以下 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/

相关文章:

c++ - 尝试使用 C++ 将着色器应用于 OpenGL 中的顶点数组的问题

unreal-engine4 - 在UE4中设置天空球体为亮白色

java - Skybox 是全黑的

cocos2d-iphone - 使用 cocos2d-iphone 启用 2D 投影的充分理由是什么?

matlab - 在 Matlab 中使用 OpenGL 获取深度缓冲区

c++ - 带有 GLUT 的 OpenGL - 黑屏

c++ - 在保持纵横比的 openGL 中调整圆圈的大小

c++ - Z-Buffer 的奇怪行为

c++ - 有人试过使用 glMultiDrawArraysIndirect 吗?编译器找不到函数

unity-game-engine - 为什么我添加 urp 包后我的天空盒就消失了?