Text & Photo by トライゼット西川善司

 GPU関連のインタビューといえば,相手がハードウェアサイドのエンジニアであることが多かったが,今回は趣向を変えて,ソフトウェアサイドのエンジニアのインタビューをお届けしよう。
 お相手は,"ATI 3D Application Research Group"のJason Mitchell氏
 Jason Mitchell氏といえば,リアルタイム3Dグラフィックス界ではかなりの有名人で,現在はマイクロソフトに勤務し,またプログラマブルシェーダの仕様策定にも関与している重要人物である。氏は「SIGGRAPH」で数々の論文を発表しており,ATI RADEONシリーズ用のデモ制作にも関わっているほど。ご存知Futuremarkの3Dベンチマークソフト「3DMark03」に収録されている木製"象"像のテストは,彼のシェーダコードを参考にしている(この像には,PixelShader2.0による手続き型テクスチャの生成シェーダ貼り付け処理が施されている)。
 3Dグラフィックス関連のコンベンションではいつも引っ張りダコの氏だが,今回のGDCではインタビューに成功。早速,その模様をお届けしよう。

"ATI 3D Application Research Group"の
Jason Mitchell氏

ページ 1/2

■NVIDIAは,GeForce FXでピクセルシェーダ1.4をサポートしない!?

3DMark03より。3DMark03を批判したNVIDIAは,自社製品の性能指標に3DMark03のグラフを載せるのを止めた
西川善司(以下,善):
 3DMark03に対してNVIDIAが批判声明を出したのはご存知ですよね。私もあの論争に関して取材をしている一人です。そして取材中,こちらの質問に対してNVIDIAから「我々は確実にピクセルシェーダ1.4(*1)をサポートしない」という返答を得ましたが,確かピクセルシェーダ2.0は1.4のスーパーセットですよね?

Jason Mitchell氏(以下,JM):
 それは奇妙な話ですね。確かにあなたのいうように,ピクセルシェーダ2.0は1.4のスーパーセットです。
善:
 開発者が長いシェーダを書きたくなければ,1.4や1.3を選択できるわけですね?

JM:
 その通りです。マイクロソフトもそうした利用方法を前提に,バージョン番号の割り振りを行っていると思います。だから開発者は,自分が開発したいシェーダプログラムに適したシェーダバージョンを決定できるはずなんです。
善:
 なるほど。しかし,この件ついては取材を続ける必要がありそうですね。

   (*1)ATI RADEON 8500は,DirectX 8.0のピクセルシェーダ仕様の拡張命令セットを備えていた。これはのちに,ピクセルシェーダ1.4としてDirectX 8.1にインプリメントされることに


■ピクセルシェーダで頂点処理を行う?

善:
 GDCの初日のセッションで,マイクロソフトはプログラマブルシェーダ3.0の仕様を明らかにしました(forGamer内の記事は「こちら」)。仕様には,ついに頂点シェーダがテクスチャへアクセス可能になるとありました。これはつまり,プログラマブルシェーダ3.0世代のGPUは,テッセレータ(*2)が必要になることを意味していますか?

JM:
 それはないと思います。頂点シェーダ3.0とテッセレータは分離されているはずです。頂点シェーダ3.0仕様は「テクスチャメモリへのアクセスの仕組みを提供する」ということです。
善:
 ただテクスチャメモリにアクセスできるだけだ,と?

JM:
 もちろんGPUにテッセレータがあれば,"テッセレーション"や"ディスプレースメントマッピング"(*3)をそつなくこなせるでしょう。
善:
 では,「頂点シェーダがテクスチャメモリにアクセスできる」というフィーチャーは,どういった活用方法が考えられますか?

JM:
 ゲーム開発者からは「現行仕様では定数領域が小さい」と,よく指摘されます。
 ゲーム開発者は,ボーンスキニング(*4)を行うとき,たくさんのボーンを使いたがります。それぞれのボーンは行列で表現して定数領域に格納しますが,ボーンがあまりに増えると,この定数領域から溢れてしまうのです。
善:
 そうした問題に遭遇したとき,現在のGPUベースではどのように回避するのですか?

JM:
 その場合は,キャラクターを分解してグループごとにスキニング処理を行います。ただこの方法は非常に複雑ですし,管理が面倒です。
 テクスチャメモリに頂点シェーダがアクセスできるようになると,そうしたボーン情報はテクスチャメモリに入れておけます。そうすればボーンをグループに分解することなく,丸ごと処理できるわけです。
善:
 ディスプレースメントマッピングについてはどうなんでしょう? 今回のGDCでは,ATIの技術者がディスプレースメントマッピングの素晴らしさを布教する(?)セッションを開いていましたが,現行のGPUがこの技術をサポートしていない以上,安直には手が出せないと思いますが……。

JM:
 そうですね。このあたりはGPUだけでなくCPUの場合も同じことがいえます。我々ハードウェアベンダーは,使いやすく優れたものを新機能として紹介し,それを使ってもらえるように布教する必要があるわけで……(笑)

「同じ基本モデルに対して頂点テクスチャを貼り付け,形状をジオメトリレベルで変形させる」というディスプレースメントマッピング。確かに画期的なのだが……


■テッセレータはDirectX 9世代GPUに必要か?

善:
 適応型テッセレータ(Adaptive Tessellator)というのは,RADEON 9700(以下,R9700)系特有の機能なんですか?

JM:
 え? いや,R9700系に適応型テッセレータはありませんよ(笑)
 TRUFROM2.0は連続型テッセレータ(Continuous Tessellator)です。テッセレータには,離散型テッセレータ(Discrete Tessellator),連続型テッセレータ,適応型テッセレータの三つの定義があるのをご存じですか?
善:
 混同していました(笑)

JM:
 用語の定義は難しいですからね。
 離散型は,離散した分割メソッドでテッセレーションを行うテッセレータです。RADEON 8500(以下,R8500)のテッセレータの「N-PATCH」はこれに相当します。
 また連続型はR9700系でサポートされるもので,分割する精度を分数や小数で与えられます。
善:
 テッセレータはディスプレースメントマッピングだけでなく,将来的には動的LOD(*5)までをサポートできると考えているのですが,どう思われますか。

JM:
 私もその通りだと考えています。そのほか,高次サーフェースのサポートも対象となるでしょうね。
DirectX 9世代GPUの処理系のブロックダイアグラム。テッセレータがなくてもDirectX 9世代GPUを名乗ることができる
善:
 我々が分からないのは,テッセレータの位置付けです。DirectX 9世代のGPUでは,図のような構成だと説明されました。これは"テッセレータが必要である"と理解したのですが,NVIDIA GeForce FXなどはテッセレータを持っていませんよね。

JM:
 実際には,DirectXフィーチャーの多くがオプション設定なんです。DirectXで紹介される機能の多くはGPUで処理されるべきことなのですが,例えば,高次サーフェースのサポートなどはオプションになっています。
 ゲーム開発者は,動作対象となるGPUがどの機能をサポートしているかを吟味する必要があります。
善:
 テッセレータは必要ないのですか?

JM:
 将来的には,テッセレーションが統合され,頂点シェーダの前後でテッセレーションが行えるような仕組みが提供されるかもしれません。
 頂点シェーダとピクセルシェーダがテクスチャを共有できれば「先にピクセルシェーダで頂点処理を行って,これをテッセレータに戻す」なんてこともできるでしょうね。
 現行のR9700/RADEON 9800(以下,R9800)は,ピクセルシェーダ実数演算精度が24ビットなので,頂点シェーダの演算精度と精度的に釣り合っていません。キャラクターのローカル座標系の処理には問題ないと思いますが,地形などのグローバル座標系全体に広がるものの処理には問題が出るかもしれないですね。
善:
 「ピクセルシェーダが頂点処理をする」のはイメージしづらいのですが,どういうことですか?

JM:
 通常,頂点シェーダは演算結果をメモリに書き出します。その出力を基に,トライアングルセットアップ部(ラスタライズエンジン)は,画面上のどのピクセルになるかを決定するのです。つまり"頂点がピクセルを生む"と考えていいでしょう。
 ピクセルシェーダは,メモリからデータを読み込んで演算し,出力を各色チャネルに書き出します。頂点シェーダとピクセルシェーダの演算精度が32ビット精度で同じになると「ピクセルシェーダが頂点バッファからデータを取り出して処理する」ということも可能になるわけです。
善:
 つまり「ピクセルシェーダが頂点バッファから頂点データを取り出して演算し,再び頂点バッファに書き戻す」ということですか。

JM:
 そうです。つまりピクセルシェーダは「演算結果を任意のバッファに書き出す頂点シェーダ」として活用できるのです。
 低ポリゴンで表現されたモデルの頂点バッファを取得して,ピクセルシェーダでボーンスキニングし,これを別のバッファに出力します。このバッファを頂点シェーダで取得して,テッセレーションしたり再び頂点演算したり……といったことが可能になります。
善:
 そういう"技"は,具体的にどんなことに応用できるんでしょうか。
このデモのキャラクターポリゴンは,視点からの距離に応じて変化するLODを採用しているが,頂点増減は,頂点シェーダアシストのCPUテッセレーションで実現している


JM:
 例えば,布の動きの再現(いわゆる「Clothシミュレーション」)ですね。あとは水面の動きのシミュレーションも,これでできると思います。こうした例は,RADEONの演算精度のピクセルシェーダで,問題なく実現できると思います。
善:
 そういったデモをお作りにならないんですか?(笑)

JM:
 作りますよ。いつかは言えませんが(笑)。現在こうしたテクノロジの利用は「SIGGRAPH」の論文にもいくつか出ていますね。気体のシミュレーションとか,流体学のシミュレーションとか。
善:
 "頂点シェーダ処理のあとにテッセレーション"というのは,具体的にどんな応用が考えられますか?

JM:
 例えば,頂点数の少ない低ポリゴンメッシュ(*6)でキャラクターを構成して,これを基にボーンスキニング処理して動作。そのあとテッセレータでディスプレースメントマッピングする……なんてことが考えられますね。


   (*2)ポリゴンを分割するユニットをテッセレータといい,ポリゴン分割処理をテッセレーションという
   (*3)ポリゴンに凹凸を貼り付ける処理。バンプマッピングは"凹凸があるように"陰影処理を行うだけのフェイクだが,ディスプレースメントマッピングは立体そのものを生成して頂点生成するので,ポリゴン分割の処理系が欠かせない
   (*4)3Dキャラクターの動作時,伸び縮みする外皮が破綻しないように頂点をブレンド(頂点ブレンディング)して自然に補完(スキニング)する仕組み
   (*5)Level of Detailの略。視点からの距離に応じて3Dモデルのポリゴン数を増減し,描画負荷を軽減する技術。3Dゲームエンジンには必要不可欠な技術で,現在はCPUが処理している
   (*6)3Dキャラクターモデルのこと。3Dキャラクターのポリゴン片が丁度"編み目"のように見えることから,このように呼ばれるようになった

ページ 1/2