OpenGL之天幕

OpenGL之天幕

『天幕』其是就在一个大立方体的内侧贴上图像,从而绘画出远景地屏线效果,用于增加远景真实感有效而简单的方法,天幕的中心位于『相机』当前位置,所以当『相机』移动时『天幕』的中心点也同时移动.

演示程式:下载

  1. 按『左/右』键观察『前、后、左、右』的效果
  2. 按『上/下』键观察『天、地』的效果

『天幕』的算法

  1. 准备六张照片分别为『天、地、前、后、左、右』并载入『记忆体』
  2. 绘画一个大『正方体』由六个四边形组成
  3. 在『正方体』的内则贴上图像
  4. 『天幕』中心点与『相机』位置同步移动

 

渲染天幕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();// 当前矩阵堆栈出栈

}

評論