像素格式——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的渲染上下文窗体上开启您的绘图工作了!