OpenGL是一种基于客户/服务器和管道(PipeLine)的图形库。即一个应用程序(客户)将各种命令和数据写入管道,这命令和数据将被暂时保存起来,图形库(服务器)直到收到一条专门的指令才会开始处理它们,并将处理结果通过管道传给用户。
所以OpenGL应用程序的基本结构就是:
建立管道
根据需要向管道中写入数据和指令
关闭管道
在Windows95/NT环境中,这个管道就是OpenGL着色环境——(OpenGL Render Context)简称RC。因此建立管道实际上就是获取一个可用的RC。
而在Windows的GDI系统中进行图形显示是通过图形设备上下文——(Device Context)简称DC——进行的。所以获取RC就是:
①先获取一个DC,
②调整这个DC的象素格式(PixelFormat)以便OpenGL库进行绘制,
③用DC去调用wglCreateContext(hDC)建立一个RC,
④调用wglMakeCurrent(hRC,hDC)将刚才建立的RC指定为当前的RC。
当一个RC不再使用时就可以删除它,方法是:
使RC不是“当前RC”:
wglMakeCurrent(hDC,NULL); //不再有当前RC
wglDEleteContent(hRC); //删除之
所以OpenGL应用程序的基本结构就是:
建立管道
根据需要向管道中写入数据和指令
关闭管道
在Windows95/NT环境中,这个管道就是OpenGL着色环境——(OpenGL Render Context)简称RC。因此建立管道实际上就是获取一个可用的RC。
而在Windows的GDI系统中进行图形显示是通过图形设备上下文——(Device Context)简称DC——进行的。所以获取RC就是:
①先获取一个DC,
②调整这个DC的象素格式(PixelFormat)以便OpenGL库进行绘制,
③用DC去调用wglCreateContext(hDC)建立一个RC,
④调用wglMakeCurrent(hRC,hDC)将刚才建立的RC指定为当前的RC。
当一个RC不再使用时就可以删除它,方法是:
使RC不是“当前RC”:
wglMakeCurrent(hDC,NULL); //不再有当前RC
wglDEleteContent(hRC); //删除之
BOOL OpenGLInit(CClientDC* pDC,HGLRC& hglrc)
{
int n; //当前选择的像素格式索引
static PIXELFORMATDESCRIPTOR pfd=
{ //像素点格式信息描述结构体
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW | //支持Windows与OpenGL二环境绘图
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER, //使用双缓存交换显示图形
PFD_TYPE_RGBA, // RGBA type
24, // 24-bit color depth
0, 0, 0, 0, 0, 0, // color bits ignored
0, // no alpha buffer
0, // shift bit ignored
0, // no accumulation buffer
0, 0, 0, 0, // accum bits ignored
32, // 32-bit z-buffer
0, // no stencil buffer
0, // no auxiliary buffer
PFD_MAIN_PLANE, // main layer
0, // reserved
0, 0, 0 // layer masks ignored
};
int pixelformat;
if((pixelformat=ChoosePixelFormat(pDC->GetSafeHdc(),&pfd))==0)
{
AfxMessageBox("选择像素格式化失败");
return FALSE;
}
if(SetPixelFormat(pDC->GetSafeHdc(),pixelformat,&pfd)==FALSE)
{
AfxMessageBox("设置像素格式化失败");
return FALSE;
}
n=::GetPixelFormat(pDC->GetSafeHdc());
::DescribePixelFormat(pDC->GetSafeHdc(),n,sizeof(pfd),&pfd);
hglrc = wglCreateContext(pDC->GetSafeHdc()); //创建绘制情景对象
wglMakeCurrent(pDC->GetSafeHdc(),hglrc); //选择绘制情景对象
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
// glMatrixMode(GL_MODELVIEW); //设置变换模式为模型变换
// glLoadIdentity(); //初始化模型变换矩阵
return TRUE;
}
BOOL OpenGLExit(CClientDC* pDC,HGLRC& hglrc)
{
::wglMakeCurrent(NULL,NULL); //将当前绘图情景对象置空
if(hglrc)
::wglDeleteContext(hglrc); //删除当前绘图情景对象
if(pDC)
delete pDC; //删除创建的windows设备上下文
return TRUE;
}