UVAtlas の使用 (Direct3D 9)

Note

UVAtlas は、当初は非推奨の D3DX9 ユーティリティ ライブラリに付属していました。 最新バージョンは 、UV Atlas Command-Line Tool (uvatlas.exe) で入手できます。

多くのレンダリングおよびコンテンツ生成手法では、メッシュ上の 2D 信号 (テクスチャなど) の一意の重複しないマップが必要です。 このような手法には、次のものが含まれます。

  • 標準/変位マッピング
  • テクスチャ空間 PRT シミュレーションとライト マップ
  • サーフェスの描画
  • テクスチャ空間照明

一意の UV マッピングを手動で生成することは、多くの場合、時間がかかり面倒です。これは、入力ジオメトリが複雑で、効率的で低歪みのテクスチャ空間使用率が必要な場合に特に当てはまります。 次の図は、メッシュの例とそれに対応するテクスチャ アトラスを示しています。

メッシュの例とそれに対応するテクスチャ アトラスを示します。

次の使用例は、メッシュ (左側) と対応する UV 空間法線マップ (右側) を示しています。 テクスチャ アトラスには、複数のグループまたはデータクラスターが含まれていることに注意してください。各クラスターはグラフと呼ばれ、上記の例では、表示にはメッシュの一部の通常のデータが含まれています。

D3DX UVAtlas API は、最適で重なり合っていないテクスチャ アトラスを自動的に生成します。 API には、次の操作を可能にする入力パラメーターが用意されています。

  • テクスチャのストレッチ、歪み、アンダーサンプリングを最小限に抑えます。
  • メモリを効率的に使用するために、テクスチャ空間のパッキング密度を最大化します。
  • メッシュ全体で偶数サンプリングを提供し、サンプリング周波数の不連続性を最小限に抑えます。

UVAtlas のしくみ

UVAtlas API ( 「UVAtlas Functions」を参照) は、サーフェスをグラフにパーティション分割し、グラフをテクスチャ アトラスにパックすることでテクスチャ アトラスを生成します。 これらの手順を個別に実行するには、 D3DXUVAtlasPartitionD3DXUVAtlasPack を使用します。または 、D3DXUVAtlasCreate を使用して、1 回の呼び出しでパーティション分割、パラメーター化、およびパックを行います。

メッシュのパーティション分割とパラメータ化

まず、メッシュをグラフに分割し、各グラフを独自の [0,1] UV 空間にパラメーター化します。 円柱は 1 つのグラフでパラメーター化できます。一方、次の図に示すように、球には 2 つのグラフが必要です。

2 つのグラフにパーティション分割された球の図

1 つのグラフでパラメーター化できるメッシュは、"ディスクに対するホームモーフィック" として分類されます。つまり、無限に柔軟で無限に伸縮可能なディスクをグラフ上に分散し、ジオメトリを完全にカバーすることができます。 このストレッチは、ホームモーフィズムと呼ばれ、双方向関数です。つまり、情報を失うことなく、一方のパラメーター化から他方のパラメーター化に進むことができます。

実際のメッシュを 2 つの次元にパラメーター化できるのは、メッシュをクラスターまたはグラフに分離しない場合がほとんどありません。 次の図は、メッシュの別の例とその対応するテクスチャ アトラスを示しています。

さまざまな図形とそれに対応するテクスチャ アトラスを含むメッシュの例を示します。

作成されるグラフの数を決定するパラメーターは 2 つあります。

  • atlas に対して許可されるグラフの最大数
  • 各グラフで許可されるストレッチの最大量

ストレッチの量によって、生成されるグラフの数とサンプリングの全体的な品質が決まります。 ストレッチの範囲は、0.0 (ストレッチなし) から 1.0 (ストレッチの任意の量) です。 D3DXUVAtlasCreate と D3DXUVAtlasPartition は、アルゴリズムによって生成される最大ストレッチを返します。 次の図は、メッシュの別の例とその対応するテクスチャ アトラスを示しています。

メッシュの例とその対応するテクスチャ アトラスの図

統合メトリック テンソルを使用してパラメーター化を制御する

テクスチャ空間の優先順位付けは、三角形ごとに指定できます。 統合メトリック テンソルを使用して、結果のテクスチャ空間アトラスで三角形を引き伸ばす方法を制御できます。 IMT は、D3DX IMT 計算関数を使用して、直接指定することも、入力信号に基づいて計算することもできます。 統合メトリック テンソル (または IMT) は対称的な 2 x 2 マトリックスであり、アトラスで三角形がどのように引き伸ばされるかを記述します。 各 IMT は 3 つの float で定義され、それらを呼び出します (a,b,c)。 これらは、次のように対称 2 x 2 マトリックスに配置できます。

a b
b c

次に、IMT を使用して、2 つのベクトル間の距離を見つけることができます。 2 つのベクトル v1 と v2 を指定します。ここで:

vector v1
vector v2 = v1 + (s,t)

v1 と v2 の間の距離は、次のように計算できます。

sqrt((s, t) * M * (s, t)^T)

つまり、ベクトル (s,t) は、u-v 空間の任意の方向のストレッチの大きさになります。 この場合、s ベクトルは 1 番目から 2 番目の頂点への方向であり、t は法線と s の交差積です。 たとえば、次のようになります。

(1,1) * (1,1) = (2,2)
        (1,1)
IMT(1,1,1) scales by 2
(1,-1) * (1,1) = (0,0)
         (1,1)
IMT(2,0,2) scales by 2 with no shearing

IMT は、D3DX IMT 計算関数 D3DXComputeIMTFromPerVertexSignal、D3DXComputeIMTFromPerTexelSignal、D3DXComputeIMTFromSignal、D3DXComputeIMTFromTexture_graphicsを使用して、入力信号に基づいて直接指定または計算できます。

テクスチャ空間を個々の三角形に割り当てる方法を制御する場合は、IMT データを直接指定します。 そうすることで、メッシュの重要な領域 (キャラクターの顔や胸のロゴ、プレイヤーのウォーキング パスの近くのシーンの領域など) に、アトラス内の領域をさらに割り当てます。 ID 行列の倍数である IMT を指定すると、結果の三角形はテクスチャ空間で均一にスケーリングされます。

たとえば、高解像度の法線マップを使用すると、IMT を計算して、法線マップ内の高周波数信号の領域により多くのテクスチャ空間を提供できます。 "フラット" である三角形 (元の法線マップの定数領域にマップされる) は、テクスチャ空間を受け取る量が少なくなります。 法線マップの詳細を含む三角形は、最終的な結果により多くのテクスチャ領域を受け取ります。 その後、法線マップをより小さなテクスチャに再サンプリングし、詳細を維持したり、より最適な UV マッピングを使用して法線マップを再計算したりできます。

ユーザー指定の折り目に隣接データを使用する

ユーザー定義の隣接情報をパーティション分割関数に提供して、メッシュ内の定義済みの折り目を記述し、隣接する面間のグラフ境界を定義できます。 これは、呼び出し元がアルゴリズムへの入力として独自のグラフのパーティション分割を指定するための簡単な方法です。これにより、許可された最大値の下にストレッチを適用するようにグラフをさらに調整します。

この例では、UVAtlas API と DirectX ビューアー (Dxviewer.exe) を使用して、テクスチャ アトラスのサイズに大きな影響を与える可能性があるモデルの不連続性を見つけて修正する方法を示します。 Dxviewer.exeを取得し、DirectX SDK からその詳細を確認できます。 Dxviewer.exeは、2009 年 8 月のバージョン以降に DirectX SDK から削除されたため、少なくとも 2009 年 8 月の DirectX SDK が必要になります。 DirectX SDK の詳細については、「 DirectX SDK はどこにありますか?」を参照してください。

お気に入りのコンテンツ生成ソフトウェアでモデルを使い始めたとします (この例では、Maya で作成された矮小ヘッド モデルを使用します)。 テクスチャ モデルを .x ファイルにエクスポートし、D3DXUVAtlasCreate を使用してテクスチャ アトラスを作成します。 結果のテクスチャ アトラスは、次の図のようになります。

矮小モデルのアトラスの図

Atlas には 22 個のグラフがあり、最大ストレッチは 0.994 です。

次に、テクスチャモデルを見て、テクスチャアトラスがジオメトリにどの程度マップされているかを確認します。 これを行うには、ビューアー ツールにモデルを読み込みます。

  • DirectX ユーティリティからビューアー ツールを開きます。
  • [開く] ボタンをクリックして.x ファイルを読み込みます。
  • [表示] ボタンをクリックし、ポップアップから [折り目] を選択して、折り目表示オプションを有効にします。

次の図は、ビューアー ツールに表示される内容を示しています。

ビューアー ツールでのテクスチャメッシュの図

各行は折り目であり、テクスチャ アトラスの 2 つのグラフ間の隣接するエッジです。 アルゴリズムによって生成されるグラフの数は、通常の不連続性が原因である可能性のあるわずかな違いによって引き起こされます。 これらの小さな違いは、溶接データ、つまりほぼ等しいデータを強制することによって削減できます。 法線とスキンウェイトを溶接するには:

  • メッシュで次のコマンド ラインを使用して DirectX Ops (dxops.exe) ツールを実行します ('modelName.x' をモデルの名前に置き換えます)。
    Dxops.exe -s "load 'modelName.x'; Optimize n:2.01 w:2.01 uv0:0.01;  save 'newModelName.x';"
    

これにより、法線とスキンウェイトが比較され、値が 2.01 未満で異なる場合、データは等しくなります。 次の図は、溶接前の折り目 (左側) と溶接後の折り目 (右側) を確認するための目のクローズアップを示しています。

溶接前の折り目のイラスト 溶接後の折り目のイラスト

図 7: 溶接による折り目の除去

この例では、溶接によって入力メッシュから 86 個の頂点が削除されました。 次の図に示すように、メッシュ内の折り目が少ないほど、アトラスを再生成できます。

折り目が削除された新しいアトラスの図

atlas には 7 つのグラフしか含まず、最大ストレッチは約 0.0776 です。 新しいアトラスは、小さなテクスチャに収まるようになりました (この例では約 30% 小さくなります)。

Atlas へのグラフのパッキング

メッシュを個別にパラメーター化されたグラフに分割したら、グラフを 1 つのテクスチャ マップに効率的にパックする必要があります。 これは、D3DXUVAtlasCreate の 2 番目の手順として実行されるか、D3DXUVAtlasPack を呼び出すことによって明示的に呼び出すことができます。

パックされたグラフは、ユーザー指定の余白の幅で区切ります。 余白の幅はグラフ間の分離量であり、グラフの境界でのアーティファクトのレンダリングを回避するために、二次補間とミップ マッピングを可能にします。 D3DX には、これらの余白を自動的に入力するためのインターフェイスが用意されています。詳細については、「 ID3DXTextureGutterHelper 」を参照してください。

UVAtlas をパイプラインに統合する

テクスチャ描画の前にアーティストが呼び出すだけでなく、これらの関数を自動化されたアート パイプラインに統合することもできます。 たとえば、PRT シミュレーションまたは通常のマッピング パスを実行する前に、アセットの更新後に UVAtlas 呼び出しを自動的に発行できます。 これにより、メッシュのトポロジが変更されている場合に、オブジェクトの UV マッピングを手動で修復する必要がなくなります。

UVAtlas 関数の使用例については、 UV Atlas Command-Line ツール (uvatlas.exe) を参照してください。

高度なトピック