美颜效果加后期处理

shader 部分:

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'


Shader "Custom/ColorAdjustEffect" {
	//属性块,shader用到的属性,可以直接在Inspector面板调整  
	Properties
	 {
	 	_MainTex("Albedo (RGB)", 2D) = "white" {}
	 	_Brightness("Brightness", Float) = 1
	 	_Saturation("Saturation", Float) = 1
	 	_Contrast("Contrast", Float) = 1
	 }


		//每个shader都有Subshaer,各个subshaer之间是平行关系,只可能运行一个subshader,主要针对不同硬件  
		SubShader
		{
			//真正干活的就是Pass了,一个shader中可能有不同的pass,可以执行多个pass  
			Pass
			{
				//设置一些渲染状态,此处先不详细解释  
				ZTest Always Cull Off ZWrite Off
	
				CGPROGRAM
				//在Properties中的内容只是给Inspector面板使用,真正声明在此处,注意与上面一致性  
				sampler2D _MainTex;
				half _Brightness;
				half _Saturation;
				half _Contrast;
	
				//vert和frag函数  
				#pragma vertex vert  
				#pragma fragment frag  
				#include "Lighting.cginc"  
	
				//从vertex shader传入pixel shader的参数  
				struct v2f
				{
					float4 pos : SV_POSITION; //顶点位置  
					half2  uv : TEXCOORD0;    //UV坐标  
				};
	
				//vertex shader  
				//appdata_img:带有位置和一个纹理坐标的顶点着色器输入  
				v2f vert(appdata_img v)
				{
					v2f o;
					//从自身空间转向投影空间  
					o.pos = UnityObjectToClipPos(v.vertex);
					//uv坐标赋值给output  
					o.uv = v.texcoord;
					return o;
				}
		
				//fragment shader  
				fixed4 frag(v2f i) : SV_Target
				{
					//从_MainTex中根据uv坐标进行采样  
					fixed4 renderTex = tex2D(_MainTex, i.uv);
					//brigtness亮度直接乘以一个系数,也就是RGB整体缩放,调整亮度  
					fixed3 finalColor = renderTex * _Brightness;
					//saturation饱和度:首先根据公式计算同等亮度情况下饱和度最低的值:  
					fixed gray = 0.2125 * renderTex.r + 0.7154 * renderTex.g + 0.0721 * renderTex.b;
					fixed3 grayColor = fixed3(gray, gray, gray);
					//根据Saturation在饱和度最低的图像和原图之间差值  
					finalColor = lerp(grayColor, finalColor, _Saturation);
					//contrast对比度:首先计算对比度最低的值  
					fixed3 avgColor = fixed3(0.5, 0.5, 0.5);
					//根据Contrast在对比度最低的图像和原图之间差值  
					finalColor = lerp(avgColor, finalColor, _Contrast);
					//返回结果,alpha通道不变  
					return fixed4(finalColor, renderTex.a);
				}
				ENDCG
			}
		}
	//防止shader失效的保障措施  
	FallBack Off
}


C#部分 两个类是后期处理

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


public class ColorAdjustEffect : PostEffectBase
{
    
    [Range(0.0f, 3.0f)]
    public float brightness = 1.0f;     //亮度
    [Range(0.0f, 3.0f)]
    public float contrast = 1.0f;       //对比度
    [Range(0.0f, 3.0f)]
    public float saturation = 1.0f;     //饱和度




    void OnRenderImage(RenderTexture src, RenderTexture dest)
    {
        //仅仅当有材质的时候才进行后处理,如果_Material为空,不进行后处理  
        if(Material)
        {
            //通过Material.SetXXX("name",value)可以设置shader中的参数值 
            Material.SetFloat("_Brightness", brightness);
            Material.SetFloat("_Contrast", contrast);
            Material.SetFloat("_Saturation", saturation);
            //使用Material处理Texture,dest不一定是屏幕,后处理效果可以叠加的!  
            Graphics.Blit(src, dest, Material);
        }
        else
        {
            Graphics.Blit(src, dest);
        }
    }


}

===================///


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




//非运行时也触发效果  
[ExecuteInEditMode]
//屏幕后处理特效一般都需要绑定在摄像机上  
[RequireComponent(typeof(Camera))]


public class PostEffectBase : MonoBehaviour {


    public Shader shader = null;
    private Material _material = null;
    public Material Material
    {
        get
        {
            if (_material == null)
                _material = GenerateMaterial(shader);
            return _material;
        }
    }
    protected Material GenerateMaterial(Shader shader)
    {
        if(shader == null)
        {
            return null;
        }
        if(shader.isSupported == false)
        {
            return null;
        }
        Material material = new Material(shader);
        material.hideFlags = HideFlags.DontSave;
        if(material)
        {
            return material;
        }
        return null;
    }






}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值