Zバッファ干渉と多重テクスチャの話

木陰の記事でZバッファ干渉の対策について少し触れましたが、そもそもZバッファ干渉とは何ぞやということを一つも説明していなかったので記事にしておきます。

ちなみにZバッファ干渉という用語はVRM発祥のようで、一般的にはZファイティングと呼ばれているらしいのですが、”Zバッファ干渉”の方が分かりやすいかなぁと思っているので以下この呼び方を使っていきます。

1. Zバッファ干渉とは

RailSimをやっていて、以下のような経験をしたことがあるのではないでしょうか。
・レイアウトを俯瞰すると道路や水田がチラつく
・視野角を調整すると家の窓がチラつく
・組駅でホームを重ねて置いたらチラつく
いずれもZバッファ干渉が原因です。
RailSimで遊んでいると何かと付き纏うこの干渉。そもそもどうしてこのような現象が起こるのでしょうか?
RailSim 影のある樹木
▲干渉対策を行っていない樹木PIでの例です。対策をしていない影はカメラの角度によってチラついてしまいます。

2. Zバッファ干渉の仕組み

3DCGの描画処理の技術の一つに”Zバッファ法”というものがあります。詳しいことは割愛しますが、要は
“オブジェクトまでの距離を計算し、より奥にあるものを描画しないことで描画リソースを節約する技術”
です。
RailSimではこのZバッファ法によりオブジェクトとの距離を常に計算しながら描画を行っているのですが、以下のように平行して近接しているポリゴンではどちらが奥でどちらが手前なのか判断ができず、計算の度に前後が入れ替わってチラついてしまうのです。

本来であれば同一平面上(距離がほぼゼロ)にポリゴンを重ねなければこの干渉は発生しないのですが、RailSimはそのあたり厳しいようで、数cm離していたとしても遠くから見ると干渉を起こしてしまう場合があります。

3. 3つのZバッファ干渉対策

じゃあどうすりゃいいんだという話ですが、解決策は大きく分けて次の3つ
・そもそも近接した平行ポリゴンを使わない
・平行ポリゴンを使う場合は距離を離す
・多重テクスチャを使う

この3つを適材適所使い分けていくことで、Zバッファ干渉問題のほとんどは解決できるはずです。
それでは一つずつ見ていきましょう。

3.1.そもそも近接した平行ポリゴンを使わない

当たり前の話ですが重要なことです。電車の前面などは特に望遠圧縮等で干渉の影響を受けやすいところなので、平行ポリゴンを作らないようなモデリングをすることが大切です。
RailSim 製作支援 Zバッファ干渉の対策例 103系
▲103系初期車のモデルです。前照灯部分に穴を開けていますが、これは前照灯のレンズ部分と前面外板が近接して干渉が起こるのを防ぐための処置です。

3.2.平行ポリゴンを使う場合は距離を離す

しかし平行ポリゴンを全く使わないというのも難しい話です。車番等のレタリング等は車体のtexに直接書きこんでしまうと変更が難しいので、透過のポリゴンを用意して車体に重ねて配置する方法が最も現実的でしょう。

RailSim 製作支援 Zバッファ干渉の対策例 旧型客車
▲旧客等、この手の側面車番や標記類は、車体から7mm離して透過のポリゴンを置いています。なので微妙に浮いているのですが、影が落ちない設定にしているので目立ちません。
RailSim 製作支援 Zバッファ干渉の対策例 旧型客車
▲参考で上のオハフ61の車番のNoCastShadowを消して影を落としたもの。浮いているのが一目瞭然ですね。

この方法のメリット・デメリットは

メリット

◆作るのが楽
モデルを作成する時にあまり考える必要なくペタペタ貼っていけるので楽です。
◆自由度が高い
車両によって標記の位置が異なる場合が結構あるかと思います。この方法は単に一枚のポリを浮かせているだけなので、オブジェクトを分割してしまえば自由自在に動かすことが可能です。

デメリット

◆結局根本的解決にはならない
平行ポリゴン間の距離を離しても、結局平行ポリゴンですので視点を遠く(200mくらい先)に持っていくとチラつくのには変わりありません。あくまでチラつき軽減の処置です。
◆影の問題がある
浮かせてポリゴンを配置しているので影との相性が悪いです。透過側のポリゴンにはNoShadowの設定が必須になります。
(NoReceiveShadowだと透過ポリゴンの影が落ち、NoCastShadowだと架線影等が段ズレする)

という感じです。この手法は楽で汎用性が高いのでよく使っているのですが、如何せん影の問題があるので前面等目立つところは後述の多重テクスチャの方が向いているかもしれません。

3.3.多重テクスチャを使う

平行ポリゴン間の距離がゼロに近いとZバッファ干渉を起こすという風に書きましたが、2枚のポリゴンの頂点座標が完全に一致していて距離がゼロの場合は干渉が生じません。
この性質を利用してポリゴンを重ねて表現する技法をRailSimでは多重テクスチャと呼んでいるようです。
RailSim 製作支援 Zバッファ干渉の対策例 国鉄201系
▲まずは実例を。103系と201系、JRマーク部分の違いがお分かりいただけるでしょうか。103系には架線影が落ちていませんが、201系には落ちていますね。

103系は3.2.で取り上げた透過ポリゴンで浮かせる方式にしているのですが、対する201系では多重テクスチャを使っているので影が落ちるようになっています。
<多重テクスチャの作り方>
上でだいたい説明が終わってしまったような気がしますが、頂点座標を全て揃えたポリゴンを重ねると、Zバッファ干渉を起こさずに重ねることができるという性質があります。この場合、透過順序は材質順によって決まり、メタセコイアの材質パネルで下にある方のテクスチャが手前に表示されます。
201系の例で軽く見ていきましょう。
RailSim 製作支援 Zバッファ干渉の対策例 国鉄201系
▲201系の前面まわり。JRマークの周辺が分割されています。
RailSim 製作支援 Zバッファ干渉の対策例 国鉄201系
▲JRマーク部分をスライドさせた図。下のブラックフェイス部分にもJRマークのポリゴンと同じものが見えますね。
ブラックフェイスとJRマークで頂点座標を揃えて多重テクスチャを使うことで、同一平面ながらZバッファ干渉の影響を受けずにポリゴンを重ねることができています。
もちろんこの場合、JRマークの材質はブラックフェイスのものよりも下に配置しています。
RailSim 製作支援 Zバッファ干渉の対策例 多重テクスチャを使用する時の材質パネル
▲メタセコイアの材質パネル。JRマークがブラックフェイス(材質名”前面塗装2″)の下に来ています。

多重テクスチャの作り方は以上です。
影の処理についてですが、2つのポリゴンが同一平面にあるので影をオフにする処理も必要なく、そのお陰で上の201系のJRマークに影が落ちるようになる…というわけです。

さて多重テクスチャのメリットとデメリットをまとめましょう。

メリット
◆チラつきの心配がない
Zバッファ干渉の問題が解決されているのでチラつきの心配がありません。
◆影が落ちる
シャドウカットの処理が必要ないのでちゃんと影が落ちます。特に白くてそれなりの大きさのある標記などは影が落ちないと不自然に見える場合があるので、影がしっかりと落ちることは重要です。

デメリット
◆モデルを多重テクスチャ前提で組む必要がある
地味に面倒です。作り方にもよりますが、
・2枚目のポリゴンが載る場所を作る
・そのポリゴンをコピペして2枚目のポリゴンを作る
・2枚目のポリゴンの材質を変更してマッピングを再度行う
という手順を要するため、3.2.の方法に比べて実装が面倒です。
また、重ねるポリゴンが多いとポリゴン数が増えて重くなります。

◆自由度がない
多重テクスチャを貼る位置はモデルで固定されているので、スイッチで位置を微妙に変えたいという時にテクスチャの変更によって変えることしかできません。103系のJRマークは、車両によって貼り付け位置が微妙に違うので多重テクスチャを用いるのはかなり難しいです。

こうしてメリットデメリットを挙げると、あまりコスパのよろしくない技法にも思えますが、汎用性は高い技法なので色々使えると思います。以下にいくつか適用例を挙げていきます。
・夜間発光に使う
元々夜間発光はこのやり方が推奨されています。窓の部分に発光用テクスチャを重ねて、構文で制御してやることで窓のチラつきなく夜間発光を実装することができます。
・下地と描き込みを分離したい時に使う
直近の適用例は旧客の屋根です。旧客は形式によってベンチレーターの位置が異なるので、ベンチレーター影の描き込みが必要になってきます。今回の旧客では屋根色のバリエーションがありますので、それぞれの色に対して形式毎のベンチレーター影を描き込むとtexの数がとんでもないことになってしまいます。
そこで、屋根色の下地ポリゴンとベンチレーター影のポリゴンを重ねた多重テクスチャの構成にしました。
こうすることでtexは屋根色分+形式毎のベンチレータ影分だけとなり、tex枚数が節約できます。
RailSim 製作支援 Zバッファ干渉の対策例 多重テクスチャの使用例 旧型客車の屋根

他にも細々とした適用例はありますが、基本的な考え方は先述の通りです。

以上、Zバッファ干渉とその対策についてまとめました。

上記の方法はあくまで一例なので、参考程度にして自分のやりやすい方法を探してみてください。

コメント

タイトルとURLをコピーしました