hdrp是通过computeshader来处理颜色映射的,让效果能够更生动。
执行的computeshader是PostProcessing下的LutBuilder3D.compute的KBuild内核。
AlexaLogC色彩空间
首先要将颜色值映射到AlexaLogC的空间,主要目的是要一个能到58.85666大小的颜色空间,方便后面计算。这个调色空间可以让色彩生成更明亮的效果。
如果_Params.x大于0则执行颜色映射,执行ColorGrade。
在ColorGrade里面首先为了计算正确先转到线性空间LogCToLinear。
LMS空间
然后会转到LMS色彩空间LinearToLMS,LMS空间是由人眼的三种锥体的响应表示的颜色空间,以其在长波长,中波长和短波长处的响应度(灵敏度)峰命名。
转到LMS后目的是乘上一个LMS三个颜色波长的偏移_ColorBalance。做完偏移计算再转回线性空间LMSToLinear。LMS合线性空间的转换都再Color.hlsl涨做的,实际上就是一个矩阵转换。
ACES空间
然后如果有用学院色彩空间ACES则执行ACES_to_ACEScc,这里主要是经验值转化。如果不用学院派色彩则直接转回LogC空间。
后面是对logC空间的值做一些学院派灰度偏移。
然后再根据是否使用学院派色彩ACES,如果用了则经验值转回到线性空间ACES_to_ACEScg,如果不是学院派则直接logC转到线性空间LogCToLinear。
gamma空间模拟adobe做法
后面因为想让颜色处理跟adobe的处理方式一样,所以要转一次到gamma空间去运算。
运算的方式是获取色彩亮度GetLuminance,让亮度的反向值做权重给阴影过度。
让亮度的正向值做权重给高光过度。
然后用gamma颜色合高光以及阴影做非线性的混合,目的是得到长尾的渐变。
然后转到线性空间再跟红绿蓝的偏移做点乘得到各个通道的偏移的值。
阴影高光的混合
之后根据用户给的阴影范围,高光范围及中间值,用线性空间的亮度做曲面插值混合起来。
然后做一些颜色增益
HSV空间
接下来就是对颜色做一些hsv空间的颜色变化。
色调用_CurveHueVsSat采样hsv.x然后获取他的2倍信息。
饱和度用_CurveSatVsSat采样hsv.然后获取他的2倍信息。
明度直接拿线性空间的亮度为他的采样值然后获取他的2倍信息。
做完后再根据偏移对色调做一些偏移。
然后全局的饱和度用_HueSatCon.yyy也做一些偏移。
YRGB空间
然后开始在YRGB色彩空间做处理。在调色过程中,应用DaVinci Resolve YRGB色彩管理功能,可使调色流程更加科学、调色工作更加高效。
他的做法是先快速色彩变化FastTonemap,做法是让颜色除rgb中最大的一个值让他在0-1中
然后他回分Y和RGB两个方式来处理。
Y的处理是在_CurveMaster中对c的r、g、b采样。
RGB的处理是在_CurveRed、_CurveGreen、_CurveBlue分别采样。最终的颜色乘在一起。
再通过FastTonemapInvert让他转回到线性空间,就是FastTonemap的反向做法,乘上rgb中最大的值。
最后让他不能为负值Max。完成整个ColorGrade的处理。
最后的Tonemap
做完ColorGrade的颜色要做一次Tonemap。
有几种方式做Tonemap。NeutralTonemap,CustomTonemap,ACEScg_to_ACES,logC空间映射。
NeutralTonemap
NeutralTonemap模式是NeutralCurve曲线实现的,NeutralCurve曲线公式是
他的目的是解决色彩的白点问题。C是颜色通道,e是曝光偏置w是白点。它会产生s型曲线,底部区域从黑色向上弯曲到中间的线形部分,结束于肩区域,当它接近白色时变平。
CustomTonemap
也是对白色的点做平衡处理。
ACEScg_to_ACES
这里则是用学院派的经验值直接设置的颜色。
logC空间映射
他是通过转到LogC空间,然后执行ApplyLut3D采样_LogLut3D的颜色做的颜色映射。
最终输出颜色。