URP管線自定義后處理組件
(用于實習(xí),不是為了給大伙講懂,所以沒有展現(xiàn)完整的腳本和實現(xiàn)思路!抱歉)
自定義后處理的終極目標就是適配于內(nèi)置的volume組件中。因為volume功能完善,還有局部后處理的效果,非常強大。在volume組件中添加自定義的后處理,首先就是需要繼承VolumeComponent類,才能夠在volume下拉菜單中添加自己想要實現(xiàn)的后處理效果。



光是繼承VolumeComponent是遠遠不夠的,我們后處理的核心邏輯還沒有實現(xiàn)。在內(nèi)置管線中我們可以通過void OnRenderImage()函數(shù)實現(xiàn)后處理。而對于非built-in管線,unity提供了RenderFeature腳本,一個更加靈活,可操作性更高,為SRP而生的后處理框架。因為只提供了這一種方法,我們繞不開這座大山。RenderFeature里有兩個類,創(chuàng)建兩個腳本分別管理這兩個類。


第一個類里有兩個函數(shù)。首先我們需要自己聲明第二個類的字段(把第二個類當(dāng)做成一個RenderPass)。Create()里初始化我們聲明的字段,需要為RenderPass設(shè)置RenderPassEvent,也可以設(shè)置一些自定義的屬性。?AddRenderPasses()主要調(diào)用renderer.EnqueuePass()將我們聲明的字段(RenderPass)添加到渲染序列當(dāng)中去。
第二個類里,OnCameraSetup()用于配置一些渲染數(shù)據(jù),為命令緩沖提前創(chuàng)建temporaryRT。OnCameraCleanup()是在該RenderPass調(diào)用完成后,清除所有分配的資源。?配置好所需要的渲染環(huán)境,最終在Execute()實現(xiàn)我們的后處理邏輯。主要實現(xiàn)流程是:通過CommandBufferPool.Get()調(diào)用一個CommandBuffer(cb),給cb設(shè)置渲染目標(也就是當(dāng)前攝像機的RenderTexture)。然后調(diào)用volumeComp.Render(cb, renderingData.cameraData, source, renderTarget)。volumeComp是我們自定義的后處理腳本!通過下圖獲得。

現(xiàn)在來介紹此方法相比于常規(guī)在renderfeature中寫后處理的優(yōu)勢。主要體現(xiàn)在?在Execute()函數(shù)里,我們并不是只實現(xiàn)一個后處理效果,而是先獲取我們所有激活的后處理,添加到自己聲明的List<PostProcessVolumeComponent>。

然后通過先前介紹過的volumeComp.Render方法渲染所有添加到list里的后處理組件。


這樣一來,我們就不需要重復(fù)改寫RenderFeature冗雜的代碼。而是簡單創(chuàng)建一個腳本,繼承PostProcessVolumeComponent,重寫里面的抽象方法,在Render里自定義后處理!當(dāng)然還有很多細節(jié)需要考慮,比如各種參數(shù),材質(zhì),渲染隊列,平臺兼容性等等。


內(nèi)置管線中學(xué)習(xí)后處理,基本上只需要涉及到shader。在SRP中,后處理是渲染管線里可以自由支配的一部分。學(xué)習(xí)過程中會自我提升很多?,包括對渲染管線更深入的了解,對frame?debug的使用,對unity提供的后處理組件內(nèi)部也有更全面的認識。最后展示一下自己實現(xiàn)的一些效果。








展示了一些需要基本功底的后處理效果。部分效果實現(xiàn)起來還是挺復(fù)雜的!感謝觀看。