原文轉自 http://hi.baidu.com/beyoar/item/4a74a89c26b80ede1f4271b6
表述像素格式:PIXELFORMATDESCRIPTOR
在OpenGL對窗口渲染之前,必須根據渲染需要對窗口進行配置。
需要硬件渲染還是軟件渲染?
渲染使用單緩衝還是雙緩衝?
是否需要深度緩衝區?
是否需要模板、目標Alpha或積累緩衝區?
當爲窗口設置這些參數之後,就無法對它們進行修改。爲了從一個只有深度緩衝和顏色緩衝區的窗口切換到一個帶有模板緩衝區的窗口,必須首先銷燬第一個窗口,然後根據需要重新創建一個窗口。
[ OpenGL]
PIXELFORMATDESCRIPTOR
The PIXELFORMATDESCRIPTOR structure describes the pixel format of a drawing surface.
typedef struct tagPIXELFORMATDESCRIPTOR
{ // pfd
WORD nSize; //結構大小: sizeof(PIXELFORMATDISCRIPTOR)
WORD nVersion; //版本:總設置爲1
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;
//************************************************************************
//設置窗口像素格式
//************************************************************************
GLuint PixelFormat; // Holds The Results After Searching For A Match
static PIXELFORMATDESCRIPTOR pfd= // pfd Tells Windows How We Want Things To Be
{
sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor
1, // Version Number
PFD_DRAW_TO_WINDOW | // Format Must Support Window
PFD_SUPPORT_OPENGL | // Format Must Support OpenGL
PFD_DOUBLEBUFFER, // Must Support Double Buffering
PFD_TYPE_RGBA, // Request An RGBA Format
32, // Select Our 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, // Accumulation Bits Ignored
16, // 16Bit Z-Buffer (Depth Buffer)
1, // No Stencil Buffer
0, // No Auxiliary Buffer
PFD_MAIN_PLANE, // Main Drawing Layer
0, // Reserved
0, 0, 0 // Layer Masks Ignored
};
if (!PixelFormat=ChoosePixelFormat(m_hDC,&pfd))) // Did Windows Find A Matching Pixel Format?
{
MessageBox("Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
if(!SetPixelFormat(m_hDC,PixelFormat,&pfd)) // Are We Able To Set The Pixel Format?
{
MessageBox("Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
.....