【发布时间】:2010-09-24 20:09:23
【问题描述】:
我是 OpenGL 新手。我正在使用 JOGL。
我想为我的世界创造一个天空,我可以用云或星星来制作纹理。我不确定最好的方法是什么。我的第一直觉是制作一个具有二次方方向GLU_INSIDE 和纹理的非常大的球体。有没有更好的办法?
【问题讨论】:
-
这里有一个jogl cube map sample
我是 OpenGL 新手。我正在使用 JOGL。
我想为我的世界创造一个天空,我可以用云或星星来制作纹理。我不确定最好的方法是什么。我的第一直觉是制作一个具有二次方方向GLU_INSIDE 和纹理的非常大的球体。有没有更好的办法?
【问题讨论】:
天空盒是一个不错的选择。您需要为此使用cube map。基本上,您在相机周围渲染一个立方体并将纹理映射到立方体的每个面的内部。我相信 OpenGL 可能会将其包含在其固定功能管道中,但如果您采用着色器方法(无论如何不推荐使用固定功能),您将需要使用立方体贴图采样器(Cg 中的 samplerCUBE,不确定 GLSL)。在绘制立方体贴图时,您还希望从模型视图矩阵中移除平移但保持旋转(这会导致天空盒“跟随”相机但允许您环顾天空的不同部分)。
最好的办法是在绘制所有不透明对象之后实际绘制立方体贴图。这可能看起来很奇怪,因为默认情况下天空会阻挡其他物体,但您使用以下技巧(如果使用着色器)来避免这种情况:在顶点着色器中写入最终输出位置时,而不是写出 .xyzw,而是写出 .xyww .这将迫使天空到远处的平面,使其落后于一切。这样做的好处是绝对0透支!
【讨论】:
是的。
制作一个非常大的球体有两个主要问题。首先,您可能会遇到剪辑问题。如果天空超出您的剪裁距离,天空可能会消失。此外,从远处进入天空盒的物体在视觉上会穿过一堵非常坚固的墙。其次,为了一个非常简单的效果,你浪费了很多多边形(和很多痛苦)。
大多数人实际上使用一个小立方体(因此得名“天空盒”)。您需要在关闭深度测试的情况下在 pre-pass 中渲染立方体。因此,无论它们与您的实际距离如何,所有对象都将呈现在立方体顶部。只要确保边的长度大于您的近剪裁距离的两倍,就可以了。
【讨论】:
球体很好处理,因为它们很容易避免在某些情况下可能会出现的扭曲、拐角等。另一种可能是圆柱体。
对于真正高质量的天空,您可以进行天空照明模拟,根据时间(=> 太阳位置!)和方向设置球体颜色,并在天空球体和视图位置之间添加一些云作为 3D 对象.
【讨论】: