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

More than 1 year has 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
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.