Unity實現后處理效果


后處理

后處理可以理解為濾鏡,是對渲染得到的幀緩沖再做一次處理的過程。

創建Shader

在Unity的資源管理器中右鍵Create->Shader->Image Effect Shader,創建出一個Shader,這個默認的Shader就是一個實現反相效果的Shader。

Shader "Hidden/NewImageEffectShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }

    SubShader
    {
        // No culling or depth
        Cull Off ZWrite Off ZTest Always

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            sampler2D _MainTex;
            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);
                // just invert the colors
                col.rgb = 1 - col.rgb;
                return col;
            }
            ENDCG
        }
    }
}

使用Shader的C#代碼

在文件管理器中右鍵Create->C# Script,創建一個C# 腳本,把這個腳本命名為PostProcessing

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 后處理
public class PostProcessing : MonoBehaviour
{
    public Shader shader;
    public bool effectEnable = true;
    private Material material;
    private void Awake()
    {
        material = new Material(shader);
    }

    // Start is called before the first frame update
    void Start()
    {
    }

    void OnRenderImage(RenderTexture source, RenderTexture target)
    {
        if (material && effectEnable)
        {
            Graphics.Blit(source, target, material);
        }
        else
        {
            Graphics.Blit(source, target);
        }
    }
    // Update is called once per frame
    void Update()
    {

    }
}

OnRenderImage是Unity在渲染完成會調用的函數,可以在這個函數中進行后處理,source是渲染后得到的紋理,用Graphics.Blit可以在輸出前加入一個材質對原圖像進行一個后處理。在Unity中,材質Material和Shader一般是一起存在的,如果要使用某個Shader,那么一般要有一個材質作為載體。將這個腳本掛載到MainCamera上,把之前創建好的Shader拖到shader變量上

測試

運行場景時通過切換PostProcessing腳本上的effectEnable來切換效果
原場景:

后處理過的場景:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM