【Unity】半透明マテリアルがすごく光る現象の対処法【RenderQueue,Skybox,VRChat】

3DCG
スポンサーリンク

はじめに

今回はVRChatの半透明マテリアルがすごく光る現象の対処法を紹介します。
↓これのスコープなどで発生する現象です。

ちなみにこのバグはVRChat上で写真を撮ると半透明以外の所が黒くなったりします。
(細かくは環境などで変わります)

ブログ記事は動画を撮影して切り抜いて作成。

結論

半透明マテリアルのレンダーキュー値を「2501」以上にすれば治ります。

これで治りますが…
治した結果別の問題が出てくる可能性があります。

なので、できれば記事を最後まで見てほしいというお気持ち。

状況の整理

半透明マテリアル越しで特定の条件が揃うと「すごく光る」が発生します。

このスコープ部分には半透明用のマテリアルを使用。

シェーダーはlilToon。
レンダーキューはlilToon半透明の初期値「2460」になってます。

この状態で透過マテリアル越しで「オプジェクト」を見ます。
すると光って見えるようなエラーが起こりません。

次は透過マテリアル越しで「背景」を見ます。
すると光り始めます。

つまり「背景(SkyBox)」と「透過マテリアル」との関係で何かが起こってることが分かります。

原因はレンダーキューの問題

結論だけ言うと描画順ミスによる表示エラーです。
背景のSkyBoxは無理やり数値化するならレンダーキュー値は2500になります。

こちらの検証記事でも背景(Skybox)のレンダーキュー値は「2500」とされてました。

3DCGは「半透明」に弱いです。
よくエラーが起こります。
↓半透明エラーの仕組みやレンダーキュー値などの詳細はこちらで解説。

そしてレンダーキュー値の値は数値が大きい方が後で描画されます。
なので今は「透過マテリアル」 → 「背景」の描画になってます。

図で表すとこんな感じです。
背景が “後” で描画されるので透過の上に “乗った” ような表現になります。

普通の半透明マテリアルであればこれで問題が起こらないようです(?)
なんかいい感じに処理されます。

「先に半透明マテリアル」+「後にSkybox」
この条件がそろうと表示がバグるようです。

これはUnityというの仕組みの問題で…
背景の裏に書かれた「半透明」が内部処理的な問題を引き起こすのが原因。

① Skyboxが持つ前のフレームを消す処理が行われない
(Color bufferのクリアが無効化)

② 前のフレームが消えないから描画が蓄積される

③ 蓄積された結果、すごく光ったように見える

このバグの結果が「すごく光ってるように見える」という現象を引き起こしてます。

以上が原因はレンダーキューの問題という解説です。

対処法はレンダーキュー値の修正

このバグは半透明のレンダーキューを「2501」以上にすれば治ります。
これでSkybox → 透過マテリアルの順で描画されます。

ちなみにUnity公式の半透明推奨値は「3000」です。

レンダーキューはマテリアルのインスペクターを確認。
lilToonの場合は基本設定の所にあります。
ここの値を「2501」にしてエンターキー。

VRChatに再アップロード。
これで半透明マテリアルがすごく光る現象が治ります。

おまけ:なぜlilToon半透明の初期値が2460なのか

結論は「本人に聞かないと分からない」です。
なので推測だけ書きます。

VRChatはいろんな人間が作った3Dモデルが登場します。
そして、ワールドやアバターなどで「レンダーキューの大乱闘」が始まります。

そして一番目立つ問題はワールドオプジェクトによる衣装や髪の描画削除問題。
運が悪いと半透明越しで見た形状の「衣装だけ」消えたりします。
↓奥の白い立方体が消えてるのがその一例

これの対処法は「後ろを先 → 前を後」で描くことです。
つまり後ろのオプジェクトを低めの値に設定すること。

↓レンダーキューを「後ろ:2460」と「前:2461」で設定。
 これで白い箱は消えませんし、透過物が前にある状態であれば表示エラーは回避できます。

つまり衣装などの消えたらまずいものはレンダーキュー値を低めに設定した方が良いです。
なのでlilToonは低めの値「2460」を使用していると考えられます。

ただレンダーキュー値を下げると今回紹介した問題が起こります。
Skyboxに対しては2500より大きいレンダーキューが無いと先ほどのようなエラーが起こります。

これに関しては完全な対策は無いです。
「衣装が消える」と「SkyBoxを見るとすごく光る」の2つで優先度を考えてlilToonは衣装が消えない方を重要としてレンダーキュー値を低めにする方を選んだと考えてください。

ユーザー側でできること

ユーザー側でできることは下記。

・消えても致命的な問題が起こらない半透明のモノはレンダーキュー値を「2051」に設定
・消えたら致命的な問題が起こるものはレンダーキュー値を「2460」のまま「Skyboxの表示エラーを諦める」

・ワールド制作時はなるべくSkyBoxが見えないよう壁で囲うなどの配慮をする
・半透明エラーが発生したときは「アバター」か「ワールド」を変更する

・そもそも全てにおいて可能な限りは半透明は使わないよう心掛ける

最強なのは半透明を使わないこと。
=「不透明」で表現すること。

半透明の使用は本当に最低限にしましょう。
バグる。

以上がVRChatの半透明マテリアルがすごく光る現象の対処法です。

まとめ

今回はVRChatで半透明を設定したマテリアルがすごく光る現象の対処法を紹介しました。

・透過マテリアル越しで背景を見るとすごく光ってみえることがある
・原因は「透過マテリアル」と「背景(Skybox)」の描画順
・対策は透過マテリアルのレンダーキュー値を2501にすること
・衣装などの描画削除対策でレンダキュー値2460などを維持したい場合はこの不具合は諦める

また他にもUnityや3DCGについて解説してます。

ぜひ、こちらもご覧ください。

コメント

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