-->


Shader "UI/GrayScale"
{
Properties
{
[KeywordEnum(Simple, NTSC)] _GrayType("GrayType", Int) = 1 //グレースケール化する際の計算タイプ
_BlendRate ("BlendRate", Range(0.0, 1.0)) = 1 //完全にグレースケール化するまでの割合
}
SubShader
{
Tags
{
"RenderPipeline" = "UniversalPipeline"
"Queue" = "Transparent"
}
Cull Off
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile _GRAYTYPE_SIMPLE _GRAYTYPE_NTSC
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct Attributes
{
half2 uv : TEXCOORD0;
float4 positionOS : POSITION;
half4 color : COLOR;
};
struct Varyings
{
half2 uv : TEXCOORD0;
float4 positionCS : SV_POSITION;
half4 color : COLOR;
};
//uGUI Image > Source Imageにアタッチされた画像を参照する
TEXTURE2D(_MainTex);
SAMPLER(sampler_MainTex);
//SRP Batcherを適用
CBUFFER_START(UnityPerMaterial)
//プロパティに対応する変数の宣言
half _GrayType;
half _BlendRate;
CBUFFER_END
Varyings vert (Attributes input)
{
Varyings output;
output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
output.uv = input.uv;
output.color = input.color;
return output;
}
half4 frag (Varyings input) : SV_Target
{
half4 col = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, input.uv);
col *= input.color;
#if defined(_GRAYTYPE_SIMPLE)
//単純平均法で完全なグレースケール化した値を取得
half gray = (col.r + col.g + col.b) / 3;
half3 grayCol = half3(gray, gray, gray);
#elif defined(_GRAYTYPE_NTSC)
//NTSC加重平均法で完全なグレースケール化した値を取得
half gray = dot(col.rgb, half3(0.299, 0.587, 0.114));
half3 grayCol = half3(gray, gray, gray);
#endif
//_BlendRateを参照し、lerpでオリジナル色と完全なグレースケール化の間の値を設定
col.rgb = lerp(col.rgb, grayCol, _BlendRate);
return col;
}
ENDHLSL
}
}
}




#ifdef _GRAYTYPE_SIMPLE
//単純平均法で完全なグレースケール化した値を取得
fixed gray = (col.r + col.g + col.b) / 3;
grayCol = fixed3(gray, gray, gray);
#elif _GRAYTYPE_NTSC
//NTSC加重平均法で完全なグレースケール化した値を取得
fixed gray = dot(col.rgb, fixed3(0.299, 0.587, 0.114));
grayCol = fixed3(gray, gray, gray);
#elif _GRAYTYPE_NTSC
//NTSC加重平均法で完全なグレースケール化した値を取得
//fixed gray = dot(col.rgb, fixed3(0.299, 0.587, 0.114));
fixed r = col.r * 0.299;
fixed g = col.g * 0.587;
fixed b = col.b * 0.114;
fixed gray = r + g + b;
grayCol = fixed3(gray, gray, gray);