This page was last modified 08:53, 9 July 2007.
OpenGL:根据显示模式选择正确的配置信息
From Forum Nokia Wiki
- 设备, 软件 版本:
S60 3rd Edition and FP1
- 详细描述:
自从手机支持不同的显示模式后,我们为当前使用的显示模式选择一个适当的EGL帧缓冲就显得尤为重要了。
举例来说,假设目前显示模式为EColor64K,EColor64K显示模式使用的RGBA5650格式,也就是说,每个像素16bit,红色5位,蓝色6位,绿色5位,Alpha透明0位。
如下代码所示,检查一下当前显示模式,然后选择帧缓冲:
TDisplayMode mode = Window().DisplayMode();
TInt BufferSize = 0;
switch(mode)
{
case( EColor64K ):
BufferSize = 16;
break;
...
}
根据相面属性选择适当配置信息:
const EGLint attrib_list[] =
{
EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
EGL_BUFFER_SIZE, BufferSize,
EGL_RED_SIZE, 5,
EGL_GREEN_SIZE, 6,
EGL_BLUE_SIZE, 5,
EGL_ALPHA_SIZE, 0,
EGL_DEPTH_SIZE, EGL_NONE
};
然后使用:
eglChooseConfig( iEglDisplay, attrib_list, configList, configSize, &numOfConfigs );
可能会返回RGBA8880配置信息,因为结果是被过滤过的,其属性可能等于或大于请求值。如果configList中第一个配置信息被选中,结果可能和当前显示模式不匹配,这种情况下,绘制将会发生错误,导致空白屏幕出现。
- 解决方案:
使用下列代码来过滤返回的配置信息列表:
for ( TInt i = 0; i < numOfConfigs; i++ )
{
EGLint red, green, blue, alpha;
eglGetConfigAttrib( iEglDisplay, configList[i], EGL_RED_SIZE, &red );
eglGetConfigAttrib( iEglDisplay, configList[i], EGL_GREEN_SIZE, &green );
eglGetConfigAttrib( iEglDisplay, configList[i], EGL_BLUE_SIZE, &blue );
eglGetConfigAttrib( iEglDisplay, configList[i], EGL_ALPHA_SIZE, &alpha );
if ( red == 5 && green == 6 && blue == 5 && alpha == 0 )
{
iSelectedConfig = configList[i];
break;
}
}
