OpenGL:创建一个天空盒子?

时间:2010-09-24 20:09:24

标签: java opengl graphics jogl

我是OpenGL的新手。我正在使用JOGL。

我想为我的世界创造一个天空,我可以用云或星星来构建。我不确定最好的办法是什么。我的第一直觉是制作一个具有二次方向GLU_INSIDE的非常大的球体,并且具有纹理。还有更好的方法吗?

3 个答案:

答案 0 :(得分:10)

天空盒是一个很好的方式。您需要使用cube map来实现此目的。基本上,您在相机周围渲染一个立方体,并将纹理映射到立方体每个面的内侧。我相信OpenGL可能会在其固定功能管道中包含这个,但是如果您采用着色器方法(无论如何都不推荐使用固定功能),您将需要使用立方体贴图采样器(Cg中的samplerCUBE,不确定GLSL)。绘制立方体贴图时,您还希望从模型视图矩阵中删除平移但保持旋转(这会使天空盒“跟随”相机,但允许您环顾天空的不同部分。)

最好的办法是在绘制所有不透明对象后绘制立方体贴图。这可能看起来很奇怪,因为默认情况下天空会阻挡其他对象,但你使用以下技巧(如果使用着色器)来避免这种情况:在顶点着色器中写入最终输出位置时,不要写出.xyzw,写.xyww 。这将迫使天空飞向远处的飞机,使其落后于一切。这样做的好处是绝对有0次透支!

答案 1 :(得分:5)

制造一个非常大的领域有两个主要问题。首先,您可能会遇到剪裁问题。如果距离你的远距离裁剪距离,天空可能会消失。此外,从远处进入天空盒的物体将在视觉上穿过非常坚固的墙壁。其次,你为了一个非常简单的效果而浪费了很多多边形(以及很多痛苦)。

大多数人实际上使用的是一个小立方体(因此名称为“Sky box”)。您需要在关闭深度测试的预通道中渲染立方体。因此,无论与您的实际距离如何,所有对象都将呈现在多维数据集的顶部。只要确保一边的长度大于近剪裁距离的两倍,你就可以了。

答案 2 :(得分:0)

球体很好处理,因为它们可以轻松避免扭曲,角落等,这在某些情况下可能是可见的。另一种可能性是气缸。

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