OpenGL:如何创建天空盒?

6

我对OpenGL很陌生。我正在使用JOGL。

我想为我的世界创建一个天空,可以用云或星星纹理。我不确定最好的方法是什么。我的第一反应是制作一个非常大的球体,使用四面体方向GLU_INSIDE,并给它贴上纹理。有更好的方法吗?


1
这里有一个jogl立方体贴图示例 - elect
3个回答

11
一个天空盒是一个不错的选择。你需要使用立方体贴图来实现。基本上,你会在相机周围渲染一个立方体,并将纹理映射到立方体每个面的内部。我相信OpenGL可能已经在其固定功能管线中包含了这一点,但如果你采用着色器方法(固定函数已经过时了),你需要使用立方体贴图采样器(在Cg中为samplerCUBE,在GLSL中则不确定)。绘制立方体贴图时,你还需要从模型视图矩阵中删除平移,但保留旋转(这会使天空盒“跟随”相机,但允许你在天空的不同部分观察)。
最好的方法是在绘制所有不透明对象之后实际绘制立方体贴图。这可能看起来很奇怪,因为默认情况下天空会挡住其他物体,但是你可以使用以下技巧(如果使用着色器)来避免这种情况:在顶点着色器中写入最终输出位置时,不要写出.xyzw,而是写出.xyww。这将强制将天空放置在远平面上,从而使其位于所有物体的后面。这样做的优点是完全没有重叠!

+1 - 对于超绘的观点很好。总的来说,这个答案比我的更完整。 - Andres

5

可以。

创建一个非常大的球体存在两个主要问题。首先,您可能会遇到剪切问题。如果天空在您的远裁剪距离之外,则可能会消失。此外,从远处进入您的天空盒的对象将在一个非常坚固的墙壁上视觉上穿过。其次,您正在为一个非常简单的效果浪费大量的多边形(以及大量的痛苦)。

事实上,大多数人使用一个小立方体(因此称为“天空盒”)。您需要在预处理中渲染该立方体,并关闭深度测试。因此,所有对象都将在该立方体的顶部呈现,而不管它们与您的实际距离如何。只需确保一侧的长度大于两倍的近裁剪距离即可。


0

球体很容易处理,因为它们可以轻松避免在某些情况下可能出现的扭曲、角落等问题。另一个选择是圆柱体。

要获得高质量的天空效果,您可以进行天空照明模拟,根据时间(=>太阳位置!)和方向设置球体颜色,并在天空球和视图位置之间添加一些云朵作为3D对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接