我想知道如何使天空盒看起来像无限远?我知道这与深度有关,但我不知道要禁用或启用的确切内容?
首先,关闭深度写入/测试(如果您首先绘制天空盒并清除深度缓冲区,则无需担心关闭深度测试):
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()
来确保在绘制天空盒后正确设置其他状态(如果需要,请关闭诸如光照或混合等功能)。
在绘制任何物体之前,你应该这样做,以便所有颜色缓冲区写入操作都发生在天空盒上方。
首先,清空缓冲区。
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
接下来,保存当前的模型视图矩阵并加载单位矩阵。
glPushMatrix();
glLoadIdentity();
Skybox.render();
然后,清除深度缓冲并继续常规渲染。
glClear(GL_DEPTH_BUFFER_BIT);
OtherStuff.render();
glutSwapBuffers();
在绘制天空盒时唯一的问题是,你的像素着色器将为天空盒中的每个像素执行。但后面会被世界中其他对象覆盖。你最好的选择是先渲染所有不透明物体,然后再渲染你的天空盒。这样,天空盒的像素着色器仅对通过z缓冲区测试的像素执行。
不存在无限。天空盒只是一个带有纹理的盒子,通常在中心点0,0,0。 这里有一个简短的教程:链接文本