|
发表于 2009-10-16 21:34:00
|
显示全部楼层
Re:opengl中如何将单缓冲改成双缓冲
bool CGraphicsEngine: ock( HWND hWnd )
{
if( NULL == hWnd )return false;
m_hWnd = hWnd;
m_hDC = ::GetDC( m_hWnd );
if( NULL == m_hDC )return false;
PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR),// pfd结构的大小
1, // 版本号
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
// 支持在窗口中绘图
// 支持 OpenGL
// 双缓存模式
PFD_TYPE_RGBA, // RGBA 颜色模式
32, // 颜色深度
0, 0, 0, 0, 0, 0, // 忽略颜色位
0, // 没有透明度缓存
0, // 忽略移位位
0, // 无累积缓存
0, 0, 0, 0, // 忽略累积位
32, // z缓存深度
0, // 无模板缓存
0, // 辅助缓存数为0全
PFD_MAIN_PLANE, // 主层
0, // 保留
0, 0, 0 }; // 忽略层,可见性和损毁掩模
int iPixelFormat = 0;
do{
iPixelFormat = ::ChoosePixelFormat( m_hDC, &pfd );//选择像素格式
: escribePixelFormat( m_hDC, iPixelFormat, sizeof(pfd), &pfd );
}while( ( 0 != ( pfd.dwFlags & PFD_GENERIC_FORMAT ) ) ||
( 0 != ( pfd.dwFlags & PFD_GENERIC_ACCELERATED ) ) );
::SetPixelFormat( m_hDC, iPixelFormat, &pfd ); //设置像素格式
if( pfd.dwFlags & PFD_NEED_PALETTE )
{
struct
{
WORD Version;
WORD NumberOfEntries;
PALETTEENTRY aEntries[256];
} logicalPalette = { 0x300, 256 };
BYTE reds[] = {0, 36, 72, 109, 145, 182, 218, 255};
BYTE greens[] = {0, 36, 72, 109, 145, 182, 218, 255};
BYTE blues[] = {0, 85, 170, 255};
for (int colorNum=0; colorNum<256; ++colorNum)
{
logicalPalette.aEntries[colorNum].peRed = reds[colorNum & 0x07];
logicalPalette.aEntries[colorNum].peGreen = greens[(colorNum >> 0x03) & 0x07];
logicalPalette.aEntries[colorNum].peBlue = blues[(colorNum >> 0x06) & 0x03];
logicalPalette.aEntries[colorNum].peFlags = 0;
}
m_hPalette = ::CreatePalette ((LOGPALETTE*)&logicalPalette); //设置逻辑调色板
}
m_hRC = ::wglCreateContext( m_hDC );
if( NULL == m_hRC )
{
return false;
}
if( !( ::wglMakeCurrent( m_hDC, m_hRC ) ) )
{
return false;
}
return true;
} |
|