《unityshader入門精要》學習筆記-屏幕後期處理-調整屏幕亮度、飽和度、對比度

 

屏幕後期處理-調整屏幕亮度、飽和度、對比度

1、場景創建

1.1 hierarchy視圖包含:一個main camera、一個directional light、一個sprite(一個texture type爲Sprite(2D and UI))

1.2 project 視圖中新建:

一個C#腳本命名爲PostEffectsBase,用於建立基本的屏幕後期處理系統。代碼如下:

using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
[RequireComponent (typeof(Camera))]   

public class PostEffectsBase : MonoBehaviour {

    // Use this for initialization
    void Start () {
        CheckResources ();
    }

    //檢查資源是否符合標準
    protected void CheckResources()
    {
        bool isSupported = CheckSupport();
        
        if (isSupported == false)
            NotSupported ();
    }
    
    
    protected bool CheckSupport()
     {
         if (SystemInfo.supportsImageEffects == false || SystemInfo.supportsRenderTextures == false) {
               Debug.LogWarning("This platform does not support image effects or render textures");
               return false;
            }
         return true;
     }

    protected void NotSupported()
    {
        enabled = false;
    }

    //指定一個shader來創建一個用於處理渲染紋理的材質
    protected Material CheckShaderAndCreateMaterial(Shader shader , Material material)
    {
        if (shader == null) {
            return null;
        }
        if (shader.isSupported && material && material.shader == shader) {
            return material;
        }
        if (!shader.isSupported) {
            return null;
        } else {
            material = new Material(shader);
            material.hideFlags = HideFlags.DontSave;
            if(material)
            {
                return material;
            }
            else
                return null;
        }
    }
}

 

再創建一個C#腳本命名爲BrightnessSaturationAndContrast,繼承上面的基類,提供調整亮度、飽和度、對比度的參數。將此腳本t添加到main camera上。

using UnityEngine;
using System.Collections;

public class BrightnessSaturationAndContrast : PostEffectsBase {

    public Shader briSatConShader;
    public Material briSatConMaterial;
    public Material material{
        get {
            //調用基類中的方法可創建與shader對應的材質球
            briSatConMaterial = CheckShaderAndCreateMaterial(briSatConShader,briSatConMaterial);
            return briSatConMaterial;
        }
    }

    [Range(0,3.0f)]
    public float brightness =1.0f;
    [Range(0,3.0f)]
    public float saturation =1.0f;
    [Range(0,3.0f)]
    public float contrast =1.0f;

    //定義OnRenderImage函數來進行特效處理,當前渲染的圖像存儲在第一個參數對應的源紋理中,
    //通過函數中的一系列操作後第二個參數的紋理顯示到屏幕上。
    void OnRenderImage(RenderTexture src,RenderTexture  dest)
    {
        if (material != null) {
            material.SetFloat ("_Brightness", brightness);
            material.SetFloat ("_Saturation", saturation);
            material.SetFloat ("_Contrast", contrast);
           //Graphics.Blit使用特定的unity shader來對當前圖像進行處理,再把返回的渲染紋理顯示到屏幕
            Graphics.Blit (src, dest, material);  //參數src傳遞給shader中名爲_Maintex的紋理屬性
        } else
            Graphics.Blit (src, dest);                //圖像直接顯示到屏幕上不做任何處理
    }
}

 

創建一個shader命名爲BriSatAndCon,一個材質球命名爲Render。將Render的shader爲BriSatAndCon

Shader "LT/BriSatAndCon" {
    Properties {
        _MainTex ("Base (RGB)"2D) = "white" {}
        _Brightness ("Brightness"Float) = 1        // 亮度係數  值由C#腳本傳遞
        _Saturation ("Saturation"Float) = 1        // 飽和度係數  值由C#腳本傳遞
        _Contrast ("Contrast"Float) = 1            // 對比度係數  值由C#腳本傳遞
        
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        
        pass{
        ZTest Always 
        Cull off
        Zwrite off
        
        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #include "UnityCG.cginc"

        sampler2D _MainTex;
        float _Brightness;
        float _Saturation;
        float _Contrast;

        struct v2f {
            half2 uv : TEXCOORD0;
            float4 pos : POSITION;
        };

        v2f vert (appdata_img v) {
            v2f o;
            o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
            o.uv = v.vertex;
            return o;
        }
        
        fixed4 frag(v2f i): SV_Target
        {
            fixed4 renderTex = tex2D(_MainTex,i.uv);
            
            //apply brightnees亮度=原顏色*亮度係數
            fixed3 finalColor = renderTex.rgb * _Brightness;
             
            //apply saturation飽和度 ,計算該像素對應的亮度值:對每一個顏色分量*待定係數相加。
            fixed luminance = 0.2125 * renderTex.r + 0.7154 * renderTex.g + 0.721 * renderTex.b;
            //創建一個飽和度爲0的顏色值
            fixed3 luminaceColor = luminance;
            finalColor = lerp(luminaceColor,finalColor,_Saturation);
            
            //apply Contrast對比度
            fixed3 avgColor = fixed3(0.5,0.5,0.5);                //創建一個對比度爲0的顏色
            finalColor = lerp(avgColor,finalColor,_Contrast);
            return fixed4(finalColor,renderTex.a);
        }
        ENDCG
        }
    } 
    FallBack off
}

將此shader手動拖拽到main camera上BrightnessSaturationAndContrast中的briSatConShader。調節其他參數在game視圖中查看效果。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章