后处理shader

后处理基类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//希望在编辑器状态下也可以执行该脚本来查看效果  
[ExecuteInEditMode]
//所有的屏幕后处理效果都需要绑定在某个摄像机上  
[RequireComponent(typeof(Camera))]
public class PostEffectsBase : MonoBehaviour
{

    protected void CheckResource()
    {
        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;
    }

    protected void Start()
    {
        CheckResource();
    }

    //第一个参数指定了该特效需要使用的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;
        }
        material = new Material(shader);
        material.hideFlags = HideFlags.DontSave;
        return material;
    }
} 

unity cs脚本(挂在相机上)

using System.Collections.Generic;
using UnityEngine;

public class BrightnessSaturationAndContrast : PostEffectsBase
{
    public Shader briSatConShader;
    private Material briSatConMaterial;

    public Material material
    {
        get
        {
            briSatConMaterial = CheckShaderAndCreateMaterial(briSatConShader, briSatConMaterial);
            return briSatConMaterial;
        }
    }

    [Range(0.0f, 3.0f)]
    public float brightness = 1.0f;

    [Range(0.0f, 3.0f)]
    public float saturation = 1.0f;

    [Range(0.0f, 3.0f)]
    public float contrast = 1.0f;

    //真正的处理特效
    //图像特效可以在不透明渲染通道(默认情况)或透明直接执行。
    private void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        if (material != null)
        {
            material.SetFloat("_Brightness", brightness);
            material.SetFloat("_Saturation", saturation);
            material.SetFloat("_Contrast", contrast);
            Graphics.Blit(source, destination, material);//材质的应用
        }
        else
        {
            Graphics.Blit(source, destination);
        }
    }
}
在这里插入代码片

灰度处理 shader

Shader "Hidden/Gray"
{
    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);
				fixed luminance=0.2125*col.r+0.7154*col.g+0.0721*col.b;
                // just invert the colors
                //col.rgb = 1 - col.rgb;
				fixed3 luminanceColor=fixed3(luminance,luminance,luminance);
                return fixed4(luminanceColor,col.a);
            }
            ENDCG
        }
    }
}

亮度,对比度,饱和度处理shader

Shader "Hidden/BrightnessSaturationAndContrast"
{
     Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
		_Brightness("Brightness",float)=1
		_Saturation("Saturation",float)=1
		_Contrast("Contrast",float)=1
    }
    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;
			half _Brightness;
			half _Saturation;
			half _Contrast;

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);

				//调整亮度
				fixed3 finalColor=col.rgb*_Brightness;

				//调整饱和度
				fixed luminance=0.2125*col.r+0.7154*col.g+0.0721*col.b;                
				fixed3 luminanceColor=fixed3(luminance,luminance,luminance);
				finalColor=lerp(luminanceColor,finalColor,_Saturation);

				//调整对比度
				fixed3 avgColor=fixed3(0.5,0.5,0.5);
				finalColor=lerp(avgColor,finalColor,_Contrast);
                return fixed4(finalColor,col.a);
            }
            ENDCG
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值