Edited at

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

More than 5 years have passed since last update.

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