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(十三):颜色分级的主要内容,如果未能解决你的问题,请参考以下文章