shader学习之路——后处理

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;

namespace rkt.Assets.TestFob.Scripts
{
    [ExecuteInEditMode]
    [RequireComponent(typeof(Camera))]
    class PostEffectBase:MonoBehaviour
    {
        protected void CheckResources()
        {
            bool isSupported = CheckSupport();
            if(isSupported == false)
            {
                NotSupported();
            }
        }

        /// <summary>
        /// 检查是否支持后处理
        /// </summary>
        /// <returns></returns>
        protected bool CheckSupport()
        {
            if (SystemInfo.supportsImageEffects == false)
            {
                Debug.LogWarning("This platform does not support image effect or render textures");
                return false;
            }
            return true;
        }

        /// <summary>
        /// 如果不支持取消激活
        /// </summary>
        protected void NotSupported()
        {
            this.enabled = false;
        }

        /// <summary>
        /// 检查是否支持后处理
        /// </summary>
        protected void Start()
        {
            CheckResources();
        }

        /// <summary>
        /// 检查和创建材质
        /// </summary>
        /// <param name="shader"></param>
        /// <param name="mat"></param>
        /// <returns></returns>
        protected Material CheckShaderAndCreateMaterial(Shader shader,Material mat)
        {
            if(shader == null)            
                return null;
            
            if (shader.isSupported && mat && mat.shader == shader)
                return mat;
            else
            {
                mat = new Material(shader);
                mat.hideFlags = HideFlags.DontSave;
                if (mat)
                    return mat;
                else
                    return null;
            }

        }
    }
}

调整屏幕亮度、饱和度和对比度

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;

namespace rkt.Assets.TestFob.Scripts
{
    class BrigtnessSaturationAndContrast:PostEffectBase
    {
        public Shader briSatConShader;
        private Material 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;

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

        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 "Unlit/BrightnessSaturationAndContrast"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
		_Brightness ("Brightness",Float) = 1
		_Saturation ("Saturation",Float) = 1
		_Contrast ("Contrast",Float) = 1
	}
	SubShader
	{
		Tags { "RenderType"="Opaque" }
		LOD 100

		Pass
		{
		//关闭深度写入是为了防止它挡住在后面被渲染的物体
			ZTest Always Cull Off ZWrite Off
			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;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			half _Brightness;
			half _Saturation;
			half _Contrast;
			fixed4 _Color;
			
			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				// sample the texture
				fixed4 col = tex2D(_MainTex, i.uv);
				fixed3 finalColor = col.rgb * _Brightness; //颜色相乘调明亮度

				fixed luminanceColor = 0.299 * col.r + 0.587 * col.g + 0.114 * col.b; //灰色值				 
				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、付费专栏及课程。

余额充值