有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java OpenGL:创建天空盒?

我是OpenGL新手。我在用慢跑

我想为我的世界创造一个天空,我可以用云彩或星星纹理。我不知道最好的方法是什么。我的第一反应是制作一个具有二次方向GLU_INSIDE的大球体,并对其进行纹理处理。有更好的办法吗


共 (3) 个答案

  1. # 1 楼答案

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

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

  2. # 2 楼答案

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

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

  3. # 3 楼答案

    skybox是个不错的选择。你会想用cube map来做这个。基本上,您可以围绕相机渲染一个立方体,并将纹理映射到立方体每个面的内部。我相信OpenGL可能会在其固定函数管道中包含这一点,但如果您采用着色器方法(固定函数无论如何都不推荐),您将希望使用立方体贴图采样器(Cg中的采样器cube,不确定GLSL)。绘制立方体贴图时,您还希望从modelview矩阵中删除平移,但保持旋转(这会导致skybox“跟随”摄影机,但允许您环视天空的不同部分)

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