原カバンは鞄のお店ではありません。

Unityを使ったゲーム制作のあれこれを綴っていきます。

【Unity】Shapesのステンシル設定を利用したマスク表現

自動車税

GWに浮かれて洋服を購入したりプリンタを新調したりアレコレと浪費していたら「自動車税を今月中に払え」と通知が来て赤貧になりかけた皆さんこんにちは。GWと母の日と自動車税の時期が重なるのは国の罠だと思う。

 

ステンシル

Unityではシェーダーの機能として1pixel毎にそのpixelの描画有無の判断として利用できるバッファ領域(ステンシルバッファ)が用意されています。
ステンシルバッファではpixel単位に8bitの整数値を設定する事が可能で、後続のドローコールでその整数値を参照してピクセルを廃棄するか描画するかを決定します。

docs.unity3d.com

これは3Dオブジェクトにマスク表現(切り抜き描画)を行いたい時に良く利用される機能ですが、アセットストアで販売されているような一般的な(トゥーンシェーダーのような)シェーダーには、このステンシルに対する操作のパラメータを用意している物は殆どなく、マスク表現をしたい場合にはマスク専用のシェーダーアセットを購入するか、シェーダーを自分で改良or作成するかの二択になっていました。

一応、技法として確立している為、Web上を検索すると有志の方がステンシルバッファを利用したマスクシェーダーを公開していたりするので、こちらを利用する事も可能です。私も以前お世話になり、このブログで紹介させてもらいました。

www.karvan1230.com

 

Shapesというアセット

Shapes」というアセットはゲーム空間に円、線、矩形といったプリミティブな図形のオブジェクトを作ることができるアセットで、図形描画に必要なパラメターをInspetor上やスクリプトで自由に変更可能な為、非常に使い勝手が良く、その辺りの基本的な機能については以前記事にしました。

www.karvan1230.com

で、この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以上の場合はカメラから遠い順に描画される
  • マスクされる側(ステンシルバッファを参照する側)よりマスクする側(ステンシルバッファを更新する側)の方が先に描画される必要がある
  • よってマスクする側をマスクされる側より奥側に設置する

となるからです。(以下のリンク参照)

www.vr-fluffyscafe.com

 

この性質を利用

先述のようにShapesのRenderQueueがデフォルトで3000(Transparent)となっている為、通常(不透明)の3Dオブジェクトの描画後にステンシルバッファの更新→参照が行われる事になります。
これを逆に考えると3DオブジェクトがShapesのマスクの手前にある領域ではステンシルバッファの更新はされない、という事なので、例えば下図のようにマスク側(白四角)のオブジェクトとマスクされる側(黒四角)の間に少女の3Dモデル(不透明)がある場合では

(カメラから見て)少女モデルが白い四角を遮っている為、その部分はステンシルバッファに値が書き込まれず、マスクされる黒い四角部分に本来なら見えないはずの少女モデルが見えるようになります。

 

これを先ほどと同じようにマスクされる側の設定を「NotEqual」(逆マスク)に変えてみます。

先程とは逆に少女モデルの部分に逆マスク部分(黒い四角)が反映されて影絵のような表現になりました。

少女を歩かせてみるとこんな感じ

マスク部分でShapseの黒四角が少女モデルの形に切り抜かれて表示されていますね。ちょっと演出に使えそうです。

 

◇プライバシーポリシー

●個人情報の利用目的

当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

●個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合
・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止
ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

●免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

●プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。