设为首页 加入收藏

TOP

2.1.2 OpenGL渲染环境
2013-10-07 13:15:04 来源: 作者: 【 】 浏览:73
Tags:2.1.2 OpenGL 渲染 环境

2.1.2 OpenGL渲染环境

和GDI不同,OpenGL的设计目标是能在各种环境和平台上实现完全可移植的3D图形接口,所以它并不是为Windows量身定做的。但是,OpenGL也有一种设备环境标识符,叫做渲染环境(rendering context)。渲染环境在许多方面都和GDI的设备环境非常相似,因为正是渲染环境负责记住当前的颜色、状态设置等信息,就像设备环境需要记住当前的画刷或画笔颜色一样。

但任何实现3D图形渲染的窗口或设备应该具备的特征远远不止颜色深度那么简单,特别是当我们使用某种硬件渲染设备(3D图形卡)的时候。在OpenGL可以对窗口进行渲染之前,你首先必须根据渲染需要对窗口进行配置,比如使用硬件渲染还是软件渲染?渲染使用单缓冲还是双缓冲?是否需要深度缓冲区?是否需要模板、Alpha缓冲区?当你为窗口设置了这些参数之后,你以后就无法对它们进行修改。为了从一个只有深度缓冲区和颜色缓冲区的窗口切换到一个只有模板和颜色缓冲区的窗口,你首先必须销毁第一个窗口,然后根据你所需要的特征重新创建一个窗口。

窗口的3D特征是一次性设置的,通常就在创建窗口之后通过对该窗口的像素格式进行设置。Windows提供了一个PIXELFORMATDESCRIPTOR结构用来描述像素格式,其定义如下:

 
 

对于一个特定的OpenGL硬件或软件设备,这些成员的值并不是任意的。一个特定的窗口只能使用有限数量的像素格式。像素格式是由硬件的OpenGL驱动程序或软件渲染器导出的。在这些结构成员中,绝大多数成员的含义是很清楚的,但有一些需要稍作解释:

dwFlags是一组位标志,指定了像素缓冲区的属性。这些标志绝大多数都是互斥的,但有一些标志是在请求或描述像素格式时使用的。表2-1列出这个成员的有效标志。

表2-1 像素格式

 

iPixelType表示颜色缓冲区的类型,它只有两个值是有效的:PFD_TYPE_RGBA和PFD_TYPE_COLORINDEX。但是PDF_TYPE_COLORINDEX已被现代计算机所废弃,在实际应用中不会被采用。

cColorBits其典型值为8、16、24或32。32位的颜色缓冲区可能会存储Alpha值。只有Windows 2000\XP以及更新版本的操作系统上的泛型实现支持目标Alpha值。

cAlphaBits并没有得到Microsoft的泛型实现的支持,但许多硬件实现都支持它。

cDepthBits典型值是0、16、24和32,其使用的位数越多,深度测试的结果也就越准确,当然,计算代价也越大。

cAuxBuffers在支持辅助缓冲区的的OpenGL实现中,渲染可以从颜色缓冲区重定向到一个辅助缓冲区,并在以后再交换到屏幕。

为了给一个窗口设置像素格式,你必须选择OpenGL实现所导出的其中一种有效像素格式。窗口像素格式是由一个以1为起点的整型索引值标识的。我们使用DescribePixelFormat函数判断一种已知像素格式的特征,还可以用这个函数找出该OpenGL实现所支持的所有像素格式,如以下代码所示:

 
但枚举所有可用的像素格式,并对每种格式进行检查,从中找出符合你需要的那种像素格式,这个任务是相当乏味的。不过Windows提供了一个快捷函数,使这个过程变得简单一些。ChoosePixelFormat函数允许你创建一种像素格式结构,让它包含你的绘制3D图形的窗口所需要的属性。如果你的硬件设备或软件实现不完全支持你需要的像素格式,该函数会寻找一个最为接近的匹配(优先考虑硬件加速的像素格式),并返回最适当的索引值。然后你可以调用SetPixelFormat函数设置这种像素格式。下面的代码显示了这两个函数的用法:
 
 

有时候,有些编程(www.cppentry.com)任务需要用更为复杂的选择方式来选择像素格式。这时,我们需要枚举并检查所有有效的像素格式,或使用本书后面将要介绍的WGL扩展。但是,对于绝大多数用途,上面的代码已经足够让你的窗口做好接收OpenGL渲染命令的准备。

一个典型的Windows应用程序可以由许多窗口组成。如果你愿意,你甚至可以为每个窗口设置不同的像素格式(使用每个窗口的设备环境)。但是每个窗口只能调用SetPixelFormat函数一次。

当你调用一条OpenGL命令时,它如何知道把输出发送给哪个窗口呢?我们需要在执行任何一条OpenGL命令之前都指定一个当前的渲染窗口。正如Windows GDI函数使用窗口设备环境一样,OpenGL也提供了一个叫作渲染环境的概念。就像设备环境能够记住有关GDI的绘图模式和命令的设置一样,渲染环境也能够记住OpenGL的设置和命令。OpenGL的渲染环境句柄的数据类型是HGLRC。

我们需要调用wglCreateContext函数创建一个OpenGL渲染环境,该函数只接受一个参数:一个具有一种有效像素格式的窗口的设备环境句柄。下面代码显示了如何创建一个渲染环境:

 

上述代码创建了一个渲染环境,它与目标窗口相兼容。你可以在应用程序中拥有超过一个的渲染环境。例如,两个窗口可能分别使用不同的绘图模式。但是,为了让OpenGL知道它所操作的是哪个窗口,在每个线程的任一时刻,只能有一个渲染环境处于活动状态。当一个渲染环境变成活动的时候,就称其为当前渲染环境。

当前渲染环境需要与一个设备环境相关联,因此也就与一个特定的窗口相关联。现在,OpenGL就知道该渲染到哪个窗口了。你甚至可以把渲染环境从一个窗口移动到另一个窗口,但这两个窗口必须要有相同的像素格式。为了把一个渲染环境设置为当前渲染环境,并把它与一个特定的窗口相关联,你需要调用wglMakeCurrent函数。该函数接受两个参数:该窗口的设备环境句柄和OpenGL渲染环境句柄:

 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇2.2.2 面向对象风格的框架(1) 下一篇2.1.1 GDI设备环境

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: