DirectX中提供了一个Gamma控制(从 5.0 开始的吗),利用它可方便的完成FadeIn、FadeOut的功能,而且不
需改动Surface的内容, 基本上不存在速度的问题。我这人特懒,打字也慢(真想有个秘书小姐,我说她打那就爽
了)我就简单的写点。
代码如下:(我已测试过)
// declare for gamma fadeout and fadein
// global var
LPDIRECTDRAWGAMMACONTROL lpDDGammaControl = NULL;
DDGAMMARAMP DDGammaRamp;
DDGAMMARAMP DDGammaOld;
// assume u have succeed create u main surface
// LPDIRECTDRAWSURFACE lpDDSPrimary = NULL;
// lpDDSPrimary point to u main surface
//------------------Get gamma control
(void **)&lpDDGammaControl);
//------------------------------------------------------
// this is fadeout and fadein function
void gfx_GammaFadeOut()
{
int nIndex;
int nIndex0;
if( lpDDGammaControl == NULL )
return;
lpDDGammaControl->GetGammaRamp(0, &DDGammaOld);
lpDDGammaControl->GetGammaRamp(0, &DDGammaRamp);
// Fade Out
for( nIndex0 = 256; nIndex0 >0; nIndex0 -= 4)
{
for( nIndex=0; nIndex < 256; nIndex++)
{
DDGammaRamp.red[nIndex] = DDGammaOld.red[nIndex]*nIndex0/256;
DDGammaRamp.blue[nIndex] =DDGammaOld.blue[nIndex]*nIndex0/256;
DDGammaRamp.green[nIndex] =DDGammaOld.green[nIndex]*nIndex0/256;
}
lpDDGammaControl->SetGammaRamp(0 , &DDGammaRamp);
} //end
for( nIndex=0; nIndex < 256; nIndex++)
{
DDGammaRamp.red[nIndex] =DDGammaOld.red[nIndex]*nIndex0/256;
DDGammaRamp.blue[nIndex] =DDGammaOld.blue[nIndex]*nIndex0/256;
DDGammaRamp.green[nIndex] =DDGammaOld.green[nIndex]*nIndex0/256;
}
lpDDGammaControl->SetGammaRamp(0 , &DDGammaRamp);
} //end for
}
代码还有点漏洞,就是你必须先调用DirectDraw对象的GetCaps函数以确认你的显卡支持Gamma Control想偷懒
就看看DxSdk 的 DirectX Device Viewer 工具。灵活的使用Gamma control还可以实现一些其他功能,我就不瞎扯
了。它的缺点是:没有软件模拟,只能在全屏下干活,主surface的位深度必须是16位以上。