自動車税
GWに浮かれて洋服を購入したりプリンタを新調したりアレコレと浪費していたら「自動車税を今月中に払え」と通知が来て赤貧になりかけた皆さんこんにちは。GWと母の日と自動車税の時期が重なるのは国の罠だと思う。
ステンシル
Unityではシェーダーの機能として1pixel毎にそのpixelの描画有無の判断として利用できるバッファ領域(ステンシルバッファ)が用意されています。
ステンシルバッファではpixel単位に8bitの整数値を設定する事が可能で、後続のドローコールでその整数値を参照してピクセルを廃棄するか描画するかを決定します。
これは3Dオブジェクトにマスク表現(切り抜き描画)を行いたい時に良く利用される機能ですが、アセットストアで販売されているような一般的な(トゥーンシェーダーのような)シェーダーには、このステンシルに対する操作のパラメータを用意している物は殆どなく、マスク表現をしたい場合にはマスク専用のシェーダーアセットを購入するか、シェーダーを自分で改良or作成するかの二択になっていました。
一応、技法として確立している為、Web上を検索すると有志の方がステンシルバッファを利用したマスクシェーダーを公開していたりするので、こちらを利用する事も可能です。私も以前お世話になり、このブログで紹介させてもらいました。
Shapesというアセット
「Shapes」というアセットはゲーム空間に円、線、矩形といったプリミティブな図形のオブジェクトを作ることができるアセットで、図形描画に必要なパラメターをInspetor上やスクリプトで自由に変更可能な為、非常に使い勝手が良く、その辺りの基本的な機能については以前記事にしました。
で、このShapesではステンシルバッファに対して書き込み・参照もどちらも可能なパラメターが用意されている為、これを利用すればマスクとして手軽に利用する事が出来そうです。
赤い四角部分がステンシルバッファに対する設定箇所
例えば下図のように黒円の前に白三角がある場合、カメラからは白三角しか見えません
そこで黒円側のInspectorにてRef値に値を設定&Passの値に「Repalce」を選択してステンシルバッファにその値を書き込みます。
白三角側ではRef値に黒円側と同じ値を設定し、Compareに「Equal」を選択すると
黒円側がステンシルバッファにRef値を書き込んだ領域のみが描画されるので、円形に切り抜かれます(マスキング)
逆にCompareで「NotEqual」を選択するとマスク側と重なっていない領域が描画され(逆マスク)、背後にある黒円が見えるようになります。
白三角をマスクの形(円形)で切り抜きたい場合には、マスクする側(黒円)のColorのAlpha値を「1」と極めて小さい値にします。0だとステンシルバッファにRef値が設定されません。
黒円のColorのAlpha値を「1」とした場合
ここで一番最初にお見せしたカメラと白三角、黒円の位置を確認するとマスクとなる黒円が白三角よりカメラから見て奥に配置されることに気づくと思います。
これはShapesでマスキングをする場合、ステンシルバッファに値を書き込む側(マスクする側)のオブジェクトは参照する側(マスクされる側)より奥に設置する必要があるためです。
というのもShapesではRenderQueueがデフォルトで3000(Transparent)となっている為、
- UnityではRenderQueueが2500以上の場合はカメラから遠い順に描画される
- マスクされる側(ステンシルバッファを参照する側)よりマスクする側(ステンシルバッファを更新する側)の方が先に描画される必要がある
- よってマスクする側をマスクされる側より奥側に設置する
となるからです。(以下のリンク参照)
この性質を利用
先述のようにShapesのRenderQueueがデフォルトで3000(Transparent)となっている為、通常(不透明)の3Dオブジェクトの描画後にステンシルバッファの更新→参照が行われる事になります。
これを逆に考えると3DオブジェクトがShapesのマスクの手前にある領域ではステンシルバッファの更新はされない、という事なので、例えば下図のようにマスク側(白四角)のオブジェクトとマスクされる側(黒四角)の間に少女の3Dモデル(不透明)がある場合では
(カメラから見て)少女モデルが白い四角を遮っている為、その部分はステンシルバッファに値が書き込まれず、マスクされる黒い四角部分に本来なら見えないはずの少女モデルが見えるようになります。
これを先ほどと同じようにマスクされる側の設定を「NotEqual」(逆マスク)に変えてみます。
先程とは逆に少女モデルの部分に逆マスク部分(黒い四角)が反映されて影絵のような表現になりました。
少女を歩かせてみるとこんな感じ
マスク部分でShapseの黒四角が少女モデルの形に切り抜かれて表示されていますね。ちょっと演出に使えそうです。