レティクル(Image)の明るさを、ゲーム画面の明るさに応じて調整します。
画面が暗いなら明るく、画面が明るいなら暗くしたい。
前提 UI/Default
シェーダを利用
UI/Default
シェーダーをベースに作成します。
参考(ちょっと古い)
1. GrabPassでレンダリング結果を書き出す
画面のレンダリング結果が欲しいので、GrabPassで_GrabPassTex
に書き出します。
SubShader
{
Tags
{
"Queue"="Transparent"
"IgnoreProjector"="True"
"RenderType"="Transparent"
"PreviewType"="Plane"
"CanUseSpriteAtlas"="True"
}
GrabPass { "_GrabPassTex" }
Pass
{
Name "Default"
CGPROGRAM
//以下省略(後述)
2. オブジェクト座標からGrabPassのテクスチャ座標に変換する
クリップスペース座標を経由してGrabPassのテクスチャ座標に変換します。
- 参考: ビルトインシェーダーヘルパー機能
v2f vert(appdata_t v)
{
v2f OUT;
OUT.vertex = UnityObjectToClipPos(v.vertex);
OUT.texcoord = ComputeGrabScreenPos(OUT.vertex);
return OUT;
}
3. 画面の明度を反転させてRampテクスチャから明るさを取得する
画面が明るいなら暗い色を、暗いなら明るい色を取得します。明度で計算していますが、輝度の方が良かったかもしれません。
sampler2D _RampTex;
fixed4 frag(v2f IN) : SV_Target
{
half4 bgColor = tex2D(_GrabPassTex, IN.texcoord);
float brightness = max(bgColor.r, max(bgColor.g, bgColor.b));
fixed3 ramp = tex2D(_RampTex, fixed2(1-brightness, 0)).rgb;
brightness = max(ramp.r, max(ramp.g, ramp.b));
return fixed4(brightness * _Color.rgb,1);
}
コード全体