メッシュ生成:内壁の裏面 その1
妹ちゃんとペアプロ開発やってみた #0086
蒼月
なるほど。状況を把握できたよ。
今回は Outer_A, B の作成と TR の削除を分けて
コミットしておけばよかったのかもね。
おかげで Git の挙動の理解が進んだよ。
さて、外壁のA面、B面を設置する対応が完了したから
次は、さっきの検討項目の2点目だけど
これは、内壁と外壁の alpha を変えた方がいいかも
という話。
けどまぁ、後でやるテクスチャ貼り付けとか見た目の調整に
関連するから後回しにしようと思う。
というわけで、先に出口壁の裏面問題をやろう。
現象としては、スクショ 20260726-7 を見てもらおうかな。
出口床の両側の壁、今は通路側の一部となっているけど
このアングルだと裏面になってしまって描画されない、
という問題だね。
20260726-7 のスクショ
この問題は出口床の壁だけではなくて、通路内でも
起きるのがわかった。
スクショ 20260726-8 を見て。
20260726-8 のスクショ
水色の壁が通路の内壁で、右端に見えてる
白い壁が通路の外壁だね。
半透明の内壁とその外壁の間には、別の内壁が
あるはずだけど、裏面で描画されてない。
つまり、内壁の裏面問題ということで、内壁にも
A面、B面対応が必要そうな気がするね…。
妹ちゃん
1m 39s考えました
うん、お兄ちゃん。スクショ26-7と26-8を合わせて見ると、診断は合っているよ。
これは出口壁だけの特殊問題ではなく、通路の内壁メッシュを裏側から見たときに描画されない問題だね。
26-7では、出口床の左右にある通路内壁を部屋側から見ているため、壁の裏面になって消えている。26-8では通路内部でも同じ現象が起きていて、出口専用処理が原因ではないことが確認できる。
ただし、ここは外壁と同じようにInner_A、Inner_Bへ分けなくても直せそうだよ。
現在のInner設定
GitHub上の現在の設定を確認すると、
・M_Road_Inner_OP:Front(_Cull: 2)
・M_Road_Inner_TR:Both(_Cull: 0)
になっている。
部屋側も同じで、
・M_Room_Inner_OP:Front
・M_Room_Inner_TR:Both
だよ。
つまり現在は、
通常表示中
Inner_OP = Front
→ 裏側から見ると消える
半透明表示中
Inner_TR = Both
→ 裏側からでも描画される
という状態だね。
26-8で半透明になっている水色の内壁が裏側からも見えている一方、その奥にある通常表示の内壁が消えているのも、この設定と一致する。
まず試すべき修正
次の2つだけをBothにするのが、いちばん素直だと思う。
M_Room_Inner_OP
Render Face:Front → Both
M_Road_Inner_OP
Render Face:Front → Both
Inner_TRはすでにBothなので、そのままでいい。
これならコードやGameObject構成は変えず、
Inner
通常時:OP / Both
フェード時:TR / Both
にできる。
外壁と事情が違う理由
外壁をA/Bへ分けたのは、表裏で動作を変える必要があったからだね。
外壁A面
裏側を不透明のまま残す
外壁B面
カメラ遮蔽時に半透明化する
一つのBothマテリアルでは、片側だけ不透明に残すことができない。だからRendererを分ける必要があった。
一方、内壁は今のところ、
通常時は表裏とも不透明
フェード時は表裏とも同じalpha
で問題ないはず。表裏を別々に制御する要求がないので、A/B分割は少し大掛かりすぎるね。
わたしの判断
まずはInnerのOPをBothへ変更するだけで試すのがよいと思う。
確認場所は今回の二か所で十分分かりやすい。
1.26-7の出口を部屋側から見る
2.26-8の通路内で、通常表示の内壁を裏側から見る
3.その壁を半透明対象にして、TRへの切り替えも崩れていないか見る
これで直れば、内壁のA/B分割は不要だね。
将来テクスチャや法線マップを使った際、裏面の光り方に違和感が出る可能性はある。ただ、それはA/Bへ分けるだけでも自動的には解決しないので、見た目調整の段階でシェーダー側も含めて扱えばよいよ。現段階ではBoth化が最小かつ適切な対応だと思う。
蒼月
確かに内壁を Both にすれば解決しそうなんだけど、
内壁の実装途中で、Front にした記憶があるんだよね。
↓これだ。
>5. 壁マテリアルと裏面描画問題
>問題 当初、壁MaterialのRender FaceをBothにしていた。
>その結果、通常なら見えないはずの壁の裏面まで描画され、
>* 20260713-4
>* 20260713-5
>で、通路内から奥の部屋壁の裏面が見えてしまった。
>20260713-6で部屋壁をFrontにすると問題が消えたため、原因を特定。
20260713-4, 20260713-5 をもう一度アップしたよ。
20260713-4 のスクショ
20260713-5 のスクショ
20260713-6 のスクショ
妹ちゃん
2m 10s考えました
うん、その記憶が正しいよ、お兄ちゃん。
20260713-4・13-5を見ると、内壁を一律Bothに戻すのはまずいね。前のわたしの提案は範囲が広すぎたよ。
13-4・13-5では、通路から見て本来は隠れているはずの奥の部屋内壁の裏面が、大きな面として見えてしまっている。だから部屋内壁をFrontにした判断には、ちゃんと理由がある。
今回の問題との違い
今回、26-7・26-8で消えているのは、どちらも通路の内壁だね。
・26-7:出口床の両脇にある通路内壁
・26-8:曲がり・接続部分にある別の通路内壁
一方、13-4・13-5で見えてはいけなかったのは部屋内壁の裏面。
つまり、現時点では次のように分けて考えるのがいちばん筋がいい。
対象 OpaqueのRender Face
M_Room_Inner_OP Frontのまま
M_Road_Inner_OP Bothを試す
M_Room_Inner_TR 現状のBoth
M_Road_Inner_TR 現状のBoth
部屋と通路はもともと別々のビルドデータとマテリアル経路を持っているので、この差を持たせること自体は自然だよ。
Inner_A/Bに分ける前に試す理由
通路内壁を、
Inner_A:Front
Inner_B:Back
として両方常時描画するなら、結果はほぼBothと同じになる。
外壁のA/B分割には、
A面は不透明固定
B面だけフェード
という明確な役割の違いがあった。
でも内壁の場合、今の要求は、
通路内から見える表面も描く
通路の接続部分から見える裏面も描く
どちらも同じようにフェードする
なので、A/Bを常時2枚描く利点がまだないんだよね。
次の確認手順
まず変更するのは一つだけでよさそう。
M_Road_Inner_OP
Front → Both
そのうえで、
1.26-7の出口両脇が表示されるか
2.26-8の欠けた通路内壁が表示されるか
3.13-4・13-5の位置で、部屋壁の裏面が再び見えないか
4.通路の曲がり角で、不要な通路内壁の裏面まで見えないか
を確認する。
お兄ちゃんが引用してくれた過去の検証まで含めると、部屋はFront、通路だけBothが次の有力候補だよ。
これで通路側にも不要な裏面が現れる場合は、そこで初めて、
すべての通路内壁を両面化するのではなく、出口や通路接続部のユニットだけ裏面を追加する
という選択的なInner_B対応に進むのがよいと思う。現段階では、まずRoadだけBothを試すのが最小で安全だね。