28
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

建物に遮蔽されたプレイヤーをシルエット表示する

Last updated at Posted at 2012-04-15

プレイヤーが地形の背後にいるときは、グレーで塗りつぶし、そうでないときは、単純なランバートシェーディングを適用するUnityのシェーダを書いた。

Shader "Custom/PlayerDiffuse" {
	Properties {
		_NotVisibleColor ("NotVisibleColor (RGB)", Color) = (0.3,0.3,0.3,1)
		_MainTex ("Base (RGB)", 2D) = "white" {}
	}
	SubShader {
		Tags { "Queue" = "Geometry+500" "RenderType"="Opaque" }
		LOD 200

		Pass {
			ZTest Greater
			Lighting Off
			ZWrite Off
			Color [_NotVisibleColor]
		}
		
		Pass {
			ZTest LEqual
			Material {
				Diffuse (1,1,1,1)
				Ambient (1,1,1,1)
			}
			Lighting On
			SetTexture [_MainTex] { combine texture } 
		}

	} 
	FallBack "Diffuse"
}

メモ

  • このシェーダをうまく動かすためには、建物を描画したあとでプレイヤーを描かなければならなかった。描画順序は Tags { "Queue" = "XXX" } で指定できる。デフォルトのQueueはGeometryなので、これに500くらい足しとけば、いいかんじになると考えた。参考:Unity - SubShader Tags
  • 深度テストによる分岐は、Pass {}ブロックのZTest XXXの行で行う。Lighting XXXとかで描画モードを変えられる。
  • Unityシェーダは文法が分かりやすくてよかった。レンダラーに対する命令を記述できるようにすることで、柔軟なシステムになっている感じがした。参考:Unity - ShaderLab syntax
28
29
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
28
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?