opengl像素格式

来源:互联网 发布:青辰软件 编辑:程序博客网 时间:2024/05/21 10:41

1.Windows下的调色板
         OpenGL可以使用16色、256色、64K16M真彩色。真彩模式下不需要调色板,而在16色模式下根本不可能得到较为满意的效果,因此对OpenGL而言,调色板只有在256色模式下才有意义。

         我们知道,Windows把调色板分为系统调色板和逻辑调色板。每个应用程序都拥有一套自己的逻辑调色板(或使用缺省调色板),当该应用程序拥有键盘输入焦点时可以最多使用从16M种色彩中选取的256种颜色(20种系统保留颜色和236种自由选取的颜色),而失去焦点的应用程序可能会有某些颜色显示不正常。系统调色板由Windows内核来管理,它是由系统保留的20种颜色和经仲裁后各个应用程序设置的颜色组成,并与硬件的256个调色板相对应。应用程序的逻辑调色板与硬件的调色板没有直接的对应关系,而是按照最小误差的原则映射到系统调色板中,因此即使应用程序自由选取256种不同颜色构成自己的逻辑调色板,也有可能某些颜色显示到屏幕上时是一样的。
         当应用程序的窗口接收到键盘输入焦点时,Windows会向它发送一条WM_QUERYNEWPALETTE消息,让它设置自己的逻辑调色板,此时Windows会在系统调色板中尽量多地加入该应用程序需要的颜色,并生成相应的映射关系。接着Windows会向系统中所有的覆盖型窗口和顶级窗口(包括拥有键盘输入焦点的窗口)发送一条WM_PALETTECHANGED消息,让它们设置逻辑调色板和重绘客户区,以便能更充分地利用系统调色板,已拥有键盘输入焦点的窗口不应再处理这条消息,以避免出现死循环。

2.OpenGL的颜色表示与转换

         OpenGL内部用浮点数来表示和处理颜色,红绿蓝和Alpha值这四种成份每种的最大值为1.0,最小值为0.0。在256色模式下,OpenGL把一个像素颜色的内部值按线性关系转换为8比特(Bit)来输出到屏幕上,其中红色占最低位的3比特,绿色占中间的3比特,蓝色占最高位的2比特,Windows将这个8比特值看作逻辑调色板的索引值。例如OpenGL的颜色值(1.00.140.6667)经过转换后二进制值为10001111(红色为111,绿色为001,蓝色为10),即第143号调色板,该调色板指定的颜色的RGB值应与(1.00.140.6667)有相同的比率,为(25536170),如果不是该值,那么显示出来的颜色就会有误差。

3.调色板的生成算法

        很明显,OpenGL输出的8比特值中直接表明了颜色的组成,为了使图形显示正常,我们应以线性关系来设置逻辑调色板,使其索引值直接表明颜色的组成。因此生成调色板时,把索引值从低位到高位分成3-3-2共三个部分,将每一部分映射到0-255中去,这样3比特映射为{03673109146182219255},2比特映射为{085170255},最后把三部分组合起来成为一种颜色。
        经过上面的处理后,256种颜色均匀分布在颜色空间中,并没有完全包含系统保留的20种颜色(只包含了7种),这意味着将会有数种颜色显示成一样,从而影响效果。一个较好的解决办法是按照最小均方误差的原则把13种系统颜色纳入到逻辑调色板中。

        从原理上来说,并非一定要使用线性映射,还可以用其它一些映射关系,如加入Gamma校正以便更能符合人眼的视觉特性,不过这些映射关系应用得并不广泛,在此不再讨论。

1像素格式设置

        像素格式是OpenGL窗口的重要属性,它包括是否使用双缓冲,颜色位数和类型以及深度位数等。像素格式可由Windows系统定义的所谓像素格式描述子结构来定义(PIXELFORMATDESCRIPTOR),该结构定义在windows.h中。
在该结构中包含有26个属性信息,其形式为:
typedef structtagPIXELFORMATDESCRIPTOR
{

WORD nSize;该结构所占内存空间。

WORD nVersion;版本号,当前为1

DWORD dwFlags;

                  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


BYTE iPixelType;
像素颜色模式,可选项为PFD_TYPE_RGBAPFD_TYPE_INDEX,分别对应于RGBA模式和颜色索引模式。

BYTE cColorBits;指定颜色的位数。
BYTE cRedBits;
采用RGBA模式时,红色组分占用位数
BYTE cRedShift;
采用RGBA模式时,红色组分占偏移量

BYTE cGreenBits;采用RGBA模式时,绿色组分占用位数
BYTE cGreenShift;
采用RGBA模式时,绿色组分偏移量
BYTE cBlueBits;
BYTE cBlueShift;
BYTE cAlphaBits;
采用RGBA模式时,Alpha组分占用位数。
BYTE cAlphaShift;
采用RGBA模式时,Alpha组分偏移量。
BYTE cAccumBits;指定累积缓冲区表示一个像素所用位数。
BYTE cAccumRedBits;
定累积缓冲区表示红色组分占用位数。
BYTE cAccumGreenBits;指定累积缓冲区表示绿色组分占用位数。
BYTE cAccumBlueBits;
指定累积缓冲区表示蓝色组分占用位数。
BYTE cAccumAlphaBits;
指定累积缓冲区表示Alpha组分占用位数
BYTE cDepthBits;
指定深度缓冲区表示一个像素所用位数。
BYTE cStencilBits;
指定模板缓冲区表示一个像素所用位数。
BYTE cAuxBuffers;
指定辅助缓冲区,Windows9xNT不支持
BYTE iLayerType; Windows9x
NT下只能是PFD_MAIN_PLANE
BYTE bReserved; 
0
DWORD dwLayerMask;指定覆盖层的屏蔽,Windows9xNT不支持
DWORD dwVisibleMask; Windows9x
NT不支持
DWORD dwDamageMask; Windows9x
NT不支持

} PIXELFORMATDESCRIPTOR;


Windows提供了四个像素格式管理函数,分别介绍如下:

intChoosePixelFormat(HDC hdc,PIXELFORMATDESCRIPTOR *ppdf)

        该函数比较传过来的像素格式描述和OpenGL支持的像素格式,返回一个最佳匹配的像素格式索引。该索引值可传给SetPixelFormatDC设置像素格式。返回值为0表示失败。
在比较像素格式时,匹配优先级顺序为像素格式描述子结构中的下述各域:
dwFlags>cColorBits>cAlphaBits>cAccumBits>cDepthBits>cStencilBits>cAuxBuffers>iLayerType
硬件支持的像素格式优先。


int DescribePixelFormat(HDC hdc,int iPixelFormat, UINT nBytes, LPPIXELFORMATDESCRIPTOR*ppfd)

        该函数用格式索引iPixelFormat说明的像素格式来填写由ppfd所指向的像素格式描述子结构,利用该函数可以枚举像素格式。


int GetPixelFormat(HDC hdc)
       该函数用于获取hdc的格式索引。


BOOL SetPixelFormat(HDC hdc, intiPixelFormat, LPPIXELFORMATDESCRIPTOR *ppfd)

        该函数用格式索引iPixelFormat来设置hdc的像素格式。在使用该函数之前应该调用ChoosePixelFormat来获取像素格式索引。另外,OpenGL窗口风格必须包含WS_CLIPCHILDRENWS_CLIPSIBLINGS类型,否则设置失败。
应该注意的是ChoosePixelFormat函数并不一定返回一个最佳的像素格式值,可以利用DescribePixelFormat来枚举系统所支持的所有像素格式。OpenGL的通常支持24种不同的像素格式,如果系统安装了OpenGL硬件加速器,它可能会支持其它的像素格式。