夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

MixedReality-GraphicsTools-Unityを触る その⑩ MaterialGalleryサンプル Stencil

本日はMRTK3調査枠です。

現在GraphicsToolsを読み解いています。

今回はGraphicsTools/StandardシェーダーのサンプルであるMaterialGalleryサンプルシーンを見ていきます。

〇Stencil Portal

ステンシル(Stencil)とは切り抜きを意味します。

 ステンシルを使用することであるオブジェクトを通してみることができるような表現が行えます。

Stencil PortalShaderBallPlacardの二つのオブジェクトで構成されています。

Placardは各機能を示すプラカードなので実質ShaderBallオブジェクトで構成されています。

ShaderBallの子オブジェクトには透明な板であるPortalとフレームの位置を示すための枠であるFrameがあります。

 肝となる仕組みはPortalオブジェクトとShaderBallオブジェクトで行われています。

ShaderBallオブジェクトのマテリアルを見るとEnable Stencil Testingの機能が有効化されています。

 

ShaderBall側のMRGTStandardShader

ステンシルはステンシルバッファに基づきピクセルマスクを作成し、マスクごとにピクセルを保持するか?破棄するか?を決めています。

 このステンシルバッファというものはすべてのピクセルが持つ値です。  8bitであらわされます。

 既に描かれているオブジェクトのステンシルバッファと新たに描画するピクセルのステンシルバッファを比較しフラグメントシェーダーで描画を破棄することができます。

ShaderLab: ステンシル - Unity マニュアル

MRGTStandardShaderではStencilバッファの処理があります。

            Stencil
            {
                Ref[_StencilReference]
                Comp[_StencilComparison]
                Pass[_StencilOperation]
                ReadMask[_StencilReadMask]
                WriteMask[_StencilWriteMask]
            }

ここでPortal側のマテリアルを見るとこちらもEnable Stencil Testingが有効化されており、ここではStencil ComparisonStencil Operationの値がここなっています。

 

またRenderQueueが1999でありShaderBallよりも先に描画が行われています。

 ここでStencil Comparisonはステンシルバッファの比較する方法であり、Akwaysの場合は常に描画が行われます。 またShaderBallEqualの場合Stencil Referenceの値に当たるステンシルバッファがイコールの場合描画が行われます。

 つまり先に描画されるPortalの持つステンシルバッファをもとに後に描画されるShaderBallのステンシルバッファの値が同じ部分(Portal部のみ)が描画されるようになっています。

 

 以上でステンシルを読み解いていきました。