本日はShader学習枠兼HoloLensのアプリ表現調査枠です。
MixedRealityGraphicsTools(MRGT)で提供されているStandardShaderではステンシルの機能が提供されています。
今回はこのステンシルを使用して宝探しのような表現を実装していきます。
〇ステンシルとは?
ステンシル(Stencil)は『切り抜き』を意味する言葉です。
シェーダーはピクセルごとに色を塗りつぶすプログラムですが、塗りつぶす際にステンシルバッファという値を持つことができます。
シェーダーは一般的に後ろにあるオブジェクトから描画され、上塗りされていきますが、ステンシルバッファの値を使用することであるピクセルの前にすでに描画されているステンシルバッファと比較し、場合によっては新しく塗りつぶすピクセルを破棄する(塗らない)という機能がステンシルになります。
〇宝探し
今回はステンシルを使用して部屋の中からオブジェクトを探すという簡単なデモを作成します。
①MRGTとMRTKv2を導入したUnityプロジェクトを作成します。
今回はUnity 2021.3.5f1でURPを使用しています。
②シーンにCubeを配置し、NearInteractionGrabbableコンポーネントおよびObject Manipulatorコンポーネントをアタッチします。
Constraint ManagerコンポーネントはObject Manipulatorコンポーネントをアタッチした際に自動でアタッチされます。
Object Manipulatorコンポーネントはオブジェクトを移動できるようにするコンポーネントです。
NearInteractionGrabbableコンポーネントはオブジェクトをGrab(つかむ)ジェスチャで操作可能でObject Manipulatorコンポーネントと併用することでつかんで移動することができるようになります。
Constraint Managerコンポーネントは移動や回転の軸や移動量制限をかけることができるものです。
③Cubeのトランスフォームを画像のように設定します・
・Position x,y1,z =0,0,1
・Rotation =0
・Scale = 0.1,0.1,0.1
これでユーザーの正面にCubeが配置されるようになります。
④MRGTStandardShaderのマテリアルを作成し、Cubeにアタッチします。
⑤作成したマテリアルの次のパラメータを変更します。
・RenderingMode = Fade
・DirectionalLight = Off
・Render Queue Override = 1999
・Enable Stencil Testing = True
・Stencil Reference = 1
・Stencil Comparison = Always
・Stencil Operation = Replace
Render Queue Overrideを1999にすることで他のオブジェクトよりも先に描画されるようになります。(一般的な不透明のオブジェクトは2000)
Stencil ComparisonをAlwaysにすることで常に比較を行うようにしています。
さらにStencil Operation=Replaceで比較し他の地の操作としてピクセルを置換するようにしています。
これによってこのオブジェクトのステンシルバッファを基準として後に描画されるようになりました。
⑥新たにオブジェクトとマテリアルを作成しパラメータを次のように指定します。
・RenderingMode = Opaque
・Enable Stencil Testing = True
・Stencil Reference = 1
・Stencil Comparison = Equal
・Stencil Operation = Keep
これによってStencil Referenceが同じ=ステンシルバッファが同じピクセルの場合(Stencil Referenceが同値の場合)ピクセルを維持するようになります。
先に作成したマテリアルを通した場合ピクセルが置換され、新たに作成したこちらのマテリアルのピクセルが維持、つまり描画されるようになります。
⑦適当なゲームオブジェクトにマテリアルをアタッチし、先に作成したCubeを通してのみオブジェクトが描画されるようになればステンシルの実装が完了です。
以上でステンシルの理解と実装ができました。
次回発展させHoloLensの実機で宝探しアプリを作っていきます。