Unity Shader 顏色處理(亮度,飽和度 ,對比度)

Unity Shader 顏色處理(亮度,飽和度 ,對比度)

基本概念

亮度

圖像中RGB值的大小,RGB各個值越大,那麼亮度越亮,越小,亮度越暗。好比咱們要增長亮度,那麼直接增長RGB值便可c#

飽和度

飽和度可定義爲彩度除以明度,與彩度一樣表徵彩色偏離同亮度灰色的程度。注意,與彩度徹底不是同一個概念。但因爲其和彩度決定的是出如今人眼裏的同一個效果,因此纔會出現視彩度與飽和度爲同一律唸的狀況。app

飽和度是指色彩的鮮豔程度,也稱色彩的純度。飽和度取決於該色中含色成分和消色成分(灰色)的比例。含色成分越大,飽和度越大;消色成分越大,飽和度越小。純的顏色都是高度飽和的,如鮮紅,鮮綠。混雜上白色,灰色或其餘色調的顏色,是不飽和的顏色,如絳紫,粉紅,黃褐等。徹底不飽和的顏色根本沒有色調,如黑白之間的各類灰色函數

對比度

指的是一幅圖像中明暗區域最亮的白和最暗的黑之間不一樣亮度層級的測量,差別範圍越大表明對比越大,差別範圍越小表明對比越小。通常來講對比度越大,圖像越清晰醒目,色彩也越鮮明豔麗;而對比度小,則會讓整個畫面都灰濛濛的。url

首先咱們先看下效果 原圖以下

調整顏色亮度(亮度值咱們設置爲2)

調整飽和度(飽和度咱們設置爲2.2)

調整對比度(對比度咱們設置爲3)

shader源碼以下

Shader "Custom/ColorAdjustEffect"
{
	Properties
	{
		_MainTex("Albedo (RGB)", 2D) = "white" {}
		_Brightness("Brightness", Float) = 1	//調整亮度
		_Saturation("Saturation", Float) = 1	//調整飽和度
		_Contrast("Contrast", Float) = 1		//調整對比度
	}

		SubShader
		{
			Pass
				{
			ZTest Always
			Cull Off 
			ZWrite Off
			Blend SrcAlpha OneMinusSrcAlpha
			CGPROGRAM
			sampler2D _MainTex;
			half _Brightness;
			half _Saturation;
			half _Contrast;

			//vert和frag函數
			#pragma vertex vert
			#pragma fragment frag
			#include "Lighting.cginc"


			struct appdata_t
			{
				float4 vertex : POSITION;
				half4 color : COLOR;
				float2 texcoord : TEXCOORD0;
			};
			//從vertex shader傳入pixel shader的參數
			struct v2f
			{
				float4 pos : SV_POSITION; //頂點位置
				half2  uv : TEXCOORD0;	  //UV座標
				half4 color : COLOR;
			};

			//vertex shader
			v2f vert(appdata_t v)
			{
				v2f o;
				//從自身空間轉向投影空間
				o.pos = UnityObjectToClipPos(v.vertex);
				o.color = v.color;
				//uv座標賦值給output
				o.uv = v.texcoord;
				return o;
			}

			//fragment shader
			fixed4 frag(v2f i) : COLOR
			{
			//從_MainTex中根據uv座標進行採樣
			fixed4 renderTex = tex2D(_MainTex, i.uv)*i.color;
			//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
}
相關文章
相關標籤/搜索