这章将在游戏中图像处理的讨论,扩展到技术和艺术上控制颜色的方法和应用,包括将图像从一些的色彩空间中移入移出,以及快速地给任何2D或3D场景加上精美的色调。
色彩校正(Color Correction)是几乎所有印刷和胶片成像应用的一部分。色彩校正可用于将彩色图像从一个色彩空间移动到另一个色彩空间。
我们在电视、杂志和电影中剪刀的大部分图像,都经过了非常小心的彩色校正和控制。对于这个过程的理解,可以帮助开发者在实时应用程序中得到同样华美的视觉效果。
色彩校正通常有两种做法:一是各个通道的校正,分别是改变红色、绿色和蓝色各成分;二是混色操作,基于红、绿、蓝各个成分的同时操作,得到每个通道的输出值。
色彩校正的机理可以简洁而容易地在一个shader中描述。重要的是,美术和程序员使用的普通工具就能有效地控制他们。在这章中,运用Photoshop创建控制资源,然后通过像素shader应用到实时程序中(敲重点)。
在Photoshop中提供了一些基于通道校正的工具。如级别(levels)和曲线(Curves)工具。
其中曲线是仿制了化学中的交叉处理(cross-processing)外观,确切地说,就是在C41化合物中处理E6叫绝所产生的假颜色外观。这样的处理已在印刷、电影和电视领域使用多年。
首先制作纹理
然后可以使用下面几行shader代码运用于输出颜色,使用色彩校正纹理映射,可以随意地用曲线工具重新创建任何色彩变化:
float3 InColor = tex2D(inSampler, IN.UV).xyz;
float3 OutColor;
OutColor.r = tex1D(ColorCorrMap, InColor.r).r;
OutColor.g = tex1D(ColorCorrMap, InColor.g).g;
OutColor.b = tex1D(ColorCorrMap, InColor.b).b;
也就是说,使用每个原始的红、绿和蓝像素的灰度值,确定在梯度纹理中我们寻找的相关位置,然后由梯度纹理本身定义对新颜色的重映射,即由复杂曲线调节所定义的新颜色,如下图。
可以通过把输入RGB值乘上一个矩阵进行不同彩色空间之间的转换。
float4 colorCubePS(vertexOutput IN,sampler2D ColorTex,float3x3 RGBxform) : COLOR {float3 texColor = tex2D(ColorTex, IN.UV);float3 result = mul(RGBxform, texColor);return float4(result, 1.0); }
关键词提炼】
颜色控制(Color Controls)
色彩校正(Color Correction)
基于通道的颜色校正(Channel-Based Color Correction)
灰度变换(Grayscale Conversion)
色彩空间变换(Color-Space Conversions)
图像处理(Image Processing)