像素格式——PIXELFORMATDESCRIPT、設備上下文、渲染上下文
在OpenGL對窗口進行渲染之前,必須根據渲染需要對窗口進行配置。
需要硬件渲染還是軟件渲染?
渲染使用但緩沖還是雙緩沖模式?
是否需要深度緩沖區?
是否需要模板、目標Alpha或累計緩沖區?
當為窗口設置這些參數之后,就無法對它們進行修改。為了從一個只有深度緩沖區和顏色緩沖區的窗口切換到一個帶有模板緩沖區的窗口,必須銷毀第一個窗口,然后根據需要重新創建一個窗口。
像素格式是OpenGL窗口的重要屬性,它包括是否使用雙緩沖區、顏色位數和類型以及深度位數等。像素格式可由Windows系統定義的所謂像素格式描述子結構來定義(PIXELFORMATDESCRIPTOR),該結構定義在Windows.h頭文件中。
在該結構中包含有26個屬性信息,其形式為:
typedef struct tagPIXELFORMATDESCRIPTOR { WORD nSize; //像素格式描述子結構的大小,sizeof(PIXELFORMATDESCRIPTOR)設定其值 WORD nVersion; //PIXELFORMATDESCRIPTOR結構的版本,一般設為1 DWORD dwFlags; //表明象素緩沖特性的標志位,如緩沖是否支持GDI或OpenGL等 BYTE iPixelType; //說明象素數據類型是RGBA還是顏色索引 BYTE cColorBits; //每個顏色緩沖區中顏色位平面的數目,對顏色索引方式是緩沖區大小 BYTE cRedBits; //每個RGBA顏色緩沖區中紅色位平面的數目 BYTE cRedShift; //每個RGBA顏色緩沖區中紅色位平面的偏移數 BYTE cGreenBits; //每個RGBA顏色緩沖區中綠色位平面的數目 BYTE cGreenShift; //每個RGBA顏色緩沖區中綠色位平面的偏移數 BYTE cBlueBits; //每個RGBA顏色緩沖區中藍色位平面的數目 BYTE cBlueShift; //每個RGBA顏色緩沖區中藍色位平面的偏移數 BYTE cAlphaBits; //每個RGBA顏色緩沖區中alpha位平面的數目(保留的,現不支持) BYTE cAlphaShift; //每個RGBA顏色緩沖區中alpha位平面的偏移數(保留的,現不支持) BYTE cAccumBits; //累加緩沖區中全部位平面的數目 BYTE cAccumRedBits; //累加緩沖區中紅色位平面的數目 BYTE cAccumGreenBits; //累加緩沖區中綠色位平面的數目 BYTE cAccumBlueBits; //累加緩沖區中藍色位平面的數目 BYTE cAccumAlphaBits; //累加緩沖區中alpha位平面的數目 BYTE cDepthBits; // Z(深度)緩沖區的深度 BYTE cStencilBits; //模板緩沖區的深度 BYTE cAuxBuffers; //軸向緩沖區的數量(一般1.0版本不支持) BYTE iLayerType; //被忽略,為了一致性而包含的 BYTE bReserved; //表層和底層平面的數量::位0-3表最多15層表層平面,位4-7表底層 DWORD dwLayerMask; //被忽略,為了一致性而包含的 DWORD dwVisibleMask; //是透明色彩的值(RGBA方式)或是一個底層平面的索引(Index) DWORD dwDamageMask; //被忽略,為了一致性而包含的 } PIXELFORMATDESCRIPTOR;
具體設置渲染窗體像素格式的方法如下所示:
1 //像素格式告訴OpenGL是否使用雙緩存,顏色模式,顏色位數,深度位數等等重要信息。 2 //它由一個被稱作PIXELFORMATDESCRIPTOR的所描述。 3 static PIXELFORMATDESCRIPTOR pixelDesc={sizeof(PIXELFORMATDESCRIPTOR), //pfd結構的大小 4 1, //版本號 5 PFD_DRAW_TO_WINDOW| //支持在窗口中繪圖 6 PFD_SUPPORT_OPENGL| //支持OpenGL 7 PFD_DOUBLEBUFFER, //雙緩存模式 8 PFD_TYPE_RGBA, //RGBA顏色模式 9 32, //32位顏色深度 10 0,0,0,0,0,0, //忽略顏色位 11 0, //沒有非透明度緩存 12 0, //忽略移位位 13 0, //無累計緩存 14 0,0,0,0, //忽略累計位 15 32, //32位深度緩存 16 1, //模板緩存 17 0, //無輔助緩存 18 PFD_MAIN_PLANE, //主層 19 0, //保留 20 0,0,0 //忽略層,可見性和損毀掩膜 21 }; 22 23 24 25 //為設備描述表得到最匹配的像素格式 26 if(!(pixelFormat=ChoosePixelFormat(hDC,&pixelDesc))) 27 { 28 MessageBox(_T("ChoosePixelFormat failed!")); 29 return false; 30 } 31 32 //設置最匹配的像素格式為當前的像素格式 33 if(!SetPixelFormat(hDC,Fixelformat,&pixelDesc)) 34 { 35 MessageBox(_T("SetPixelFormat failed!")); 36 return false; 37 }
值得一提的是,這里的獲取設備上下文hDC的具體方法如下(緊接上一篇《MFC dialog程序中加入OpenGL窗體》):
1 /**********************************************************/ 2 //獲取設備上下文 3 CWnd *wnd=GetDlgItem(IDC_RENDER); //IDC_RENDER為pictureContorl控件的ID號 4 hrenderDC=::GetDC(wnd->m_hWnd); 5 /**********************************************************/
繼續,在設置完設備上下文的像素格式之后,需要設置渲染上下文HGLRC hrenderRC,具體方法如下:
1 //渲染上下文hRC 2 BOOL COpenGLTest1Dlg::CreateViewGLContext(HDC hDC) 3 { 4 if(!(hrenderRC = wglCreateContext(hDC))); 5 { 6 MessageBox(_T("CreateContext failed!")); 7 return false; 8 } 9 10 if(!(wglMakeCurrent(hDC,hrenderRC))) 11 { 12 MessageBox(_T("MakeCurrent failed!")); 13 return false; 14 } 15 16 return TRUE; 17 }
完成了上述操作之后,即可在OpenGL的渲染上下文窗體上開啟您的繪圖工作了!