OpenGL是一个优秀的专业化的3D的API(Application Programming Interface,应用编程接口)

时间:2022-01-01 18:15:19

(原帖:http://hi.baidu.com/zhang411421/blog/item/356857ed2c7e87dfb31cb191.html

一、简介

  GDI是通过设备句柄(Device Context以下简称"DC")来绘图,而OpenGL则需要绘制环境(Rendering Context,以下简称"RC")。每一个GDI命令需要传给它一个DC,但与GDI不同,OpenGL使用当前绘制环境(RC)。一旦在一个线程中指定 了一个当前RC,在此线程中其后所有的OpenGL命令都使用相同的当前RC。虽然在单一窗口中可以使用多个RC,但在单一线程中只有一个当前RC。下面我将首先产生一个OpenGL RC并使之成为当前RC,这将分为三个步骤:设置窗口像素格式;产生RC;设置为当前RC

二、MFC中的OpenGL基本框架

  1、首先创建工程

   用AppWizard产生一个MFC EXE项目,其他默认即可。

  2、将此工程所需的OpenGL文件和库加入到工程中

   在工程菜单中,选择"Build"下的"Settings"项。单击"Link"标签,选择"General"目录,在Object/Library Modules的编辑框中输入"opengl32.lib glu32.lib glut.lib glaux.lib"(注意,输入双引号中的内容,各个库用空格分开;否则会出现链接错误),选择"OK"结束。然后打开文件"stdafx.h",加入下列头文件:

 

 #include <gl/gl.h>
 #include
<gl/glu.h>

 

 3、改写OnPreCreate函数并给视类添加成员函数和成员变量

   OpenGL需要窗口加上WS_CLIPCHILDREN(创建父窗口使用的Windows风格,用于重绘时裁剪子窗口所覆盖的区域)和 WS_CLIPSIBLINGS(创建子窗口使用的Windows风格,用于重绘时剪裁其他子窗口所覆盖的区域)风格。把OnPreCreate改写成如 下所示:

 

BOOL COpenGLDemoView::PreCreateWindow(CREATESTRUCT& cs)
{
    
// TODO: Modify the Window class or styles here by modifying
    
//   the CREATESTRUCT cs
     cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
    
return CView::PreCreateWindow(cs);
}  

 

   产生一个RC的第一步是定义窗口的像素格式。像素格式决定窗口着所显示的图形在内存中是如何表示的。由像素格式控制的参数包括:颜色深度、缓冲模式和所支持的绘画接口。在下面将有对这些参数的设置。我们先在COpenGLDemoView的类中添加一个保护型的成员函数BOOL SetWindowPixelFormat(HDC hDC)(用鼠标右键添加)和保护型的成员变量:int m_GLPixelIndex;并编辑其中的代码如下:

BOOL COpenGLDemoView::SetWindowPixelFormat(HDC hDC)
{
//定义窗口的像素格式
     PIXELFORMATDESCRIPTOR pixelDesc=
     {
        
sizeof(PIXELFORMATDESCRIPTOR),
        
1,
         PFD_DRAW_TO_WINDOW
|PFD_SUPPORT_OPENGL|
         PFD_DOUBLEBUFFER
|PFD_SUPPORT_GDI,
         PFD_TYPE_RGBA,
        
24,
        
0,0,0,0,0,0,
        
0,
        
0,
        
0,
        
0,0,0,0,
        
32,
        
0,
        
0,
         PFD_MAIN_PLANE,
        
0,
        
0,0,0
     };

    
this->m_GLPixelIndex = ChoosePixelFormat(hDC,&pixelDesc);
    
if(this->m_GLPixelIndex==0)
     {
        
this->m_GLPixelIndex = 1;
        
if(DescribePixelFormat(hDC,this->m_GLPixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0)
         {
            
return FALSE;
         }
     }

    
if(SetPixelFormat(hDC,this->m_GLPixelIndex,&pixelDesc)==FALSE)
     {
        
return FALSE;
     }
    
return TRUE;

  4、用ClassWizard添加WM_CREATE的消息处理函数OnCreate

   至此,OpenGL工程的基本框架就建好了。但如果你现在运行此工程,则它与一般的MFC程序看起来没有什么两样。