關於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的小伙伴這點知識還是知道的,顯得我有點啰嗦。過源碼一篇文章又不夠,就當過了個流程吧(哈哈哈~~)筆者又在偷懶