Unity

Unity颜色矫正实现方法

最近美术提出项目中的画面饱和度不够,于是在摄像机上添加了ColorCorrectionCurves效果,该效果是Unity标准资源中自带的,这里只是简要说明一下它的实现方式。本次使用只是单纯提升画面饱和度,因此并没有用到其中的高级选项。在高级选项中,我们可以调整不同深度的色彩饱和度,以打到模拟大气散射导致的远处物体饱和度下降的效果。下面只分析简化版部分,其他部分大同小异:

首先,脚本导出了几个参数:

 

 

三条曲线控制器,分别代表RGB每个颜色通道下,控制饱和度的输入输出函数。横坐标代表原颜色值,纵坐标表示校正后的颜色值。如下图所示的曲线代表低色值部分会变得更低,而高色值部分会变的更高。从而拉大颜色差距,提升饱和度。saturation 是用来直接调节饱和度的系数。1.0表示饱和度不变。

color_correction_curves2

接下来,在每次游戏画面渲染完成后,通过改写MonoBehaviour中

void OnRenderImage (RenderTexture source, RenderTexture destination)

接口处理渲染后的画面。

脚本中的处理代码如下:

 

 

这段代码是将三段曲线分别进行255次均匀采样,生成如下图所示的一张灰度图(使用到的像素):

color_correction_curves3

第一行的每一个像素的亮度(rgb中的任意一个值),都对应红色曲线对应的y坐标。第二行绿色曲线,第三行蓝色曲线。这张贴图就代表了上面的那三条曲线。下面的代码把这张贴图和饱和度参数传入到Shader中:

 

下面来看在Shader中是怎么用的,在FragmentShader中:

 

 

校正效果如下,

校正前:

color_correction_curves1

校正后:

color_correction_curves