板ポリの面がぴったり同じ座標で重なるとチラチラするのをZファイティングといいます。
ケロリン町の道路の白線とかで建物の板ポリ窓とかをデカールとしてぴったり壁に貼り付けたのち、ちょこっと浮かせてるのが、それ対策ですね。
この浮かせも、MMDでの表示に耐えられるギリギリの最小限を見極めて、何度も試行錯誤してセッティングする苦労を要するのですが…
それが、Unityだとものすごくチラチラが激しい。
ちょっとやそっと浮かせたぐらいじゃチラチラが収まってくれない。
めっちゃ浮かさないと解消しないが、それだとデカールとして機能しない。
これじゃ窓を板ポリ一枚で表現とかきっつい、白線なんて無理ゲーだろ!と
解決方法がわからず、ずっと問題を先送りにしてました。
そもそもZファイティングという言葉がある事自体最近やっと知った程度
しかしまあ語呂悪いな
この記事によると、
http://tsubakit1.hateblo.jp/entry/2016/10/26/235900
やっぱUnityはもともとチラチラが激しくなりがちな仕様で、それがUnity5.5で改善されるようですが、
記事にそろっと書いてあった、シェーダーでオフセットする手段というのが気になったので、自分でやってみました。
…これプログラム知識のないモデラーに自力でやれって無理だ。
奇跡的に成功したぽいので、ここにやりかたを記します。
手順
0 まずUnityを起動します。
1 自作シェーダーを新規作成
Assetフォルダ内で、右メニューcreate>Shader>Standard Surface Shader
これで自作シェーダーが作れます…が、カラーマップしか設定できないので無意味。やらんでね
デフォのStandardShaderが使いたいので、ビルトインシェーダーをダウンロードしてソースコードを入手します。
https://unity3d.com/jp/get-unity/download/archiveから、ダウンロード>ビルトインシェーダーを選択、
DLしたZIPの中にStandard.shaderがあるのでそれをAsset内の適当な場所に入れて、コレを自作シェーダーの基にします。
2 シェーダーの名前を変える
1の自作シェーダーをダブルクリックか0penするとエディタを開くはずなので、
まずは名前を変えます。1行目
こんなふうに
3 オフセットを記入する
SubShader{}の中のどこかにOffset -1 , -1と記入します。
※重要:- 1とかスペースがあくとシンタックスエラーになります(エディタにコピペするとなぜかスペースが強制挿入される。なんでだよ。ctrl+shift+Vで回避できます)
※ついでにcull offを記入すると、両面表示になります。これも超便利
Unityのマテリアルには両面表示の設定がないみたいで、両面シェーダーも自作する必要があります。
※重要:SubShader{の後にPass{とかある場合は、Pass{}の中に記入します。
Pass{}は複数あるので、全てに記入します。
記入例↓たぶんCGPROGRAMの行の直前に書いとけば無難じゃないかなー
検索して見つけた記事どれもこれも、こういう具体的な記入例が書いてなくて、ここまでこぎつけるのにどれだけ苦労したか…
4 セーブしてUnityに戻って、自作シェーダーにSyntaxErrorがでなければたぶん成功です。
5 y=0の地面に置いた板ポリに、自作シェーダーを割り当てて確認します。
2でつけた名前がマテリアルのシェーダーのリストに追加されてるはずなので、
↓
↓
成功みたい
これで!白線が!窓がっ!!看板がーーーっ!
この自作シェーダーを複製して、オフセットの-1の値を適当に変えたら、重なり合う複数の(別材質の)板ポリをチラチラさせずに表示できるのかな?
↓道路・白線・側溝・道路のヒビがそれぞれ個別の板ポリと値を変えたオフセットシェーダーを割り当ててます。すべて地面とはゼロタッチですが、ちらつき一切なし
Terrainで作った地面のように、つなぎ目のない複雑な地形が実現できる?
建物のメッシュを複製して、材質と壁のシミとライトマップを重ね貼りもできるのか?
なお、試行錯誤段階でこんなんなりました↓
・ポイントライトなど、DirectionalLight以外の光源が効かない
・Staticにしてのライトマップが正常に効かない
全部のPass{にoffsetを書いてなかったら、こうなりました。
ライトは直ったけど、現時点でもライトマップは怪しい感じです。そもそもライトマップはメッシュに厚みがないとうまくいかないし…
なお他のシェーダーとかポストエフェクト(イメージエフェクト)とかと同時に使ったらどうなるかまでは検証してません。(MMEでもそういう残念な競合がどれだけあったろう…)
てっとりばやくこの自作シェーダーがほしい方はこちらからどうぞ。
でも後々のためにいちど自分で作ってみるの奨励ですね。スタンダード以外のシェーダーでもプチ改造ができれば助かることも多いはず。
そういや、このオフセットがMMDで同様のことができるのかも課題です。
そうでないとUnityでパーツ配置してMMDでも使うというプランが。。。
前髪で隠れてる目や眉毛を強制前面表示するエフェクトとかあるぐらいだから、できるのかなーと予想しますが、エフェクトいじれない素人にはわかりません。
やっぱり少しは手作業で浮かせるといいんだろうか。