【TA】Unity后效进SP(Unity和SP效果对齐)

SP基础的后处理效果和Unity对齐。

本文为原创内容,转载请注明地址。

在调整完我们的基础后效时(即明确Lookdev场景后),模型颜色在SP和Unity层面就存在色差,本篇的目的是在基础的后效处理后

实现

unity在后处理阶段的所有处理,会被整合为一张LUT图,输出后通过ColorGrading来进行后效的叠加。

image-20250303193532018

很巧的是SP支持LUT图的添加,因此我们如果能直接拿到unity的LUT图处理方式,根据SP的LUT格式输出,然后在SP中使用这张LUT图,那么就能实现SP后效和Unity的对齐。

拿到一张标准的SP格式的LUT图(在SP的文件夹里可以找到)

image-20250303194219603

unity相关对后处理的处理在LutBuildHdr.shader中存在。可以根据这个复刻。后处理参数在shader中属于全局参数,因此可以很容易地拿到。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
RenderTexture destination=new RenderTexture(source.width, source.height, 0);  //
//Shader sd = AssetDatabase.LoadAssetAtPath<Shader>("Assets/shaders/ColorToGradient.shader");
Shader sd = Shader.Find("Custom/PostprocessLUT");
Material mt = new Material(sd);

var stack = VolumeManager.instance.stack;
Debug.Log(stack);
// // Fetch all color grading settings
var channelMixer = stack.GetComponent<ChannelMixer>();
var colorAdjustments = stack.GetComponent<ColorAdjustments>();
var curves = stack.GetComponent<ColorCurves>();
var liftGammaGain = stack.GetComponent<LiftGammaGain>();
var shadowsMidtonesHighlights = stack.GetComponent<ShadowsMidtonesHighlights>();
var splitToning = stack.GetComponent<SplitToning>();
var tonemapping = stack.GetComponent<Tonemapping>();
var whiteBalance = stack.GetComponent<WhiteBalance>();


// Prepare data
//省略
switch (tonemapping.mode.value)
{
case TonemappingMode.Neutral: mt.EnableKeyword(ShaderKeywordStrings.TonemapNeutral); break;
case TonemappingMode.ACES: mt.EnableKeyword(ShaderKeywordStrings.TonemapACES); break;
default: break; // None
}

效果

左右颜色效果对齐。

20250303-201512

参考

https://jplee.notion.site/Lut-Bake-for-Substance-Painter-389c5a02fd184023a2c0361dbc9b7ef0