OpenGL在MFC对话框上进行立方体贴图

14 篇文章 0 订阅


我用了五天时间才搞成功这个东西,网上虽有很多立方体贴图源码,但是都是以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;
}



  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值