プレイヤーが地形の背後にいるときは、グレーで塗りつぶし、そうでないときは、単純なランバートシェーディングを適用する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