Unity Shader PostProcessing - 4 - 亮度、饱和度、对比度
是RGB分量的整体大小
一般使用乘法:整体的亮度缩放
rgb *= brightness
还有另一种:整体亮度偏移
rgb += brightness
简单理解为:颜色的分量差异度,如果分量差异越少,颜色就越灰。
如:(0.5,0.5,0.5) 3分量差异为0:灰色,如果我们只保留红色(0.5,0,0)那么就会是红色,因为差异最大为0.5。偏向于红色通道,所以偏红。
如果我们把(0.5,0,0)调整为:(1,0,0),就是最鲜艳的红色了。
饱和度越大,分量差异越大。
以上,是我的简单理解。
你可以看查看下面的References中的饱和度的百度百科。
一般应用:
// 下面的gray可以查看最下面的References中的灰度值
gray = dot(rgb, (0.3,0.6,0.1)); // 该像素的灰度值
rgb = lerp(gray, rgb, saturation); // 灰度值到源色的程度(饱和度)
对图像而言,代表整体图像中,最亮与最黑像素点的差异大小。
对显示设备而言,代表他的控制显示灰度的级别,差异越大,说明该设备可以显示的色彩越丰富。
也可以看References中的对比度的百度百科说明。
一般应用:
rgb = lerp(0.5, rgb, contrast);
// jave.lin 2019.09,04
// BSC == Brightness, Saturation, Contrast
Shader "Test/BSC" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
_Brightness ("Brightness", Range(0, 10)) = 1 // 亮度
_Saturation ("Saturation", Range(0, 10)) = 1 // 饱和度
_Contrast ("Contrast", Range(0, 10)) = 1 // 对比度
_OffsetRed ("OffsetRed", Range(-1, 1)) = 0 // red通道偏移
_OffsetGreen ("OffsetGreen", Range(-1, 1)) = 0 // green通道偏移
_OffsetBlue ("OffsetBlue", Range(-1, 1)) = 0 // blue通道偏移
}
SubShader {
Tags { "RenderType"="Opaque" }
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
half _Brightness, _Saturation, _Contrast;
fixed _OffsetRed, _OffsetGreen, _OffsetBlue;
float4 vert (float4 vertex : POSITION, inout float2 uv : TEXCOORD0) : SV_POSITION {
return UnityObjectToClipPos(vertex);
}
fixed4 frag (float4 vertex : SV_POSITION, float2 uv : TEXCOORD0) : SV_Target {
fixed4 col = tex2D(_MainTex, uv);
col.rgb = saturate(col.rgb * _Brightness); // brightness
col.rgb += fixed3(_OffsetRed, _OffsetGreen, _OffsetBlue); // offset
fixed gray = dot(col.rgb, fixed3(0.3, 0.6, 0.1)); // gray
col.rgb = lerp(gray, col.rgb, _Saturation); // saturation
col.rgb = lerp(0.5, col.rgb, _Contrast); // contrast
return col;
}
ENDCG
}
}
}
// jave.lin 2019.09.04
using UnityEngine;
public class BSC : PostEffectBasic
{
[Range(0, 10)] public float brightness = 1;
[Range(0, 10)] public float saturation = 1;
[Range(0, 10)] public float contrast = 1;
[Range(-1, 1)] public float offsetRed = 0;
[Range(-1, 1)] public float offsetGreen = 0;
[Range(-1, 1)] public float offsetBlue = 0;
protected override void OnRenderImage(RenderTexture src, RenderTexture dest)
{
if (!IsSupported) { Graphics.Blit(src, dest); return; }
mat.SetFloat("_Brightness", brightness);
mat.SetFloat("_Saturation", saturation);
mat.SetFloat("_Contrast", contrast);
mat.SetFloat("_OffsetRed", offsetRed);
mat.SetFloat("_OffsetGreen", offsetGreen);
mat.SetFloat("_OffsetBlue", offsetBlue);
Graphics.Blit(src, dest, mat);
}
}