夜風のMixedReality

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

Unityで特定のオブジェクトだけ明るく見えるシェーダーを作成する その② オクルージョンの実装

本日は昨日に引き続きシェーダーを紹介します。

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

redhologerbera.hatenablog.com

昨日は特定のオブジェクトが明るく強調表現されるような表現を紹介しました。

この方法ではステンシルというシェーダーが描画するピクセルに保持できる特殊な値を使用して『自身と同じステンシル値を持つピクセル以外は暗くする』というQuadと『Quadと同じステンシル値を持つCube』を使用してCubeだけが明るく見れる表現を行いました。

この表現の問題としてCubeの手前に別のオブジェクトがある場合Cubeの領域だけ別の手前にあるオブジェクトも明るく見えてしまう点があります。

これは、Cubeが描画されている領域はステンシルを持っているため、Cubeに上書きされるように手前にあるオブジェクトが描画された際もステンシル値は破棄されずにステンシル値を持っているピクセルとみなされているためです。

今回はこの問題を解消していきます。

〇RenderQueueで解消する方法

RenderQueueはオブジェクトの描画順を決定する値です。

docs.unity3d.com

 ここではステンシルを使用して明るく見せたいCubeをターゲットCube、それ以外のオブジェクトをオクルージョンCubeと呼称します。

 オクルージョンCubeのマテリアルのRender Queueを1999に変更します。

これによって描画順が変わりオクルージョンが機能するようになります。

この方法は最も簡単な方法ですが、欠点としてほかのオブジェクトとの相互関係が壊れてしまうことがあります。

〇ステンシルでオクルージョンを実装する

2つ目の実装方法としてはステンシルを使用するものがあります。

オクルージョンCubeのマテリアルでEnable Stencil Testingを有効にします。

Stencil OperationZeroに設定します。

これによってもオクルージョンを機能させることができます。

これはステンシルとして比較される際にZeroはステンシルバッファにゼロを書き込む作業でこれによってもQuadのピクセルとピクセルの置き換えが行われないためQuadで明るくならず、かつターゲットCubeとの相互関係を維持することができます。

本日は以上です。