分享

VC下配置OPENGL框架

 佛~~~ 2010-10-07
    使用VC下的MFC很久了,但是开始接触的OPENGL都是在WIN32控制台下的程
序,所以要将代码移植到MFC下这个想法已经很久,而且努力之后,已经实现,
主要过程如下:
    我们可以新建一个工程,工程名不妨为OPEGNGL0(后面还会有1,2……)
    在VC中操作如下:Project-> Settings,然后单击LINK标签。
在"Object/Library Modules"选项中的开始处(在 kernel32.lib 前)增加
OpenGL32.lib GLu32.lib 和 GLaux.lib 后单击OK按钮。
    在"stdafx.h"里面加入以下三行代码
    #include "gl\gl.h"
    #include "gl\glu.h"
    #include "gl\glaux.h"
    在"OPENGL.H"里加入两个protected类型的变量
    HGLRC m_hRC;
    HDC m_hDC;
    下面给整个工程重载以下几个消息
    WM_CREATE   WM_DESTROY  WM_ERASEBKGND  WM_SIZE  WM_TIMER
    最后手动添加两个函数到view类里
public:
 bool InitGL();
 void DrawGLScene();
函数添加完毕,下面要做的就是往函数里添加一些简单的代码了。
void COpenGL0001View::DrawGLScene()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
//这里可以加入你将要绘画的一些代码;
    SwapBuffers(m_hDC);
}
bool COpenGL0001View::InitGL()
{
    glShadeModel(GL_SMOOTH);   //平滑展示模型
    glClearColor(0.0f,0.0f,0.0f,0.0f);
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);   //告诉系统对透视进行修正
    return true;
}
int COpenGL0001View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CView::OnCreate(lpCreateStruct) == -1)
  return -1;
 
 // TODO: Add your specialized creation code here
  PIXELFORMATDESCRIPTOR pfd=   //
/pfd 告诉窗口我们所希望的东东,即窗口使用的像素格式
  {
  sizeof(PIXELFORMATDESCRIPTOR),   // 上述格式描述符的大小
  1,      // 版本号
  PFD_DRAW_TO_WINDOW |                   // 格式支持窗口
  PFD_SUPPORT_OPENGL |                      // 格式必须支持OpenGL
  PFD_DOUBLEBUFFER,                            // 必须支持双缓冲
  PFD_TYPE_RGBA,                                   // 申请 RGBA 格式
  24,                                                                // 选定色彩深度
  0, 0, 0, 0, 0, 0,                                              // 忽略的色彩位
  0,                                                                    // 无Alpha缓存
  0,                                                                     // 忽略Shift Bit
  0,                                                                     // 无累加缓存
  0, 0, 0, 0,                                                     // 忽略聚集位
  16,                                                            // 16位 Z-缓存 (深度缓存)
  0,                                                                  // 无蒙板缓存
  0,                                                                  // 无辅助缓存
  PFD_MAIN_PLANE,                                   // 主绘图层
  0,                                                                     // Reserved
  0, 0, 0                                                         // 忽略层遮罩
  };
  m_hDC=GetDC()->GetSafeHdc();
  int setPixelFormat=::ChoosePixelFormat(m_hDC,&pfd);  
  ::SetPixelFormat(m_hDC,setPixelFormat,&pfd);
  m_hRC=::wglCreateContext(m_hDC);
  ::wglMakeCurrent(m_hDC,m_hRC);
  InitGL();
  SetTimer(1,1,NULL); 
 return 0;
}
void COpenGL0001View::OnDestroy()
{
 CView::OnDestroy();
 
 // TODO: Add your message handler code here
::wglMakeCurrent(NULL,NULL);
::wglDeleteContext(m_hRC);
}
void COpenGL0001View::OnSize(UINT nType, int cx, int cy)
{
 CView::OnSize(nType, cx, cy);
 
 // TODO: Add your message handler code here
 if(cy==0) cy=1;
 glViewport(0,0,cx,cy);
 glMatrixMode(GL_PROJECTION);                     //设置当前矩阵为投影矩阵
 glLoadIdentity();                                                      //重置当前矩阵为单位矩阵
 //计算窗口的外观比例(远景透视图)
 gluPerspective(45.0,(GLfloat)cy,0.1f,100.0f);
 glMatrixMode(GL_MODELVIEW);                      //设置当前矩阵为模型视力矩阵
 glLoadIdentity(); 
}
 
void COpenGL0001View::OnTimer(UINT nIDEvent)
{
 // TODO: Add your message handler code here and/or call default
 DrawGLScene();
 CView::OnTimer(nIDEvent);
}

BOOL COpenGL0001View::OnEraseBkgnd(CDC* pDC)
{
 // TODO: Add your message handler code here and/or call default
 return true;
 //return CView::OnEraseBkgnd(pDC);
}
到这一步,基本上已经配置完了OPEGNGL环境了,如果需要添加一些场景之类的
话,可以直接在函数DrawGLScene里进行,此工程到目前为止,还没有出现过问
题。如果发现有什么问题,欢迎与我联系。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多