本日はMRTK3調査枠です。
現在GraphicsToolsを読み解いています。
今回はGraphicsTools/StandardシェーダーのサンプルであるMaterialGalleryサンプルシーンを見ていきます。
〇Stencil Portal
ステンシル(Stencil)とは切り抜きを意味します。

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

Stencil PortalはShaderBallとPlacardの二つのオブジェクトで構成されています。

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

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

肝となる仕組みはPortalオブジェクトとShaderBallオブジェクトで行われています。
ShaderBallオブジェクトのマテリアルを見るとEnable Stencil Testingの機能が有効化されています。

ステンシルはステンシルバッファに基づきピクセルマスクを作成し、マスクごとにピクセルを保持するか?破棄するか?を決めています。
このステンシルバッファというものはすべてのピクセルが持つ値です。 8bitであらわされます。
既に描かれているオブジェクトのステンシルバッファと新たに描画するピクセルのステンシルバッファを比較しフラグメントシェーダーで描画を破棄することができます。
ShaderLab: ステンシル - Unity マニュアル
MRGTStandardShaderではStencilバッファの処理があります。
Stencil
{
Ref[_StencilReference]
Comp[_StencilComparison]
Pass[_StencilOperation]
ReadMask[_StencilReadMask]
WriteMask[_StencilWriteMask]
}
ここでPortal側のマテリアルを見るとこちらもEnable Stencil Testingが有効化されており、ここではStencil ComparisonとStencil Operationの値がここなっています。

またRenderQueueが1999でありShaderBallよりも先に描画が行われています。
ここでStencil Comparisonはステンシルバッファの比較する方法であり、Akwaysの場合は常に描画が行われます。 またShaderBallのEqualの場合Stencil Referenceの値に当たるステンシルバッファがイコールの場合描画が行われます。
つまり先に描画されるPortalの持つステンシルバッファをもとに後に描画されるShaderBallのステンシルバッファの値が同じ部分(Portal部のみ)が描画されるようになっています。

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