关于URP的Postprocess我们需要有个了解,以前在内置管线,对于后处理我们一般自己写或者用PostprocessStack,现在URP已经将postprocess集成到URP中,我们一起来学习下吧~
首先需要创建一个Volume,然后创建VolumeProfile,点击AddOverride,选中Bloom,如下:
于是Bloom效果就出来了,如此简单~
我们看一下目前后期支持的效果:
还有就是刚才加的Bloom。 我们大致看下这些功能~
我们首先看会影响到ColorGradingLut的后处理:
var stack = VolumeManager.instance.stack; 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>();
在ColorGradingLutPass中我们可以看到以上几种后处理都会影响到LUT,只不过影响方式不同。
比如ChannelMixer的影响方式如下:
colorLinear = float3(
dot(colorLinear, _ChannelMixerRed.xyz),
dot(colorLinear, _ChannelMixerGreen.xyz),
dot(colorLinear, _ChannelMixerBlue.xyz)
);
具体每种处理如何影响最后的LUT可以参考LutBuilderHdr.shader和LutBuilderLdr.shader。
然后剩下的后处理基本上都在PostProcessPass和UberPost.shader中了。我们同样可以看到这个Pass进行哪些后处理:
// Builtin effects settings DepthOfField m_DepthOfField; MotionBlur m_MotionBlur; PaniniProjection m_PaniniProjection; Bloom m_Bloom; LensDistortion m_LensDistortion; ChromaticAberration m_ChromaticAberration; Vignette m_Vignette; ColorLookup m_ColorLookup; ColorAdjustments m_ColorAdjustments; Tonemapping m_Tonemapping; FilmGrain m_FilmGrain;
每一种处理都被Volume包装,作为一个VolumeComponent,然后在URP的PostprocessPass中取到参数传到UberPost.shader中,所以如果我们要扩展的话,至少要写一个VolumeComponent,而且还要修改URP的后处理Pass,并且还要改Ubershader,这种耦合性的修改如非必要,还不不要操作的好。只能说现在对于后处理不是不能扩展,只不过像上述方法这样扩展倒不如说是在修改URP代码。我们可以考虑其他方式,比如自己通过RenderFeatures写一个Pass,Pass执行自己的Shader,Pass的C#脚本只调用Volume中我们自己扩展的后处理项。这样我们在不修改源代码的情况下扩展要安全的多。
还有点需要了解的是现在Postprocess包含在Volume这个系统中,Volume其实还可以做很多其他的东西,而且有了Volume我们非常好做局部区域的后处理,不同区域后处理的插值等等操作,好用的不行~
本来是想将所有后处理项挨个过一遍,后来想想学习URP的小伙伴这点知识还是知道的,显得我有点啰嗦。过源码一篇文章又不够,就当过了个流程吧(哈哈哈~~)笔者又在偷懒