|
第四讲
|
|
来源: 作者:国学 发布时间:1969-12-31
|
|
1、Windows下的调色板 OpenGL可以使用16色、256色、64K和16M真彩色。真彩模式下不需要调色板,而在16色模式下根本不可能得到较为满意的效果,因此对OpenGL而言,调色板只有在256色模式下才有意义。 我们知道,Windows把调色板分为系统调色板和逻辑调色板。每个应用程序都拥有一套自己的逻辑调色板(或使用缺省调色板),当该应用程序拥有键盘输入焦点时可以最多使用从16M种色彩中选取的256种颜色(20种系统保留颜色和236种自由选取的颜色),而失去焦点的应用程序可能会有某些颜色显示不正常。系统调色板由Windows内核来管理,它是由系统保留的20种颜色和经仲裁后各个应用程序设置的颜色组成,并与硬件的256个调色板相对应。应用程序的逻辑调色板与硬件的调色板没有直接的对应关系,而是按照最小误差的原则映射到系统调色板中,因此即使应用程序自由选取256种不同颜色构成自己的逻辑调色板,也有可能某些颜色显示到屏幕上时是一样的。 当应用程序的窗口接收到键盘输入焦点时,Windows会向它发送一条WM_QUERYNEWPALETTE消息,让它设置自己的逻辑调色板,此时Windows会在系统调色板中尽量多地加入该应用程序需要的颜色,并生成相应的映射关系。接着Windows会向系统中所有的覆盖型窗口和顶级窗口(包括拥有键盘输入焦点的窗口)发送一条WM_PALETTECHANGED消息,让它们设置逻辑调色板和重绘客户区,以便能更充分地利用系统调色板,已拥有键盘输入焦点的窗口不应再处理这条消息,以避免出现死循环。 zgwwW 2、OpenGL的颜色表示与转换 OpenGL内部用浮点数来表示和处理颜色,红绿蓝和Alpha值这四种成份每种的最大值为1.0,最小值为0.0。在256色模式下,OpenGL把一个像素颜色的内部值按线性关系转换为8比特(Bit)来输出到屏幕上,其中红色占最低位的3比特,绿色占中间的3比特,蓝色占最高位的2比特,Windows将这个8比特值看作逻辑调色板的索引值。例如OpenGL的颜色值(1.0,0.14,0.6667)经过转换后二进制值为10001111(红色为111,绿色为001,蓝色为10),即第143号调色板,该调色板指定的颜色的RGB值应与(1.0,0.14,0.6667)有相同的比率,为(255,36,170),如果不是该值,那么显示出来的颜色就会有误差。 3、调色板的生成算法 很明显,OpenGL输出的8比特值中直接表明了颜色的组成,为了使图形显示正常,我们应以线性关系来设置逻辑调色板,使其索引值直接表明颜色的组成。因此生成调色板时,把索引值从低位到高位分成3-3-2共三个部分,将每一部分映射到0-255中去,这样3比特映射为{0,36,73,109,146,182,219,255},2比特映射为{0,85,170,255},最后把三部分组合起来成为一种颜色。 经过上面的处理后,256种颜色均匀分布在颜色空间中,并没有完全包含系统保留的20种颜色(只包含了7种),这意味着将会有数种颜色显示成一样,从而影响效果。一个较好的解决办法是按照最小均方误差的原则把13种系统颜色纳入到逻辑调色板中。 zgwww.net 从原理上来说,并非一定要使用线性映射,还可以用其它一些映射关系,如加入Gamma校正以便更能符合人眼的视觉特性,不过这些映射关系应用得并不广泛,在此不再讨论。 1.3.4 像素格式设置 像素格式是OpenGL窗口的重要属性,它包括是否使用双缓冲,颜色位数和类型以及深度位数等。像素格式可由Windows系统定义的所谓像素格式描述子结构来定义(PIXELFORMATDESCRIPTOR),该结构定义在windows.h中。 在该结构中包含有26个属性信息,其形式为: typedef struct tagPIXELFORMATDESCRIPTOR { WORD nSize; WORD nVersion; DWORD dwFlags; BYTE iPixelType; BYTE cColorBits; BYTE cRedBits; BYTE cRedShift; BYTE cGreenBits; BYTE cGreenShift; BYTE cBlueBits; BYTE cBlueShift; BYTE cAlphaBits; BYTE cAlphaShift; BYTE cAccumBits; BYTE cAccumRedBits; BYTE cAccumGreenBits; BYTE cAccumBlueBits; BYTE cAccumAlphaBits; BYTE cDepthBits; BYTE cStencilBits; BYTE cAuxBuffers; BYTE iLayerType; BYTE bReserved; DWORD dwLayerMask; DWORD dwVisibleMask; DWORD dwDamageMask; } PIXELFORMATDESCRIPTOR; zgwww.net 各变量的含义如下: nSize:该结构所占内存空间。 nVersion:版本号,当前为1。 dwFlags:指定像素格式属性,可选参量如表1.1所示。

表1.1 像素格式属性
标识符 解释 PFD_DRAW_TO_BITMAP 支持内存中绘制位图 PFD_DRAW_TO_WINDOW 支持屏幕绘图 PFD_DOUBLEBUFFER 支持双缓冲 PFD_CENERIC_FORMAT 指定选择GDI支持的像素格式 PFD_NEED_PALETTE 指定需要逻辑调色板 PFD_NEED_SYSTEM_PALETTE 指定需要硬件调色板 PFD_STEREO NT不支持 PFD_SUPPORT_OPENGL 支持OpenGL PFD_SUPPORT_GDI 支持GDI,此时不可使用PFD_DOUBLEBUFFER iPixelType:像素颜色模式,可选项为PFD_TYPE_RGBA或PFD_TYPE_INDEX,分别对应于RGBA模式和颜色索引模式。 cColorBits:指定颜色的位数。 cRedBits:采用RGBA模式时,红色组分占用位数。 cRedShift:采用RGBA模式时,红色组分偏移量。 cGreenBits:采用RGBA模式时,绿色组分占用位数。 cGreenShift:采用RGBA模式时,绿色组分偏移量。 cBlueBits:采用RGBA模式时,蓝色组分占用位数。 cBlueShift: 采用RGBA模式时,蓝色组分偏移量。 zgwww.net cAlphaBits:采用RGBA模式时,Alpha组分占用位数。 cAlphaShift:采用RGBA模式时,Alpha组分偏移量。 cAccumBits:指定累积缓冲区表示一个像素所用位数。 cAccumRedBits:指定累积缓冲区表示红色组分占用位数。 cAccumGreenBits:指定累积缓冲区表示绿色组分占用位数。 cAccumBlueBits:指定累积缓冲区表示蓝色组分占用位数。 cAccumAlphaBits:指定累积缓冲区表示Alpha组分占用位数。 cDepthBits:指定深度缓冲区表示一个像素所用位数。 cStencilBits:指定模板缓冲区表示一个像素所用位数。 cAuxBuffers:指定辅助缓冲区,Windows9x、NT不支持。 iLayerType:Windows9x、NT下只能是PFD_MAIN_PLANE。
共2页: 上一页 1 [2] 下一页
|
| |
|
[ 收藏]
[ 推荐]
[ 评论(0条)]
[返回顶部] [打印本页]
[关闭窗口] |
|
|
| |
|
|
|