今回は壁や床の絵がチラチラパタパタするアレ、
要するにZファイティングについてです。
壁や床の絵がチラチラするアレ
Unityを始めたばかりの人がよくやるミスなのですが、カメラを動かした際に地面の色がパタパタしてるケースがあります。
これは Z-fighting と呼ばれる物で、同じ空間に二つの面がある場合に発生します。どちらもZ値的には同じ値を持っているので、ピクセルを塗る際に競合し戦う事から、この名前が付いてるんじゃないかなと予想です。
Zファイティングの解決方法
解決方法は大きく分けて3つです。
最も楽な方法が、片方の板をほんの少しズラす事です。同一の位置に無ければ問題は無いので、少しカメラ的に手前にズラす事で、Zファイティングはある程度回避出来ます。
例えば下の図では、y方向に(Unity 5.5なら)0.0001程ズラす事で、Zファイティングの範囲をかなり抑えています。
なお小数点誤差やらで値を丸められると効果は無いです。例えば0.00001だけズラす場合、Zファイティングは起こります。
Transform的にズラす他、シェーダーでoffsetを指定して少し手前もしくは奥にズラすアイディアもあります。
またCameraのNear Farの設定を狭くする事でも、ある程度の効果が見込めました。
Unity 5.5の仕様変更
Unity 5.5にてZバッファを逆転したみたいです。これはGTA5で使われてる手法(WIkiperidaによると)らしく、より精細な情報を格納出来るようになるみたいです。
実際確認してみると、Unity 5.4では0.001でZファイティングが起こるのに対し、5.5では0.0001からZファイティングが起こっています。
ただし、それによって幾つかのシェーダーは修正する必要があるみたいです。
あとで追記予定