1. 程式人生 > >Unity3D+Post Processing Stack V2自定義後處理效果研究

Unity3D+Post Processing Stack V2自定義後處理效果研究

### 背景 眾所周知,Unity3D支援自定義後處理效果,實現過程有三步: 1. 新增著色器,在著色器裡書寫後處理程式碼; 2. 新增材質,把材質和著色器繫結; 3. 給相機新增指令碼,重寫其OnRenderImage方法,將材質傳入Graphics.Blit方法中。 但是在做最近的一個專案時,我使用了Unity3D的官方後處理外掛Post Processing Stack V2(以下簡稱PPV2)來簡化輝光、環境光遮蔽這類後處理效果的使用。但之後我又需要自定義一些後處理效果,此時就出現了問題。我發現我的OnRenderImage方法沒有正常地接收到渲染幀經過外掛處理後的紋理,而是接收到一個純黑紋理,最後輸出的也是純黑,使得我的後處理效果無法正常工作,網上也找不到實際原因,可能和渲染管線的不同有關。為了解決這個問題,必須基於PPV2自定義一個效果,然後在其他程式碼中操作這個效果裡的引數,由PPV2來執行我們的後處理效果。這個國內國外的教程都非常少,我主要參考了PPV2的官方文件,在[這裡](https://docs.unity3d.com/Packages/[email protected]/manual/)給出。 ### 程式碼 #### 著色器 ```c Shader "Hidden/Custom/Blend" { HLSLINCLUDE #include "Packages/com.unity.postprocessing/PostProcessing/Shaders/StdLib.hlsl" TEXTURE2D_SAMPLER2D(_MainTex, sampler_MainTex); TEXTURE2D_SAMPLER2D(_DesTex, sampler_DesTex); float _Alpha; float4 Frag(VaryingsDefault i) : SV_Target { float4 col1 = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoord); float4 col2 = SAMPLE_TEXTURE2D(_DesTex, sampler_DesTex, i.texcoord); float4 col = lerp(col2, col1, _Alpha); return col; } ENDHLSL SubShader { Cull Off ZWrite Off ZTest Always Pass { HLSLPROGRAM #pragma vertex VertDefault #pragma fragment Frag ENDHLSL } } } ``` 基本和文件中的一致,只是修改了片元著色器函式裡的程式碼,實現將兩張紋理進行混合的過程,另外由於這個文件比較新,例項的Shader語法好像和以前的CG語言不太一樣,不知道是不是換成了HLSL。 #### 效果自定義 ```C# using System; using UnityEngine; using UnityEngine.Rendering.PostProcessing; [Serializable] [PostProcess(typeof(BlendRenderer), PostProcessEvent.AfterStack, "Custom/Blend")] public sealed class Blend : PostProcessEffectSettings { public TextureParameter DesTex = new TextureParameter(); public FloatParameter Alpha = new FloatParameter(); } public sealed class BlendRenderer : PostProcessEffect