?? skybox.cpp
字號:
//========================================================
/**
* @file SkyBox.cpp
*
* 項目描述: 3DS文件載入
* 文件描述: 天空盒類
* 適用平臺: Windows98/2000/NT/XP
*
* 作者: WWBOSS
* 電子郵件: wwboss123@gmail.com
* 創建日期: 2006-12-06
* 修改日期: 2006-12-10
*
*/
//========================================================
#include "SkyBox.h"
CSkyBox::CSkyBox():length(750.0f),width(550.0f),height(400.0f),yRot(0.01f)
{
}
CSkyBox::~CSkyBox()
{
/** 刪除紋理對象及其占用的內存 */
for(int i =0 ;i< 5; i++)
{
m_texture[i].FreeImage();
glDeleteTextures(1,&m_texture[i].ID);
}
}
/** 天空盒初始化 */
bool CSkyBox::init()
{
char filename[128] ; /**< 用來保存文件名 */
char *bmpName[] = { "back","front","top","left","right"};
for(int i=0; i< 5; i++)
{
sprintf(filename,"data/%s",bmpName[i]);
strcat(filename,".bmp");
if(!m_texture[i].LoadBitmap(filename)) /**< 載入位圖文件 */
{
MessageBox(NULL,"裝載位圖文件失敗!","錯誤",MB_OK); /**< 如果載入失敗則彈出對話框 */
exit(0);
}
glGenTextures(1, &m_texture[i].ID); /**< 生成一個紋理對象名稱 */
glBindTexture(GL_TEXTURE_2D, m_texture[i].ID); /**< 創建紋理對象 */
/** 控制濾波 */
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
/** 創建紋理 */
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, m_texture[i].imageWidth,
m_texture[i].imageHeight, GL_RGB, GL_UNSIGNED_BYTE,
m_texture[i].image);
}
return true;
}
void CSkyBox::render()
{
/** 獲得場景中光照狀態 */
GLboolean lp;
glGetBooleanv(GL_LIGHTING,&lp);
m_CameraPos = Camera::GetCamera()->getPosition();
glDisable(GL_LIGHTING); /**< 關閉光照 */
glEnable(GL_TEXTURE_2D);
/** 開始繪制 */
glPushMatrix();
glTranslatef(m_CameraPos.x,m_CameraPos.y,m_CameraPos.z);
glRotatef(yRot,0.0f,1.0f,0.0f);
/** 繪制背面 */
glBindTexture(GL_TEXTURE_2D, m_texture[0].ID);
glBegin(GL_QUADS);
/** 指定紋理坐標和頂點坐標 */
glTexCoord2f(1.0f, 0.0f); glVertex3f( width, -height, -length);
glTexCoord2f(1.0f, 1.0f); glVertex3f( width, height, -length);
glTexCoord2f(0.0f, 1.0f); glVertex3f( -width, height, -length);
glTexCoord2f(0.0f, 0.0f); glVertex3f( -width, -height, -length);
glEnd();
/** 繪制前面 */
glBindTexture(GL_TEXTURE_2D, m_texture[1].ID);
glBegin(GL_QUADS);
/** 指定紋理坐標和頂點坐標 */
glTexCoord2f(1.0f, 0.0f); glVertex3f( -width, -height, length);
glTexCoord2f(1.0f, 1.0f); glVertex3f( -width, height, length);
glTexCoord2f(0.0f, 1.0f); glVertex3f( width, height, length);
glTexCoord2f(0.0f, 0.0f); glVertex3f( width, -height, length);
glEnd();
/** 繪制頂面 */
glBindTexture(GL_TEXTURE_2D, m_texture[2].ID);
glBegin(GL_QUADS);
/** 指定紋理坐標和頂點坐標 */
glTexCoord2f(0.0f, 1.0f); glVertex3f( width, height, -length);
glTexCoord2f(0.0f, 0.0f); glVertex3f( width, height, length);
glTexCoord2f(1.0f, 0.0f); glVertex3f( -width, height, length);
glTexCoord2f(1.0f, 1.0f); glVertex3f( -width, height, -length);
glEnd();
/** 繪制左面 */
glBindTexture(GL_TEXTURE_2D, m_texture[3].ID);
glBegin(GL_QUADS);
/** 指定紋理坐標和頂點坐標 */
glTexCoord2f(1.0f, 1.0f); glVertex3f( -width, height, -length);
glTexCoord2f(0.0f, 1.0f); glVertex3f( -width, height, length);
glTexCoord2f(0.0f, 0.0f); glVertex3f( -width, -height, length);
glTexCoord2f(1.0f, 0.0f); glVertex3f( -width, -height, -length);
glEnd();
/** 繪制右面 */
glBindTexture(GL_TEXTURE_2D, m_texture[4].ID);
glBegin(GL_QUADS);
/** 指定紋理坐標和頂點坐標 */
glTexCoord2f(0.0f, 0.0f); glVertex3f( width, -height, -length);
glTexCoord2f(1.0f, 0.0f); glVertex3f( width, -height, length);
glTexCoord2f(1.0f, 1.0f); glVertex3f( width, height, length);
glTexCoord2f(0.0f, 1.0f); glVertex3f( width, height, -length);
glEnd();
glPopMatrix(); /** 繪制結束 */
if(lp) /** 恢復光照狀態 */
glEnable(GL_LIGHTING);
glDisable(GL_TEXTURE_2D);
yRot += 0.01f;
if(yRot > 360.0f)
yRot = 0.0f;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -