夜風のMixedReality

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

Unityで特定のオブジェクトだけ明るく見えるシェーダーを作成する

本日はMRGT&Shader枠です。

今回はMRGTを使用した特殊なエフェクト表現を紹介します。

例えば特定のオブジェクトに注目させたい場合などに全体的に描画を暗くしながらも特定のオブジェクトのみ通常の明るさで描画していきます。

〇環境

・Unity2021.3.5f1

・UniversalRenderPipeline

・Microsoft MixedRealityGraphicsTools v0.5

〇全体的に暗くする表現の実装

今回は次のようなサンプルシーンで中央の白いキューブのみ目立たせていきます。

①全体的に暗く見せるための窓(Quad)を配置します。

②QuadのマテリアルのシェーダーをGraphicsTools Standardシェーダーに切り替えます。

Rendering ModeTransparentへ切り替えます。

Albedoで色、AlphaFadeで透明度を調整します。

以上でエフェクトとしてのシェーダーはできましたが、当然全体的に暗くなってしまっています。

〇ステンシルの使用

 ステンシルとはシェーダーによって描画されるピクセルに与えることができる情報になります。

 ステンシル値が書き込まれたシェーダー同士で様々な効果に使用することができます。

 

redhologerbera.hatenablog.com

今回はステンシル値を持つオブジェクトは塗りつぶさない(自身が描画されない)という実装を行います。

①QuadのマテリアルからEnable Stencil Testingを有効にします。

Stencil Referenceの値を1にします。

この値がステンシル値として各ピクセルが持つ値になります。

Stencil ComparisonNotEqualStencil OperationKeepに設定します。

Stencil Comparisonはほかのステンシル値を持った値との比較関数でNotEqualは自分自身と違うステンシル値のオブジェクトが自分より後に描画された場合にStencil Operationの操作が行われるという設定になります。

ここではKeepがその操作として指定されており、これは現在のピクセルのステンシル値を維持するという意味(何もしない)になります。

④明るく見せるオブジェクトのマテリアルをGraphicsToolsStandardシェーダーに設定し、EnableStencil Testingを有効にします。

次の設定を行います。

・Stencil Referenceを1に設定

・Stencil ComparisonをAlways

・Stencil OperationをReplace

これはこのオブジェクトが描画される際のピクセルのステンシル値は1で常にステンシル値を比較しており、ほかのステンシル値が書き込まれているピクセルが存在する領域はReplace(自身に置き換え)します。

暗くしているQuadは自身と同じステンシル値以外のステンシル値の場合にKeep(ピクセルの維持)が行われ、対して明るく見せるCubeは常にステンシル値を比較しており、ほかのステンシル値を持つピクセルは自身と置き換えています。

これによって周囲が暗くなるのに対してこのCubeのみが通常と同じ明るさで描画されるようになります。

なおCubeのステンシル値(Stencil Reference)がQuadと同じ1以外の値の場合はほかのオブジェクト同様暗く描画されます。

本日は以上です。