Gamma及色彩控制

这部分包含DirectDrawSurface对象使用的Gamma及色彩控制。有以下主题:

注意:
你不要尝试在一个平面上同时使用IDirectDrawGammaControl及IDirectDrawColorControl界面。 在一起使用时其效果是无法表达的。

什么是Gamma及色彩控制?

通过Gamma及色彩界面,DirectDrawSurface对象能改变系统如何在平面上显示图形, 而无须改变平面本身。你可以想象这些控制为非常简单的过滤,DirectDraw在数据从平面被绘制到平面时改变它。 平面对象通过IDirectDrawGammaControl及IDirectDrawColorControl界面来调整平面内容如何被过滤。 你可以通过IUnknown::QueryInterface宏来获得目标的指针, 来指定IID_IDirectDrawGammaControl或IID_IDirectDrawColorControl关联标识符。

Gamma控制,是通过IDirectDrawGammaControl界面,使你可以动态改变系统显示平面的单独的红, 绿,蓝层次(阶)图。通过设置Gamma层次,你可以当人物在射击时使使用者的屏幕突然变红, 或在拣起什么新物品时变绿,等等,无需Blit新图象到帧缓冲而完成特效。或者, 你可能调整色彩层次来和帧缓冲中的图象混合。尽管这个界面和色彩控制非常相似, 而这是更简单的,是游戏程序最好的选择。详见使用Gamma控制。

IDirectDrawColorControl界面允许你控制平面色彩,更像你在电视上看到的色彩控制。 IDirectDrawColorControl与TV控制相似之处是没有错误-- 这个界面更适合来调整一个重叠平面的视频播放效果,这种情况看上去更像控制多余色。 你可以使用色彩控制来允许使用者改变一些图形特性如色调,饱和度,对比,及其他特性。详见使用色彩控制。

使用Gamma控制

IDirectDrawGammaControl界面,你可以通过查询平面来获得并设置 IID_IDirectDrawGammaControl关联标识符,允许你在显示卡将数据传递到数字模拟转换器 (Digital-to-analog converter DAC)前通过斜面层次来操作平面像素的红,绿,蓝值。 虽然所有的平面类型都支持IDirectDrawGammaControl界面, 但你只能被允许调整主平面的Gamma。尝试在其他非主平面调用 IDirectDrawGammaControl::GetGammaRamp或IDirectDrawGammaControl::SetGammaRamp都将失败。

在以下主题,这部分将描述斜面层次(Ramp Level)的主要概念, 并提供如何使用IDirectDrawGammaControl来操作这些层次:

关于Gamma的斜面层次

一个DirectDraw Gamma斜面是一个术语,是用来描述 设置帧缓冲的所有像素的一个特殊色彩组成的值 (红,绿,蓝)的斜面图层到一个新的层次然后通过显卡的Digital-to-analog Converter(DAC) 输出到监视器。通过三个简单查看所得的表格来完成重新映射,每个色彩一个。

这里是它的工作方法:DirectDraw从帧缓冲取得一个像素,分析它单独的红色, 绿色,蓝色部分。每个部分表现为一个0到65535之间的值。DirectDraw获得原来值, 并使用它遍入一个256个元素的队列,每个元素包含一个值来替换原来值。 DirectDraw为帧缓冲中的每个像素的每个色彩部分提供这个"查看并替换"过程, 从而最后改变整个屏幕上的所有像素。

用图形来表现斜面值将更直观。下面两幅图的左面那幅图形显示还未修改的所有色, 而右面图形则显示了减少斜线后的色彩部分。

3012 字节 左边图形的队列元素包含和它们索引一样的值(元素中的0就是索引值0,而65535是索引255)。 这类的斜面是默认的,也就是说在显示前它们不会被改变。右边的图形有点有趣, 它的斜面值从0元素开始到32768元素结束,并且两者有相同的距离值。 使用这个斜面的色彩组成使显示更暗。你在使用线性坐标图时毫无限制; 你程序需要任意的赋值映射,可以自由的选择。你甚至可以将所有的通道(色彩) 都设置为零来为显示获得一个完全特殊的色彩组合。

Gamma Ramp的支持测试

你可以通过调用IDirectDraw4::GetCaps宏来获得硬件是否支持动态Gamma斜线。 在调用后,如果在DDCAPS结构中的dwFlags2成员中有DDCAPS2_PRIMARYGAMMA标志, 则硬件支持动态Gamma斜线。DirectDraw是不会尝试模拟这个特性, 所以如果硬件不支持它,你就不能使用。

设置及获得Gamma斜面层次

Gamma斜面层次是DirectDraw使用有效的参考表来完成映射即将显示的帧缓冲的色彩组合到一个新的层次。 详见Gamma斜面层。你可以通过调用IDirectDrawGammaControl::SetGammaRamp 及IDirectDrawGammaControl::GetGammaRamp宏来设置或获得主平面的Gamma斜面层。 这两个宏都使用两个参数,但第一个参数被保留将来使用,应被设置为0。 第二个参数,lpRampData,是指向一个DDGAMMARAMP结构的地址。 DDGAMMARAMP结构包含三个WORD的256个元素的数组,分别包含红,绿,蓝三色的Gamma斜线。

你可以在调用IDirectDrawGammaControl::SetGammaRamp时包含DDSGR_CALIBRATE值来设置新的 Gamma层次时进行校准。在校准Gamma斜面会导致一些进程被挂起,而且不能被经常使用。 设置一次校准Gamma斜面会为观察者提供一个始终一致及绝对的Gamma值, 而不管使用什么显示适配器及监视器。并非所有系统都支持Gamma校准。 要获得Gamma校准是否被支持,调用IDirectDraw4::GetCaps,并在宏返回后查对DDCAPS结构中的dwCaps2成员。 如果DDCAPS2_CANCALIBRATEGAMMA性能标志存在,那么Gamma校准被支持。

当设置一个新的斜面层次,注意你设置的数组只能工作在全屏幕方式,独占模式。 不管什么时候,你将其改为普通窗口模式,斜面层次就被撇开了, 直到恢复到全屏模式才会再次有效。还有,记住你不能在其他平面上设置斜面层次,除了主平面。

注意:

那些非常熟悉Win32 API的人可能有疑问,为什么DirectDraw使用一个如IDirectDrawGammaControl的界面, 当Win32为同样的平面提供了GetDeviceGammaRamp及SetDeviceGammaRamp函数时, 他们并非在所有的Windows平台上被支持就如IDirectDrawGammaControl界面。

使用色彩控制

你可以通过IDirectDrawColorControl界面设置或获得色彩控制, 可以在查询DirectDrawSurface对象时使用IID_IDirectDrawColorControl关联标识。

色彩控制信息包含于DDCOLORCONTROL结构中,可以使用在以下两个界面的宏中, IDirectDrawColorControl::SetColorControls及IDirectDrawColorControl::GetColorControls。 第一个结构成员,dwSize,用来设置结构的尺寸,基于字节Byte。你如何使用下一个成员, dwFlags,是以你是设置还是获得色彩控制而不同。如果你设置新的色彩控制, 则设置dwFlags为一个混合的标志,它包含你设置的结构其他成员的有效数据。 不管怎样,当要获得色彩控制,你在使用它前,你无需设置dwFlags, 它的返回值会告诉你在调用IDirectDrawColorControl::GetColorControls宏后返回的其他有效成员。

剩下的DDCOLORCONTROL结构成员会包含一些描述如:亮度,对比度,色调,饱和度, 轮廓程度,伽玛,还有色彩是否被使用。注意:结构包含伽玛改变的信息。 这只是一个单一伽玛的值,这会影响包含亮度的一切,并且它不会改变由 IDirectDrawGammaControl界面提供的伽玛调整特性。


上篇|返回|下篇待序...

Lucker 1999.8.29
E-Mail: fred_cai@kali.com.cn

伽玛设置的确很有用,在下一次的译文中我将提供一个更改Gamma的程序。 你可以访问并可手动更改所有伽吗值。


云风工作室 制作