Unity自定义SRP(十三):颜色分级

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity自定义SRP(十三):颜色分级相关的知识,希望对你有一定的参考价值。

参考技术A https://catlikecoding.com/unity/tutorials/custom-srp/color-grading/

​ shader中添加 ColorGrade 方法:

​ 添加一个不进行色调映射pass,在每个色调映射pass中进行颜色分级:

​ 在 PostSettings 中添加 ColorAdjustmentsSettings 结构体:

​ 添加属性:

​ 我们将 DoToneMapping 更名为 DoColorGradingAndToneMapping ,并添加一个 ConfigureColorAdjustments 来配置颜色调整:

​ 我们将一些颜色属性提前调整到合适的范围:

​ 将颜色减去中间灰度值,然后通过对比度进行缩放,然后加上中间灰度值,中间灰度值为0.4135884:

​ 最好的效果是在对数空间进行:

​ 对比度增加可能获得负的颜色值:

​ 使用 RgbToHsv 将颜色转换为HSV的,然后平移色相,并使用 RotateHue 保证色相不会超出范围,最后转换为RGB:

​ 首先使用 Luminance 获得颜色的亮度,然后调整:

​ 新建 WhiteBalanceSettings 结构体,包含色温和颜色属性:

​ 创建 ConfigureWhiteBalance 方法,我们可以使用 ColorUtils.ColorBalanceToLMSCoeffs 来设置白平衡:

​ shader中,首先将颜色转换到LMS空间,然后应用白平衡,之后回到线性空间:

​ 用于单独着色阴影和高光。

​ 设置:

​ ConfigureSplitToning :

​ shader中,我们在gamma空间执行分离色调,然后回到线性空间:

​ 设置:

​ 配置:

​ shader中执行:

​ 设置:

​ 配置:

​ shader:

​ 使用ACES色调映射时,Unity会在ACES中执行大部分颜色分级操作来得到更好的效果,我们也这么支持。加入 useACES 布尔参数:

​ 加入 Luminance 变体:

​ 在 ColorGradeSplitToning , ColorGradingShadowsMidtonesHighlights , ColorGradingSaturation 中调用。

​ 在 ColorGrade 中加入参数,并在最后选择是否使用ACES颜色空间:

​ 逐像素执行所有的颜色分级步骤是很耗性能的,我们引入LUT,即查找表。将颜色分级烘培到LUT中,然后采样来转换颜色。

​ 支持多种不同分辨率的LUT, CustomRenderPipelineAsset 中:

​ 在所有的对应文件中添加相应的参数和变量。

​ LUT是3D纹理,但一般的shader不能渲染到3D纹理中,我们可以用一个长条2D纹理来模拟3D纹理。LUT纹理的高为可配置的分辨率,宽为分辨率的平方。在 DoColorGradingAndToneMapping 中定义渲染纹理:

​ 现在我们将颜色分级和色调映射渲染到LUT中。:

​ 为创建一个恰当的LUT,我们需要使用一个颜色转换矩阵来填充。添加 GetColorGradedLUT 方法,我们使用 GetLutStripValue 方法来获得LUT输入颜色:

​ 在所有的色调映射pass中应用。

​ _ColorGradingLUTParamenters 的四个参数为LUT高,0.5/宽,0.5/高,高/高-1:

​ 为支持HDR,LUT中的颜色最好为对数空间的。我们可以引入一个布尔值来判断:

​ 如果应用了HDR就是用对数空间:

​ 创建最终pass,来应用LUT的颜色分级:

​ 在 ApplyColorGradingLUT 中,调用 ApplyLut2D 方法:

​ 此时的参数应该为1/LUT宽,1/高,高-1,在最后的绘制前设置:

以上是关于Unity自定义SRP(十三):颜色分级的主要内容,如果未能解决你的问题,请参考以下文章

Unity自定义SRP(十四):抗锯齿和缩放渲染

Unity自定义SRP(七):LOD和反射

Unity自定义SRP(五):烘培光

可编程脚本渲染管线SRP

Unity开坑之模型定制自定义插件UMA

iOS 子视图、SRP 和自定义事件