『天幕』其是就在一个大立方体的内侧贴上图像,从而绘画出远景地屏线效果,用于增加远景真实感有效而简单的方法,天幕的中心位于『相机』当前位置,所以当『相机』移动时『天幕』的中心点也同时移动.
演示程式:下载
- 按『左/右』键观察『前、后、左、右』的效果
- 按『上/下』键观察『天、地』的效果
『天幕』的算法
- 准备六张照片分别为『天、地、前、后、左、右』并载入『记忆体』
- 绘画一个大『正方体』由六个四边形组成
- 在『正方体』的内则贴上图像
- 『天幕』中心点与『相机』位置同步移动
渲染天幕C代码
void Render_SKYBOX(SKYBOX_PTR skybox,float xPos,float yPos,float zPos)
{
glPushMatrix();// 当前矩阵堆栈压栈
glTranslatef(xPos, yPos, zPos);// 移动相机位置
glPushAttrib(GL_FOG_BIT | GL_DEPTH_BUFFER_BIT | GL_LIGHTING_BIT);// 压入当前属性
glDisable(GL_DEPTH_TEST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);// 设定纹理复盖模式为”重复纹理”
// 面紋理座標和頂點座標
// 天
glBindTexture(GL_TEXTURE_2D, skybox->texture[SKY_TOP].ID);// 绑定纹理
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-skybox->size, skybox->size, -skybox->size);
glTexCoord2f(0.0f, 1.0f); glVertex3f(skybox->size, skybox->size, -skybox->size);
glTexCoord2f(0.0f, 0.0f); glVertex3f(skybox->size, skybox->size, skybox->size);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-skybox->size, skybox->size, skybox->size);
glEnd();
// 地
glBindTexture(GL_TEXTURE_2D, skybox->texture[SKY_BOTTOM].ID);
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 1.0f); glVertex3f(skybox->size, -skybox->size, -skybox->size);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-skybox->size, -skybox->size, -skybox->size);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-skybox->size, -skybox->size, skybox->size);
glTexCoord2f(1.0f, 0.0f); glVertex3f(skybox->size, -skybox->size, skybox->size);
glEnd();
// 前
glBindTexture(GL_TEXTURE_2D, skybox->texture[SKY_FRONT].ID);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-skybox->size, -skybox->size, -skybox->size);
glTexCoord2f(1.0f, 0.0f); glVertex3f(skybox->size, -skybox->size, -skybox->size);
glTexCoord2f(1.0f, 1.0f); glVertex3f(skybox->size, skybox->size, -skybox->size);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-skybox->size, skybox->size, -skybox->size);
glEnd();
// 后
glBindTexture(GL_TEXTURE_2D, skybox->texture[SKY_BACK].ID);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(skybox->size, -skybox->size, skybox->size);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-skybox->size, -skybox->size, skybox->size);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-skybox->size, skybox->size, skybox->size);
glTexCoord2f(0.0f, 1.0f); glVertex3f(skybox->size, skybox->size, skybox->size);
glEnd();
// 右
glBindTexture(GL_TEXTURE_2D, skybox->texture[SKY_RIGHT].ID);
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 0.0f); glVertex3f(skybox->size, -skybox->size, skybox->size);
glTexCoord2f(1.0f, 1.0f); glVertex3f(skybox->size, skybox->size, skybox->size);
glTexCoord2f(0.0f, 1.0f); glVertex3f(skybox->size, skybox->size, -skybox->size);
glTexCoord2f(0.0f, 0.0f); glVertex3f(skybox->size, -skybox->size, -skybox->size);
glEnd();
// 左
glBindTexture(GL_TEXTURE_2D, skybox->texture[SKY_LEFT].ID);
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-skybox->size, -skybox->size, -skybox->size);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-skybox->size, skybox->size, -skybox->size);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-skybox->size, skybox->size, skybox->size);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-skybox->size, -skybox->size, skybox->size);
glEnd();
glPopAttrib();// 弹出当前属性
glEndList();
glPopMatrix();// 当前矩阵堆栈出栈
}