Unity Shader 顏色處理(亮度,飽和度 ,對比度)
基本概念
亮度
圖像中RGB值的大小,RGB各個值越大,那么亮度越亮,越小,亮度越暗。比如我們要增加亮度,那么直接增加RGB值即可
飽和度
飽和度可定義為彩度除以明度,與彩度同樣表征彩色偏離同亮度灰色的程度。注意,與彩度完全不是同一個概念。但由於其和彩度決定的是出現在人眼里的同一個效果,所以才會出現視彩度與飽和度為同一概念的情況。
飽和度是指色彩的鮮艷程度,也稱色彩的純度。飽和度取決於該色中含色成分和消色成分(灰色)的比例。含色成分越大,飽和度越大;消色成分越大,飽和度越小。純的顏色都是高度飽和的,如鮮紅,鮮綠。混雜上白色,灰色或其他色調的顏色,是不飽和的顏色,如絳紫,粉紅,黃褐等。完全不飽和的顏色根本沒有色調,如黑白之間的各種灰色
對比度
指的是一幅圖像中明暗區域最亮的白和最暗的黑之間不同亮度層級的測量,差異范圍越大代表對比越大,差異范圍越小代表對比越小。一般來說對比度越大,圖像越清晰醒目,色彩也越鮮明艷麗;而對比度小,則會讓整個畫面都灰蒙蒙的。
首先我們先看下效果 原圖如下
調整顏色亮度(亮度值我們設置為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
}