夜になると道路が黒い破片になった。太陽を沈ませていなかったから
前回と同じ場所を疑って、遠回りをした。
日本進化シミュレーション第7回 / 全16回目次
シャドウアクネを直して、昼間の道路はきれいに一本につながるようになった。
安心したのも束の間、今度は夜になると、道路や建物の影がいびつな黒い破片になって散らばるようになった。
昼間は問題ない。夜だけおかしい。
その時点で僕は、バイアスの値そのものが悪いわけではなさそうだと見当がついた。
バイアスは影が出る限りずっと同じ値のはずで、昼夜で挙動が変わるということは、影の出方自体が昼夜で違う計算をされているということになる。
太陽が、地平線の下でも「浅い角度」に固定され続けていた
調べていくと、太陽の高さを扱っている関数に、こういうクランプ処理が入っているのを見つけた。
Math.max(h, 0.04) * disthは太陽の高さを表す値で、夜は本来マイナスになる。
ところがこのMath.maxのせいで、マイナスになった瞬間に0.04という小さな正の値へ強制的に置き換えられていた。
つまり太陽は、日が沈んだ後も「地平線すれすれの、ものすごく浅い角度」に固定されたまま、影を焼き続けていたことになる。
道路や建物のような薄い箱状のジオメトリは、光が浅い角度で当たると影が異常に伸びる。
伸びた影が重なり合って、黒い破片のノイズに見えていた。
バイアスの調整だけでは消えない種類の問題だった
最初は、前回と同じようにバイアスの値をもう少し詰めれば直るだろうと思っていた。
実際にはそうはならなかった。
これは継ぎ目の自己遮蔽ノイズではなく、そもそも影の焼き方そのものが物理的におかしい状態だった。
バイアスは「継ぎ目のノイズを抑える」ための調整で、「浅すぎる角度で伸びきった影」を消すための機能ではない。
種類の違う問題を、同じ道具で直そうとしていたことに、しばらくしてから気づいた。
対応は「夜は影を落とさない」だった
結局、太陽の角度をどう補正するかではなく、条件を分けることにした。
太陽の高さがある値(実質的に日が沈んでいるとみなせるライン)を下回ったら、影を落とす設定そのものを切る。
昼と薄明かりの間だけ、太陽の影を落とす。
夜は、環境光と半球光だけで見せる。
影が無くても、夜は元々暗いので、見た目の破綻としては気づかれにくい。
直す場所を間違えていた時間
振り返ると、最初にバイアスの調整だけで粘っていた時間は、あまり実りのない時間だった。
症状が似ていても、原因が同じとは限らない。
「前回と同じ場所を触ればいいはずだ」という思い込みが、遠回りにつながった。
昼のシャドウアクネと、夜の破片状の影。
どちらも「道路の影がおかしい」という同じ見え方の報告から始まったけれど、直す場所はまったく別だった。
症状の見た目が似ているときほど、原因まで似ているとは限らないと自分に言い聞かせている。
※運営者が個人で書いているnoteです。