我用了五天时间才搞成功这个东西,网上虽有很多立方体贴图源码,但是都是以Windows32 Application编写。而以MFC对话框去做这个立方体贴图我却找不到一个。
所以我把源码贴出来让需要的人学习学习。我用的是VC++6.0。如果您用的是VS2013可能需要稍稍修改。希望大家对OpenGL的热情越来越高,也希望各位关注我的博客。
//
头文件就是那几个,glut.h,glaux.h,stdio.h和iostream.h
#define MAXTEXTURE 3
GLuint texture[MAXTEXTURE]; // 存储纹理
GLfloat angle_Y; // 用来绕y轴旋转物体
COpenGL::COpenGL(void)
{
}
COpenGL::~COpenGL(void)
{
wglMakeCurrent(hDC,NULL);
wglDeleteContext(hRC);
}
AUX_RGBImageRec *LoadImage(char *Filename) // 加载一个图片
{
FILE *File = NULL; // 文件句柄
if (!Filename) // 确保文件名已经提供
{
return NULL; // 如果没有则返回NULL
}
File = fopen(Filename,"r"); // 检查文件是否存在
if (File) // 文件存在吗?
{
fclose(File); // 关闭File文件句柄
return auxDIBImageLoad(Filename); // 载入图片并返回其指针
}
return NULL; // 如果加载错误则返回NULL
}
void COpenGL::DrawCube(void)
{
// 在此处添加代码进行绘制:
glScalef(0.5,0.5,0.5);
glRotatef(10,1.0,1.0,0.0);
glRotatef(angle_Y, 1.0f, 1.0f, 1.0f);
glBindTexture(GL_TEXTURE_2D,texture[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // 纹理和四边形的右上
glEnd();
glBindTexture(GL_TEXTURE_2D,texture[1]);
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // 纹理和四边形的右下
glEnd();
glBindTexture(GL_TEXTURE_2D,texture[2]);
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // 纹理和四边形的左下
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // 纹理和四边形的左上
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // 纹理和四边形的左下
glEnd();
angle_Y += 2.0f;
glFlush();
}
void COpenGL::Init(int width,int height)
{
glClearColor(0.0, 0.0, 1.0,0.0);
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
glClearDepth(1.0f);
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
if (!LoadTextureGL()) // 调用LoadTextureGL()函数
{
// 如果纹理加载错误则返回FALSE
}
glEnable(GL_TEXTURE_2D);
}
//设置像素格式
bool COpenGL::SetupPixelFormat(HDC hDC0)
{
int nPixelFormat;
hDC=hDC0;
PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), // pfd结构的大小
1,
PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL | // 支持OpenGL
PFD_DOUBLEBUFFER, // 双缓存模式
PFD_TYPE_RGBA,
24, // 24 位颜色深度
0, 0, 0, 0, 0, 0, // 忽略颜色位
0,
0,
0,
0, 0, 0, 0,
32, // 32 位深度缓存
0, // 无模板缓存
0, // 无辅助缓存
PFD_MAIN_PLANE, // 主层
0, // 保留
0, 0, 0 // 忽略层,可见性和损毁掩模
};
if (!(nPixelFormat = ChoosePixelFormat(hDC, &pfd)))
{
MessageBox(NULL,_T("can not find proper mode"),_T("Error"),MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
SetPixelFormat(hDC,nPixelFormat,&pfd);
hRC = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRC);
return TRUE;
}
void COpenGL::Reshap(int w,int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); //变为单位矩阵
gluPerspective(30, (GLfloat)w / h, 0, 1000); //设置投影矩阵
glMatrixMode(GL_MODELVIEW); //设置矩阵模式为视图矩阵(模型)
glLoadIdentity();
}
void COpenGL::Render()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
// glutWireCube(1.0); //绘制线框立方体
DrawCube();
glColor3f(1.0, 1.0, 1.0);
SwapBuffers(hDC);
}
BOOL COpenGL::LoadTextureGL()
{
BOOL State = FALSE; // 状态指示
AUX_RGBImageRec *TextureImage[MAXTEXTURE]; // 为纹理开辟存储空间
memset(TextureImage, 0, sizeof(void *) * MAXTEXTURE); // 清除图像记录,确保其内容为空并使指针指向NULL
if ((TextureImage[0]=LoadImage("Data/1.bmp"))
&&(TextureImage[1]=LoadImage("Data/2.bmp"))
&&(TextureImage[2]=LoadImage("Data/3.bmp")))
{
State=TRUE; // 设置状态变量为TRUE
glGenTextures(MAXTEXTURE, &texture[0]); // 返回唯一的纹理名字来标识纹理,保存在texture中
for (int loop=0; loop<MAXTEXTURE; ++loop) // 循环处理MAXTEXTURE张纹理
{
// 使用来自位图数据生成的典型纹理
glBindTexture(GL_TEXTURE_2D, texture[loop]);
// 生成纹理
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[loop]->sizeX, TextureImage[loop]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[loop]->data);
// glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[loop]->sizeX, TextureImage[loop]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[loop]->data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // 线形滤波
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 线形滤波
}
}
for (int loop=0; loop<MAXTEXTURE; ++loop)
{
if (TextureImage[loop]) // 纹理是否存在
{
if (TextureImage[loop]->data) // 纹理图像是否存在
{
free(TextureImage[loop]->data); // 释放纹理存储空间
}
free(TextureImage[loop]); // 释放图像结构
}
}
return State;
}