topameng's profileQuake3 启示录PhotosBlogListsMore Tools Help

Blog


    July 26

    PIXELFORMATDESCRIPTOR 格式说明

    像素格式明确了OpenGL绘制平面的特性,如象素缓冲区是单缓冲还是双缓冲,数据是 RGBA方式还是Color Index方式等。 每个OpenGL显示设备一般用名为PIXELFORMATDESCRIPTOR的结构来表示某个的像素 格式,这个结构包含26个属性信息。Win32定义PIXELFORMATDESCRIPTOR如下所示:
    typedef struct tagPIXELFORMATDESCRIPTOR
    { // pfd
      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;

    nSize是象素格式描述子结构的大小,sizeof(PIXELFORMATDESCRIPTOR)设定其值;
    nVersion是PIXELFORMATDESCRIPTOR结构的版本,一般设为1;
    dwFlags是一组表明象素缓冲特性的标志位,如缓冲是否支持GDI或OpenGL等;
    iPixelType 说明象素数据类型是RGBA还是颜色索引;
    cColorBits 每个颜色缓冲区中颜色位平面的数目,对颜色索引方式是缓冲区大小;
    cRedBits 每个RGBA颜色缓冲区中红色位平面的数目;
    cRedShift 每个RGBA颜色缓冲区中红色位平面的偏移数;
    cGreenBits 每个RGBA颜色缓冲区中绿色位平面的数目;
    cGreenShift每个RGBA颜色缓冲区中绿色位平面的偏移数;
    cBlueBits 每个RGBA颜色缓冲区中蓝色位平面的数目;
    cBlueShift 每个RGBA颜色缓冲区中蓝色位平面的偏移数;
    cAlphaBits 每个RGBA颜色缓冲区中alpha位平面的数目(保留的,现不支持);
    cAlphaShift每个RGBA颜色缓冲区中alpha位平面的偏移数(保留的,现不支持);
    cAccumBits 累加缓冲区中全部位平面的数目;
    cAccumRedBits 累加缓冲区中红色位平面的数目;
    cAccumGreenBits累加缓冲区中绿色位平面的数目;
    cAccumBlueBits 累加缓冲区中蓝色位平面的数目;
    cAccumAlphaBits累加缓冲区中alpha位平面的数目;
    cDepthBits   Z(深度)缓冲区的深度;
    cStencilBits  模板缓冲区的深度;
    cAuxBuffers 轴向缓冲区的数量(一般1.0版本不支持);
    iLayerType 被忽略,为了一致性而包含的;
    bReserved 表层和底层平面的数量::位0-3表最多15层表层平面,位4-7表底层;
    dwLayerMask 被忽略,为了一致性而包含的;
    dwVisibleMask 是透明色彩的值(RGBA方式)或是一个底层平面的索引(Index);
    dwDamageMask被忽略,为了一致性而包含的。

    常用值示例:
    PIXELFORMATDESCRIPTOR src =
    {
      sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
       1,                                           // version number
       PFD_DRAW_TO_WINDOW |     // support window
       PFD_SUPPORT_OPENGL |       // support OpenGL
       PFD_DOUBLEBUFFER,            // double buffered
       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
       24,                                       // 24-bit z-buffer
       8,                                        // 8-bit stencil buffer
       0,                                        // no auxiliary buffer
       PFD_MAIN_PLANE,              // main layer
       0,                                        // reserved
       0, 0, 0                                 // layer masks ignored
    };
     
    Windows提供了四个像素格式管理函数,分别介绍如下:
    (1) int ChoosePixelFormat(HDC hdc, PIXELFORMATDESCRIPTOR *ppdf)
    该函数比较传过来的像素格式描述和OpenGL支持的像素格式,返回一个最佳匹配的像素格式索引。该索引值可传给SetPixelFormat为DC设置像素格式。返回值为0表示失败。
    在比较像素格式时,匹配优先级顺序为像素格式描述子结构中的下述各域:
    dwFlags->cColorBits->cAlphaBits->cAccumBits
    ->cDepthBits->cStencilBits->cAuxBuffers->iLayerType
    硬件支持的像素格式优先。
    (2) int DescribePixelFormat(HDC hdc, int iPixelFormat, UINT nBytes,
    LPPIXELFORMATDESCRIPTOR *ppfd)
    该函数用格式索引iPixelFormat说明的像素格式来填写由ppfd所指向的像素格式描述子结构,利用该函数可以枚举像素格式。
    (3) int GetPixelFormat(HDC hdc)
    该函数用于获取hdc的格式索引。
    (4) BOOL SetPixelFormat(HDC hdc, int iPixelFormat,
    LPPIXELFORMATDESCRIPTOR *ppfd)
    该函数用格式索引iPixelFormat来设置hdc的像素格式。在使用该函数之前应该调用ChoosePixelFormat来获取像素格式索引。另外,OpenGL窗口风格必须包含WS_CLIPCHILDREN和WS_CLIPSIBLINGS类型,否则设置失败。
    应该注意的是ChoosePixelFormat函数并不一定返回一个最佳的像素格式值,可以利用DescribePixelFormat来枚举系统所支持的所有像素格式。OpenGL的通常支持24种不同的像素格式,如果系统安装了OpenGL硬件加速器,它可能会支持其它的像素格式。