Unity3D+Post Processing Stack V2自定義後處理效果研究
阿新 • • 發佈:2020-07-14
### 背景
眾所周知,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