屏幕后处理-调整屏幕的亮度、饱和度、对比度实例

在Unity中,屏幕后处理MonoBehaiver.OnRenderImage(RenderImage source,RenderImage destination)可以把屏幕上的渲染出来的图像传入到source中,再经过Graphics.Blit(source,destination,mat)方法指定一个材质处理后再渲染出来。

//脚本,挂载到Camera的物体上
using UnityEngine;

public class ImageChuliXia : MonoBehaviour {

    public Shader shader; //具体处理的Shader
    [Range(0, 3)]
    public float MingLiang = 1.5f;//明亮度
    [Range(0, 3)]
    public float BaoHe = 1.5f;//饱和度
    [Range(0, 3)]
    public float DuiBi = 1.5f;//对比度

    private Material mat;

    private void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        if (shader == null)
        {
            Graphics.Blit(source, destination);
            return;
        }

        if (mat == null)
        {
            mat = new Material(shader);//动态创建一个材质
            mat.hideFlags = HideFlags.DontSave;
        }

        mat.SetFloat("_Mingliang", MingLiang);
        mat.SetFloat("_Baohe", BaoHe);
        mat.SetFloat("_Duibi", DuiBi);
        Graphics.Blit(source,destination, mat);//直接调用方法,让mat处理一番
    }
}


//Shader处理
Shader "Unlit/ImageChuliXia"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {} //这里会传入source
		_Mingliang("_Mingliang",Float) = 1.5 //材质设置进来
		_Baohe("_Baohe",Float) = 1.5
		_Duibi("_Duibi",Float) = 1.5
	}
	SubShader
	{
		Tags { "RenderType"="Opaque" }
		LOD 100

		Pass
		{
			ZTest Always Cull Off
			ZWrite Off
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"

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

			sampler2D _MainTex;
			float4 _MainTex_ST;
			float _Mingliang;//明亮度值
			float _Baohe;//饱和度值
			float _Duibi;//对比度值
			
			v2f vert (appdata_img v) //使用的内置的appdata_img
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = v.texcoord;
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				fixed4 renderTex = tex2D(_MainTex, i.uv);
				
				//明亮度
				fixed3 AllColor = renderTex.rgb * _Mingliang; //直接相乘就好了
				//饱和度
				//fixed lum = Luminance(renderTex.rgb);  //计算当前颜色的亮度值
				fixed lum = 0.2125 * renderTex.r + 0.7154 * renderTex.g + 0.0721 * renderTex.b;
				fixed3 lumColor = fixed3(lum, lum, lum);//构建一个为0的饱和度
				AllColor = lerp(lumColor,AllColor, _Baohe);
				//对比度
				fixed3 avgColor = fixed3(0.5, 0.5, 0.5);//构建一个为0的对比度
				AllColor = lerp(avgColor, AllColor, _Duibi);
				
				return fixed4(AllColor,renderTex.a);
			}
			ENDCG
		}
	}

	Fallback Off
}


appdata_img只包含图像处理时必需的顶点坐标和纹理坐标等变量。


blob.png

blob.png


首页 我的博客
粤ICP备17103704号