鸟语天空
屏幕特效——实现亮度、饱和度、对比度
post by:追风剑情 2016-7-17 11:08

色调:    指画面上表现情感的设色及其浓淡。如:暖色调、冷色调。
饱和度: 颜色纯度,越纯越鲜艳,纯的颜色属于高度饱和,灰色属于完全不饱和。
亮度:    光线强弱决定。
对比度: 画面上的明暗差

BSC_Effect.shader


Shader "Custom/BSC_Effect" {
	Properties {
		_MainTex ("Base (RGB)", 2D) = "white" {}
		//亮度值
		_BrightnessAmount ("Brightness Amount", Range(0.0, 1)) = 1.0
		//饱和度
		_satAmount ("Saturation Amount", Range(0.0, 1)) = 1.0
		//对比度
		_conAmount ("Contrast Amount" , Range(0.0, 1)) = 1.0
	}
	SubShader {
		Pass
		{
			CGPROGRAM
			#pragma vertex vert_img
			#pragma fragment frag
			#pragma fragmentoption ARB_precision_hint_fastest
			#include "UnityCG.cginc"
			
			uniform sampler2D _MainTex;
			fixed _BrightnessAmount;
			fixed _satAmount;
			fixed _conAmount;
			
			float3 ContrastSaturationBrightness(float3 color, float brt, float sat, float con)
			{
				float AvgLumR = 0.5;
				float AvgLumG = 0.5;
				float AvgLumB = 0.5;
				
				//当前图像的全局亮度值,这个系数是由CIE颜色匹配函数得来的,并成为了行业标准。
				float3 LuminanceCoeff = float3(0.2125, 0.7154, 0.0721);
				//把当前颜色值和这些亮度系数进行点积运算得到图像的全局亮度。
				float3 AvgLumin = float3(AvgLumR, AvgLumG, AvgLumB);
				float3 brtColor = color * brt;
				float intensityf = dot(brtColor, LuminanceCoeff);
				float3 intensity = float3(intensityf, intensityf, intensityf);
				//得到亮度值以后,再用一组lerp函数从亮度值的操作开始混合运算。
				//然后用原始图像乘上函数传递过来的亮度值。
				float3 satColor = lerp(intensity, brtColor, sat);
				float3 conColor = lerp(AvgLumin, satColor, con);
				
				return conColor;
			}
			
			fixed4 frag(v2f_img i) : COLOR
			{
				fixed4 renderTex = tex2D(_MainTex, i.uv);
				renderTex.rgb = ContrastSaturationBrightness(renderTex.rgb,
															_BrightnessAmount,
															_satAmount,
															_conAmount);
				return renderTex;
			}
			ENDCG
		}
	} 
	FallBack "Diffuse"
}


TestRenderImage.cs


using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
public class TestRenderImage : MonoBehaviour {

	public Shader curShader;
	private Material curMaterial;
	public float brightnessAmount = 1.0f;
	public float saturationAmount = 1.0f;
	public float contrastAmount = 1.0f;

	Material material
	{
		get
		{
			if(curMaterial == null)
			{
				curMaterial = new Material(curShader);
				curMaterial.hideFlags = HideFlags.HideAndDontSave;
			}
			return curMaterial;
		}
	}

	void Start () {
		if(!SystemInfo.supportsImageEffects)
		{
			enabled = false;
			return;
		}

		if(null != curShader && !curShader.isSupported)
		{
			enabled = false;
		}
	}

	//对屏幕后期处理
	void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture)
	{
		if (curShader != null) 
		{
			material.SetFloat("_BrightnessAmount", brightnessAmount);
			material.SetFloat("_satAmount", saturationAmount);
			material.SetFloat("_conAmount", contrastAmount);

			Graphics.Blit (sourceTexture, destTexture, material);
		} else {
			Graphics.Blit (sourceTexture, destTexture);
		}
	}

	void Update () {
		brightnessAmount = Mathf.Clamp (brightnessAmount, 0.0f, 2.0f);
		saturationAmount = Mathf.Clamp (saturationAmount, 0.0f, 2.0f);
		contrastAmount = Mathf.Clamp (contrastAmount, 0.0f, 3.0f);
	}

	void OnDisable()
	{
		if (curMaterial)
			DestroyImmediate (curMaterial);
	}
}


运行测试

原效果

1111.jpg

Brichtness=0.5  Saturation=2.0  Contrast=1.75

05-20-175.jpg

Brichtness=1.64  Saturation=0.0  Contrast=0.57

164-00-057.jpg

评论:
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容