代码之家  ›  专栏  ›  技术社区  ›  Nick Heiner

创建一个天空盒子?

  •  5
  • Nick Heiner  · 技术社区  · 14 年前

    我刚接触OpenGL。我在慢跑。

    我想为我的世界创造一个天空,我可以用云或星星来织构它。我不知道最好的方法是什么。我的第一直觉是做一个二次定向的大球体 GLU_INSIDE 和纹理。有更好的方法吗?

    3 回复  |  直到 14 年前
        1
  •  5
  •   Andres    14 年前

    对.

    制造一个真正大的球体有两个主要问题。首先,可能会遇到剪辑问题。如果超出你的远距离,天空可能会消失。此外,从远处进入天空盒的对象将从视觉上穿过一堵非常坚固的墙。第二,为了一个非常简单的效果,你浪费了很多多边形(和很多痛苦)。

    大多数人实际上使用一个小立方体(因此得名“天空盒子”)。在深度测试关闭的情况下,需要在预过程中渲染立方体。因此,所有对象都将在立方体顶部渲染,而不管它们与您的实际距离如何。只要确保边的长度大于近剪裁距离的两倍,就可以了。

        2
  •  10
  •   Gumgo    14 年前

    跳伞是个不错的选择。您将要使用 cube map 为了这个。基本上,在相机周围渲染一个立方体,并将纹理映射到立方体的每个面内部。我相信OpenGL可能会在它的固定函数管道中包含这一点,但是如果您采用着色方法(固定函数无论如何都被弃用),您将希望使用多维数据集映射取样器(CG中的samplerCube,不确定GLSL)。绘制立方体地图时,您还希望从模型视图矩阵中删除平移,但保持旋转(这会导致SkyBox“跟随”相机,但允许您环顾天空的不同部分)。

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

        3
  •  0
  •   Trantor    7 年前

    球体是很好的处理,因为它们很容易避免变形,角落等,这可能是在某些情况下可见的。另一种可能性是圆柱。

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