您的位置:首页 > 运维架构

使用Windows窗口句柄建立OpenGL环境

2011-11-17 14:38 691 查看
在Windows中,OpenGL命令是通过OpenGL Render Context(以下简称RC)来执行的。这个RC是OpenGL和Windows之间的纽带。

每个RC创建时,必须指定一个DC(Windows Device Context 也就是那个通常用于GDI的设备环境DC)。RC的绘制目标,就是这个DC所对应的窗口。

每次RC创建时,应该设置一下DC的像素格式

同一个时刻,一个窗口可能对应多个RC,但一个线程只能有一个被激活的RC

每个RC都有一个对应的DC,该DC不一定必须是当初创建的RC时的DC,但这个DC必须与创建RC时的那个DC,对应于同样的Windows对象,并且像素格式相同。

每个线程有且只能拥有一个RC

Windows提供了一组用于RC管理的函数:

WGL Function

Description

wglCreateContext

创建一个RC。

WglMakeCurrent

为线程指定当前RC。

WglGetCurrentContext

获取一个线程的当前RC。

WglGetCurrentDC

获取当前线程RC所对应的DC。

WglDeleteContext

删除一个RC。

根据以上内容,可以确定使用Windows窗口句柄建立OpenGL环境的步骤如下:



各个过程的示例代码如下:

1、在合适的地方,定义RC和DC句柄;

#include <GL\gl.h> //必要的头文件
#pragma comment(lib, "opengl32.lib") //加入必要的lib文件

HGLRC m_hRC; //OpenGL渲染上下文环境句柄
HDC m_hDC; //Windows设备环境句柄

2、初始化RC的示例代码;

//根据hWnd创建RC
void Init(HWND hWnd)
{
//获取DC
m_hDC = GetDC(hWnd);

//初始化像素格式
static PIXELFORMATDESCRIPTOR 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, 0, //忽略RGBA
0, //无累加缓存
0, 0, 0, 0, //忽略聚集位
32, //32位Z-缓存(深度缓存)
0, //无蒙板缓存
0, //无辅助缓存
PFD_MAIN_PLANE, //主绘图层
0, //Reserved
0, 0, 0 //忽略层遮罩
};

//选择一个最适合pfd描述的像素格式索引值
int nPixelFormat = ChoosePixelFormat(m_hDC, &pfd);

//为DC设置像素格式
SetPixelFormat(m_hDC, nPixelFormat, &pfd);

//创建RC
m_hRC = wglCreateContext(m_hDC);
}

3、渲染示例代码:

void Render()
{
//选择RC作为当前线程的RC
wglMakeCurrent(m_hDC, m_hRC);

//
//在此使用OpenGL进行绘制
//

//交换当前缓冲区和后台缓冲区
SwapBuffers(m_hDC);

//取消当前线程选中的RC
wglMakeCurrent(NULL, NULL);
}

4、退出时的示范代码:

void DeInit(HWND hWnd)
{
wglDeleteContext(m_hRC);
ReleaseDC(hWnd, m_hDC);
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: