Overview of Release 3.0

Overview of Release 3.0



バージョン 3.0

OpenSubdiv 3.0 は根本的に変更されたコアアルゴリズム、簡単になったAPI、効率的に なったGPUカーネルなど多岐にわたる大きな変更を行った新バージョンになります。 より高速、効率的でフレキシブルなサブディビジョンサーフェスのライブラリを提供する ことが私達の主な目的であることは変わっていませんが、そのために OpenSubdiv 3.0 は 数多くの改良が施され以前のバージョンから大きく変わりました。


サブディビジョン・コア (Sdc)

過去・現在・未来に使われた、使われるであろう様々なトポロジ表現を考慮して、 サブディジョンの根本的な規則と各種サブディビジョンスキームは新しい低レベルレイヤー Sdc (サブディビジョンコア) にまとめられました。このレイヤーは利用可能な オプション、例えばセミシャープクリースをサポートするための計算式、各種サブディビジョン スキームの分割重みなどを集約しています。これは「計算方法をメッシュから分離」する のが目的です。

Sdc は OpenSubdiv で一貫性のあるサブディビジョンアルゴリズムを実装するための 低レベルな機構です。OpenSubdiv 自身で使われる他、OpenSubdiv と同じになる実装を クライアントアプリケーションで実装するためにも使うことができます。


トポロジーと分割

OpenSubdiv 3.0 は新たに 一時的に 内部で利用するトポロジ表現、Vtr (ベクトル化トポロジ表現) を導入しました。以前のバージョンで使っていた Hbr に比べると、Vtr は Far で利用するトポロジ解析をより効率的に、柔軟に行うことが できます。Hbr は OpenSubdiv では利用しなくなりますが、レガシー互換や テストのためにライブラリ内に残してあります。

高速なサブディビジョン

非多様体トポロジのサポート

トポロジ変換でHbr を使わなくなったため、OpenSubdiv は多様体メッシュ以外にも 使えるようになりました。一つの例外(ループ分割での非三角形)を除き、一般的な ファイルフォーマット(obj や Alembic)で表現できるどんなフェイスや頂点の構成 でも分割が可能です。ループ分割のサポートは今後充実する予定で、その例外もいずれ なくなります。

トポロジの簡単な変換

以前のように HbrMesh を構築するのではなく、いくつかの方法でクライアントアプリケーション からトポロジを与えることが可能です。単純に使える高レベルインターフェイス、あるいは より効率を求めるなら複雑な低レベルインタフェースを使ってトポロジを構築することが できます。

面変化(Face Varying)トポロジ

以前は面変化データは各面の各点について割り当てられ、値を比較することで繋ぎ目を 検出していました。この場合、意図せず2つの値が共有されてしまう問題がありました。

3.0 からは面変化データはトポロジで与えることになります。これは頂点のトポロジ が**頂点**集合と整数の頂点への参照(インデックス)で与えられるのと同じように、 面変化データも**値**の集合とそれへのインデクス、で定義されるようになります。 もしある頂点で面ごとに異なる値になる場合は、インデクスが変わる、ということ になります。このとき 頂点 の数と 面変化データの値 の数は異なる場合が ありますが、インデクスの総数は同じになる、ということに注意してください。

面変化データトポロジは主要なファイルフォーマットである obj, Alembic, USD で 使われている表現方法と同じになります。複数の面変化データのチャンネルはそれぞれ のトポロジで独立に表されます。


リミットプロパティとパッチ

OpenSubdiv の根本的な目標は、正確かつ信頼性のあるリミットサーフェス表現を提供する ことにあります。サブディジョン階層中のコントロール点におけるリミットサーフェスの値 (座標、接線)の計算、およびパッチを使った任意の場所でのリミットサーフェスの値の 計算に様々な改良が行われました。

固定長の頂点価テーブルの廃止

特異頂点でのリミット値はどんな価数の頂点でも計算でき、新しい種類のパッチは 組み込みの固定長テーブルを使わなくなりました。頂点価数を制約していたテーブルは 削除されました。

新しいトポロジ表現での価数に関する唯一の制約は、符号なし16ビット整数(65,535) の範囲になります。この制限は 32ビット整数にしてコンパイルすることで取り除くことが できますが、ほとんどの場合メモリの無駄になってしまうため、16ビット整数は合理的で あると考えています。

シングルクリースパッチ

OpenSubdiv 3.0 は新たに効率的にセミシャープクリース(*)を評価できる シングルクリースパッチを実装しました。この最適化により、高いシャープネスを 持つエッジを非常に高速かつ省メモリに効率的に取り扱うことができます。

(*) Niessner et al., Efficient Evaluation of Semi-Smooth Creases in Catmull-Clark Subdivision Surfaces. Eurographics (Short Papers). 2012. http://research.microsoft.com/en-us/um/people/cloop/EG2012.pdf

新たな非正則パッチの近似方法

以前のバージョンのグレゴリーパッチもレガシーとして残してありますが、幾つか 新しく非正則パッチの表現に使う選択肢を追加しました。グレゴリー基底パッチ(新)、 Bスプライン基底パッチが新しく選択可能です。グレゴリー基底パッチは以前の バージョンのグレゴリーパッチと同じ精度の近似を行いますが、パッチ頂点を ステンシルテーブルで事前処理することで以前より高速でシンプルなGPU描画が 可能です。Bスプラインパッチはグレゴリー基底パッチより精度が落ちますが、 適応分割メッシ全体を単一のシェーダで描画することが可能になります(グレゴリー基底 パッチは正則パッチ以外に別のシェーダがひとつ必要です)

新しいグレゴリー基底パッチとBスプラインパッチによる非正則パッチでは、以前にあった 最大価数の制約がなくなります。レガシーグレゴリーパッチは依然として最大価数の 制約があります(通常24、ハードウェアの GL_MAX_VARYING_VECTORS に依存)

ただし、モデリングの際には価数を低く抑えておくことがクオリティとパフォーマンスの 両面で重要であることは変わっていません。


高速な演算と描画

OpenSubdiv 3.0 は CPU・GPU どちらの場合でも、繰り返しサブディビジョンを行う 際のパフォーマンスを向上する新しいデータ構造とアルゴリズムを導入しました。

ステンシルテーブル

OpenSubdiv 3.0 は従来のサブディビジョンテーブルのかわりにステンシルテーブルを 使います。サブディビジョンテーブルクラスはデータに相互依存があり並列実行の際に 同期処理や別カーネルの実行が必要でした。これらの依存は事前計算で処理され、 ステンシルテーブルになります。

ステンシルはデータ依存がなく単一のシンプルなカーネルで処理されます。これにより 事前計算、GPU実行ともに高速化され、ドライバのオーバヘッドも減りました。 ステンシルテーブルのバックエンドは以前のバージョンと同様のものがサポートされて います(GCDを除く)

高速、シンプルなGPUカーネル

GPU側では、サブディビジョンテーブルのかわりにステンシルを使うことでボトルネックが 解消され、4倍近くの高速化ができています。また複雑な補間がモデルごとに一回のカーネル 実行になることで、モバイルプラットフォームなどで大きな性能向上が得られます。

結果として演算のバッチ実行は単純化され、Osd レイヤーのAPIがシンプルになりました。

統合パッチシェーダ

適応型テセレーションシェーダの構成は劇的に単純化されました。シェーダの数は 以前のパッチ構成の組み合わせ数から、1つあるいは2つに減りました。この大きな改良 により 2.x に比べてロード時間が激減し、描画コストも減ります。

演算カーネルの単純化と同様に、シェーダの単純化により Osd レイヤーはよりシンプルに なりました。s


コードスタイルの更新

OpenSubdiv 3.0 から、識別子のプレフィックスがC++名前空間になりました。

このリリースでの大幅な変更により既存のクライアントコードは互換性がなくなりましたが、 各所でコーディングスタイルの不一致を更新することができました。これにより品質、 一貫性、読みやすさなどが向上していると期待しています。


ドキュメント/チュートリアル

ドキュメントは一新されました。また本リリースより幾つかのチュートリアルが追加 されています。チュートリアルはサンプルプログラムより簡単に API を学ぶことができます。 チュートリアルの次はサンプルプログラムが参考になることかと思います。


Additional Resources

移植ガイド

OpenSubdiv 2.x で書かれた既存のコードを 3.0 に更新する方法は Porting Guide をご覧ください。


サブディビジョン互換性

3.0 リリースはサブディビジョンの仕様に幾つか小変更を行っています。 Subdivision Compatibility をご覧ください。