0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【UGUI】レティクル(Image)の明度を画面の明度に応じて調整する

Posted at

レティクル(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);
}

Rampテクスチャ(Canvaで適当に作った)
ReticleRamp.png

コード全体

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?