OpenGL:我如何将天空盒放在无限远中

时间:2010-05-18 17:56:34

标签: opengl

我需要知道怎样才能让天空盒出现在无穷远处? 我知道这与深度有关,但我不知道要禁用或启用的确切内容??

5 个答案:

答案 0 :(得分:11)

首先,关闭深度写入/测试(如果先绘制天空盒并清除深度缓冲区,则无需关闭深度测试):

glDisable(GL_DEPTH_TEST);
glDepthMask(false);

然后,将相机移动到原点并将其旋转为模型视图矩阵的反转:

// assume we're working with the modelview
glPushMatrix();

// inverseModelView is a 4x4 matrix with no translation and a transposed 
// upper 3x3 portion from the regular modelview
glLoadMatrix(&inverseModelView);

现在,画出你的天空盒并重新打开深度回写:

DrawSkybox();

glPopMatrix();
glDepthMask(true);
glEnable(GL_DEPTH_TEST);

您可能希望使用glPush/PopAttrib()来确保在绘制天空盒后正确设置其他状态(确保在必要时关闭照明或混合等内容)。

您应该在绘制任何内容之前执行此操作,以便所有颜色缓冲区写入发生在您的天空框之上。

答案 1 :(得分:3)

首先,清除缓冲区。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

然后,保存当前的模型视图矩阵并加载标识。

glPushMatrix();
glLoadIdentity();

然后渲染你的天空盒。

Skybox.render();

然后,清除深度缓冲区并继续正常渲染

glClear(GL_DEPTH_BUFFER_BIT);

OtherStuff.render();

glutSwapBuffers();

答案 2 :(得分:2)

绘制天空盒的唯一问题首先是你的像素着色器将对天空盒中的每个像素执行。只是被你的世界中的其他物体覆盖。最好的办法是首先渲染所有不透明物体,然后渲染你的天空盒子。这样,只有通过z缓冲区测试的像素才能执行天空盒的像素着色器。

答案 3 :(得分:1)

没有无穷大。天空盒只是一个带纹理的盒子,中间是正常的0,0,0。 这是一个简短的啧啧:link text

答案 4 :(得分:0)

我能想到的最好的方法是在第一遍(或图层)上绘制它,然后只清除深度缓冲区。之后,只需在另一个传球中绘制剩下的场景。这样,天空盒将始终保持在场景“后面”。只记得两次通过使用相同的相机,并以某种方式将天空盒拍摄到相机。