強火で進め

このブログではプログラム関連の記事を中心に書いてます。

Unity でのZファイティング(Z-Fighting)の対処法

3DCGのレンダリング時にはZファイティングと言うものが発生する時が有ります。

これは同じ位置に2つのポリゴンが存在する時にレンダリングされるピクセルが2つのポリゴンが混ざってしまう現象の事です。

例えばUnityで同じ位置にサイズの異なる2つの Plane を配置するとこの様なレンダリング結果になってしまいます。

これは本来であればこの様にレンダリングして欲しい所です。

まず、直ぐに思いつくのは青色の Plane をカメラに近い位置に移動させるという方法です。これで問題無い場合にはこれでOKです。

他のアプローチとしてはシェーダに Offset の設定をするという方法です。
※ Offset のリファレンスはこちら
OpenGL に詳しい方には glPolygonOffset() と同様の処理と考えると良いでしょう。

SubShader のブロックの先頭に以下の様に記述して使います。

SubShader {
	Offset -1 , -1

ここで記述する -1 の値などを Inspector などで指定出来ればベストなのですが公式のリファレンスに記載が有る様にここは定数で指定しないとエラーと成りますので注意して下さい。

基本的には内蔵シェーダのソースコードをダウンロードして来て、この記述を追加するだけで対応出来ます。

内蔵シェーダのソースコードのダウンロードについてはこちらを参照して下さい。

参考情報

Z-Fightingと Offset の設定による対策についてはこの本で詳しい解説が記述されています。

Unity iOS ShaderLab - Tutorial 10-1 (Z-Fighting) - YouTube
http://www.youtube.com/watch?feature=player_embedded&v=f7zDKlsyu6s#!

【Unity】Z-Fightingと計算誤差【RenderDoc】
https://zenn.dev/r_ngtm/articles/unity-z-fighting