半透明シェーダーで他人を禿や裸にしてしまう問題をある程度修正する

この記事は約3分で読めます。

設定の鍵を握るレンダーキュー

レンダーキューについてはこちらを読んでいただくのが手っ取り早い。

と言いますと、つまりレンダリングの順番が不適切な場合において、先ほどのような問題が起こり得ます。
たとえば翼よりも服や頭髪の描画順が低い場合、翼の描画が優先されて服や頭髪が描画されなくなってしまいます。

双方とも半透明感を実現するためには描画順を下げる必要があり、結果として設定値が不適切な場合に先ほどのような問題が起きてしまいます。

問題の修正

問題の修正方法については、比較的シンプルです。
すべてのマテリアルには、レンダーキューが設定されています。これは描画順を設定するための順位です。
レンダーキューが小さい順に描画が行われます。

先ほどの例では、服や頭髪よりも翼の描画が優先されていたことが原因で発生していました。
つまり、翼の描画の優先順位を下げてしまえば、悲劇を回避できる確率は高まります。

レンダーキューの変更

レンダーキューはマテリアル単位で変更可能です。

すべてのマテリアルには、Render Queueと呼ばれる値が設定されています。
これはシェーダーによってデフォルト値が設定されていますが、手動で書き換えることもできます。

UTSなど、一部のシェーダーでは専用の設定画面が表示されていることがあります。
そのような場合は、Show All propertiesなどを選択すると表示できます。

レンダーキューはタグで指定することが可能で、先ほどのサイトによれば次のようになっています。

TagRender Queue
Background1000
Geometry2000
AlphaTest2450
Transparent3000
Overlay4000

レンダーキューは各オブジェクトの相対的な描画順を決定するため、不用意に変更すると見え方がおかしくなる場合があります。

今回の例では

先ほどの例では、次のシェーダーを使用していました。

UnityChanToonShader/NoOutline/ToonColor_DoubleShadeWithFeather_TransClipping

このシェーダーでは、デフォルトのRender Queue(つまりFrom Shaderの値)が2450(AlphaTest)に設定されていました。
つまり、Render Queueを3000(Transparent)やそれ以上の値に設定している人のオブジェクトが透けてしまいました。

解決策として、今回の例では値を3999に変更することにしました。
3001に設定しても解決できそうですが、先ほども記載しました通りレンダーキューは相対的な値の関係で描画順が決定されます。何らかの理由で3001や3002を利用していた場合に回避できなくなってしまいます。

逆に、4000番以降はワールドのポストエフェクトなどに干渉する恐れが懸念されたため、それよりも少し優先順位の高い3999に設定しています。

こうすることで、ほとんどの場合で悲劇を回避できることを見込んでいます。

【追記】2022/9/20
極端に高い値にすると、かえってワールドの演出を阻害する可能性があるようです。
レンダーキューは相対的なものですので、環境に合わせて最適な値を探すのがよさそうです。

タイトルとURLをコピーしました