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