Gamma 控件 (Direct3D 9)

Gamma 控件允许你更改系统显示图面内容的方式,而不会影响表面本身的内容。 将这些控件视为 Direct3D 在离开表面和在屏幕上呈现之前应用于数据的非常简单的筛选器。

Gamma 控件是交换链的属性。 使用 Gamma 控件可以动态更改表面的红色、绿色和蓝色级别映射到系统显示的实际级别的方式。 通过设置伽玛级别,你可以使用户的屏幕闪烁颜色-拍摄用户的角色时为红色,当字符选取新项目时为绿色,等等,而无需将新图像复制到帧缓冲区以实现效果。 或者,可以调整颜色级别,以将颜色偏差应用于后台缓冲区中的图像。

每个设备的隐式交换链) (始终至少有一个交换链,因为 Direct3D 9 有一个交换链作为设备的属性。 由于 gamma 渐变是交换链的属性,因此可以在交换链窗口化时应用 gamma 渐变。 伽玛渐变立即生效。 无需等待垂直同步操作。

通过 SetGammaRampGetGammaRamp 方法,可以在将像素从表面发送到数字到模拟转换器 (DAC) 进行显示之前,操作影响颜色的渐变级别。

Gamma 渐变级别

在 Direct3D 中,术语 gamma 渐变描述一组值,这些值将帧缓冲区中所有像素的特定颜色分量(红色、绿色、蓝色)的级别映射到 DAC 接收用于显示的新级别。 重新映射通过三个查找表执行,每个颜色分量各一个。

其工作原理如下:Direct3D 从帧缓冲区获取一个像素,并计算其单独的红色、绿色和蓝色分量。 每个组件由 0 到 65535 之间的值表示。 Direct3D 采用原始值,并使用它为 256 元素数组编制索引, (渐变) ,其中每个元素都包含一个替代原始值的值。 Direct3D 对帧缓冲区中每个像素的每个颜色分量执行此查找和替换过程,从而更改所有屏幕像素的最终颜色。

通过绘制渐变值来可视化这些值非常方便,如以下两个图所示。 左图显示了一个完全不修改颜色的渐变。 右图显示了一个渐变,该渐变对应用它的颜色分量施加负偏差。

gamma 渐变值的图

左侧图形的数组元素包含与其索引相同的值 - 在索引 0 处的元素中为 0,在索引为 255 处为 65535。 此类型的渐变是默认的,因为它不会在显示输入值之前更改这些值。 右图提供了更多的变化;其渐变包含的值范围从第一个元素中的 0 到最后一个元素中的 32768,值范围介于两者之间。 效果是使用此渐变的颜色分量在显示器上显示为静音。 不限于使用线性图;如果应用程序可以根据需要分配任意映射,则为 。 甚至可以将条目设置为所有零,以完全从显示器中删除颜色分量。

设置和检索 Gamma 渐变级别

Gamma 渐变级别是 Direct3D 用于将帧缓冲区颜色组件映射到要显示的新级别的有效查找表。 可以通过调用 SetGammaRamp 和 GetGammaRamp 方法来设置和检索主图面的坡 级别。 SetGammaRamp 接受两个参数, GetGammaRamp 接受一个参数。 对于 SetGammaRamp,第一个参数是 D3DSGR_CALIBRATE 或 D3DSGR_NO_CALIBRATION。 第二个参数 pRamp 是指向 D3DGAMMARAMP 结构的指针。 D3DGAMMARAMP 结构包含三个 256 个元素的 WORD 数组,每个数组包含红色、绿色和蓝色伽玛渐变。 GetGammaRamp 有一个参数,该参数将指针指向将使用当前伽玛斜坡填充的 D3DGAMMARAMP 类型。

可以包含 SetGammaRamp 的第一个参数的D3DSGR_CALIBRATE值,以便在设置新的伽玛级别时调用校准器。 校准伽玛斜坡会产生一些处理开销,不应经常使用。 无论显示适配器和监视器如何,设置校准的伽玛渐变都会为用户提供一致的绝对伽玛值。

并非所有系统都支持伽玛校准。 若要确定是否支持 gamma 校准,请调用 GetDeviceCaps,并在方法返回后检查关联的 D3DCAPS9 结构的 Caps2 成员。 如果存在D3DCAPS2_CANCALIBRATEGAMMA功能标志,则支持伽玛校准。

设置新的渐变级别时,请记住,仅在应用程序处于全屏独占模式时,才会使用在数组中设置的级别。 每当应用程序更改为正常模式时,将保留渐变级别,在应用程序恢复全屏模式时再次生效。

如果设备在交换链的当前演示模式 (全屏或窗口化) 中不支持伽玛坡度,则不会返回错误值。 应用程序可以在 D3DCAPS9 类型的 Caps2 成员中检查D3DCAPS2_FULLSCREENGAMMA和D3DCAPS2_CANCALIBRATEGAMMA功能位,以确定设备的功能以及是否安装了校准器。

Direct3D Surfaces