テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】壁や床の絵がチラチラするアレを何とかする

f:id:tsubaki_t1:20161026231609j:plain

今回は壁や床の絵がチラチラパタパタするアレ、
要するにZファイティングについてです。

 

壁や床の絵がチラチラするアレ

Unityを始めたばかりの人がよくやるミスなのですが、カメラを動かした際に地面の色がパタパタしてるケースがあります。

これは Z-fighting と呼ばれる物で、同じ空間に二つの面がある場合に発生します。どちらもZ値的には同じ値を持っているので、ピクセルを塗る際に競合し戦う事から、この名前が付いてるんじゃないかなと予想です。

f:id:tsubaki_t1:20161026232301g:plain

 

Zファイティングの解決方法

解決方法は大きく分けて3つです。

最も楽な方法が、片方の板をほんの少しズラす事です。同一の位置に無ければ問題は無いので、少しカメラ的に手前にズラす事で、Zファイティングはある程度回避出来ます。

例えば下の図では、y方向に(Unity 5.5なら)0.0001程ズラす事で、Zファイティングの範囲をかなり抑えています。

f:id:tsubaki_t1:20161026232845j:plain

 

なお小数点誤差やらで値を丸められると効果は無いです。例えば0.00001だけズラす場合、Zファイティングは起こります。

f:id:tsubaki_t1:20161026233146j:plain

 

Transform的にズラす他、シェーダーでoffsetを指定して少し手前もしくは奥にズラすアイディアもあります。

d.hatena.ne.jp

またCameraのNear Farの設定を狭くする事でも、ある程度の効果が見込めました。

f:id:tsubaki_t1:20161026234126j:plain

 

Unity 5.5の仕様変更

Unity 5.5にてZバッファを逆転したみたいです。これはGTA5で使われてる手法(WIkiperidaによると)らしく、より精細な情報を格納出来るようになるみたいです。

 実際確認してみると、Unity 5.4では0.001でZファイティングが起こるのに対し、5.5では0.0001からZファイティングが起こっています。

ただし、それによって幾つかのシェーダーは修正する必要があるみたいです。

qiita.com

docs.unity3d.com

あとで追記予定