PN Triangles法を採用したロストプラネット2が直面した問題

PN Triangles法を採択したロストプラネット2だが、いざ実装してみると、一部のポリゴンの継ぎ目で穴があく「クラック」現象に直面することとなったという。これは、同じ座標の頂点で法線ベクトルが異なっていたり、T字状にポリゴン同士が隣接する点で起こっていることが確認され、対策が講じられることとなった。

また、クラックは起こらないものの、真っ直ぐのままでいて欲しいところが丸くなったり、丸くなりすぎる箇所も出てきて、見栄え状の問題も浮上したようだ。

PN Triangles法におけるクラック問題

まず、クラック問題については、縮退ポリゴンを仕込む案などが検討されたという。しかし、「ポリゴン分割を正しく行うために、ポリゴンを埋め込む」という矛盾を生み、取り扱う3Dモデルの基本ポリゴン数が増加してしまうデメリットをも併せ持つことになるため、開発チームは、「ジオメトリ法線」と呼ばれる対応策を考案するに至る。

クラック対策

これは各頂点が持っている法線ベクトルに対し、もう一つ、ポリゴン分割用の法線ベクトルを増設するアイディアになる。同一座標に2つの頂点があって、それぞれが異なる法線ベクトルを持っていることがクラックの原因なのだから、これを一意に統合して、追加の法線ベクトルとして各頂点に持たせるようにしたのだ。一頂点あたりの情報量は増加するが、縮退ポリゴンを仕込むよりはパフォーマンス的にはましだという判断だ。

このジオメトリ法線は、問題となるエッジを構成する2頂点の2ペアの法線ベクトルのうち、内積が小さい方を採択し、さらにこれを平均化する演算をオフラインで行って仕込むことになる。

ジオメトリ法線

この工夫によってクラックは解消されたが、今度はテクスチャが歪んだり、曲面が丸くなりすぎるという新たな問題を生むこととなった。

ジオメトリ法線の問題

この問題は、やはりエッジ付近で起こっていることが分かったことから、エッジ付近を判別できる仕組みを盛り込み、対処することにしたのだ。

具体的には、まず、テッセレーションによってクラックが発生するか否かのフラグを各頂点に仕込んでおく。ランタイムでは、クラックが発生する箇所かどうかをフラグで判定して、「クラックが発生しうる」と判定できた箇所でのみジオメトリ法線情報を元にテッセレーションを行うようにすることにしたのだ。

エッジ単位の制御

この他、T字状にポリゴンが隣接する箇所で起こるクラックに対しては、やはりこうしたT字状交差点を含むエッジであるか、否かというフラグを設定して、ランタイムでは、該当箇所にはテッセレーションを回避するという対処を行っている。

その他のクラッキング

テッセレーションを行ったことで、3Dモデルが妙に丸くなったり、太くなったりする問題については、アーティストがライティング効果や質感表現の意図で、ジオメトリ構造的には正しくない法線を仕込んでしまっていたことに原因があったという。

これをキャンセルするわけにも行かないため、開発チームはテッセレーションステージとの親和性を図るため、エッジの長さ、丸さに基づいた調整パラメータを導入した。これは、要するに、テッセレーションによる曲面効果の曲率を他よりも緩やかにする(つまり、あまり丸くならない)調整パラメータを動に有したと言うことだ。これは最終的にはマテリアル単位に調整できるパラメータとして実装された。

デザイン的な問題への対処