前2天老许和我抱怨wow运行起来太暗,我也一直觉得不太适应,就建议他提高下屏幕的Gamma,他嫌换了以后其他窗口又太亮。本来我一直以为Gamma值的调整涉及到驱动,今天早上在看资料的时候看到原来有API,函数原形如下:
BOOL WINAPI GetDeviceGammaRamp(
HDC hDC,
LPVOID lpRamp
);
BOOL WINAPI SetDeviceGammaRamp( HDC hDC, LPVOID lpRamp );
其中lpRamp指向的是一个3x256的WORD型数组,内部存放的是需要Gamma校正的梯度,范例如下:
void * lpGamma = NULL;
WORD gMap[3][256] = {0};
lpGamma = &gMap;
HDC hdc = ::GetDC(NULL);
::GetDeviceGammaRamp(hdc, lpGamma); //得到当前Gamma
for (INT i = 0; i < 256; i++)
{
gMap[0][i] = 256*i;
gMap[1][i] = 256*i;
gMap[2][i] = 256*i;
}
::SetDeviceGammaRamp(hdc, lpGamma); //设为标准Gamma
Gamma校正的应用还是比较广的,除了前面提到的亮度调整以外,很多游戏的特效也是如此,比如回忆镜头中的快照回放连接,主角失去意识后屏幕的渐暗效果等。其校正原理可以参见(http://blog.youkuaiyun.com/Jaredz/archive/2006/06/28/847173.aspx)