Days」の2セッションが技術系セッションとして人気を集めていた。HALLでの開催となってしまったとのこと。規模縮小開催ではない......ということなのだが、実際に会場スペースはやや小さく感じる。Direct3D」のような人気セッションは、午前中から立ち見がでるほどで、来場者達は狭さを実感していたのではないだろうか。Performance」の講演をレポートする。プリミティブ)を、プログラマブルに自動的に分割する仕組みのことだ。HD5000シリーズがリリースされた。11対応GPUを近日中に送り出すことを予告したが、2010年3月現在、まだ市場には姿を現わしていない。2009の本連載で3回に渡って念入りに解説しているのでそちらを参照して欲しい。いえ、本稿でも、Cebenoyan氏が解説した程度の簡単なおさらいをしておこうかと思う。SHADER)の3つのユニットから構成されている。11のレンダリングパイプラインを構成する。ハルシェーダはポリゴンの分割を計画を担当し、テッセレータはその計画に従ってポリゴンを分割。ドメインシェーダは分割されたポリゴンに“3Dとして”の意味付けや変移を与えるもので「テッセレーションステージ専用のローカル頂点シェーダ」という見方ができる。「テッセレーションステージの標準化」というテーマには2000年頃からGPUメーカー各社が幾度となく標準化を夢見てトライしたが、そのどれもが夢破れ、そのGPUの独自機能として、DirectXの盲腸機能となり果て散っていった。11のテッセレーションステージは「夢の機能」にも見えてくるわけだが、Cebenoyan氏は「そうではない」と、釘を刺す。テッセレーションステージは便利な機能ではあるが、「タダ」ではなく「有料」であり、使えば使うだけGPUパワーを食いつぶし、もしかすると描画パフォーマンスを下げてしまうかもしれない。「賢く使え」とCebenoyan氏はいう。下表は、1ポリゴン(正確には1パッチ、以下同)あたりのテッセレータに与えたテッセレーション因数(左)と、実際の出力ポリゴン数の関係を表したものだ。テッセレーション因数に1を与えた場合は、テッセレーションステージを稼働させた上で、入力ポリゴンと同じモノが出力されることになり、計算時間が全くの無駄となる。基本的な事項だが、ゲームエンジン側のLOD処理の結果としてテッセレーション因数として1を与えてきた場合は、テッセレーションステージにその3Dモデルの処理は流さないでバイパスさせる最適化処理が不可欠となる。テッセレーション因数="1"は意味がないハルシェーダで不可視ポリゴンを隠面消去してしまう最適化3Dモデルの視線から見て後ろ向きになる隠面側のポリゴンは見えないポリゴン(≒描かれないポリゴン)となるので、これに対してのテッセレーションも無駄だ。隠面側も見える半透明の3Dモデルの場合だとややこしい話になるが、通常の不透明の3Dモデルの場合はハルシェーダにて視線とポリゴンの法線の関係性を見て視線から見えないと判断できるので、不可視ポリゴンとして除去(Cull)することが奨励される。Culling)の概念はテッセレーションステージでも最適化処理の一環として有効であり必須なのだ。ちなみに、ハルシェーダにてテッセレーション因数をゼロとすれば、そのポリゴンはテッセレータでのテッセレーションが行なわれず、さらにはポリゴンとしての実体を失い消滅する。カリングが行なわれることになる。テッセレーションステージ最適化術・応用編~最大描画品質と最大パフォーマンスを両立させるテッセレーションテクニックとは?前段のテクニックはいわば基本編であり、「外から帰ったら手を洗おう」に相当するような言われるまでもないような、当たり前の決まり事だった。Cebenoyan氏は、それらよりももう少し高度な、実際のゲームエンジンへのテッセレーションステージ組み込みに使えるテクニックについても語っている。テッセレーションステージはポリゴンの自動分割を行なうものであり、多ポリゴンに分割すればするほど滑らかな3Dモデルとして表現できるわけだが、その恩恵を1番直接的に受けられる活用といえば、やはりLODシステムをテッセレーションシステムを用いて実現するアプローチとなるだろう。Deatilの略で、一般的には描画する3Dモデルの大きさ(主に視線からの距離)に応じて、描画品質を切り換えていくテクニックのことをいう。距離適応型テッセレーション最も基本的なLOD実現方法と言えば、視点位置からの距離に応じてポリゴンを増減させるアプローチだ。具体的には、視点に近ければ近いほどテッセレーション因数を上げていき、視点から遠ければ遠いほどテッセレーション因数を下げていく仕組みをハルシェーダにて行なう。実際のエンジンでは、各モデルごとにテッセレーション因数の上限(ないしは下限)を設定してそれ以上分割しない制御を入れることになる。Tessellation)は、一見完璧な手法に見えるが、実は場合によってはまだ無駄がある。視点から見て、その3Dモデルを構成するポリゴンのうち、視線と相対するポリゴンは、テクスチャが適用されたり、法線マッピングが行なわれたり、多様なピクセル陰影処理が適用されるために、ポリゴン数が少なかったとしてそれほど目立たない。その視線から見て3Dモデルの輪郭に相当する箇所はポリゴン数が少ないとあからさまにカクカクして見えてしまい不自然さが露呈してしまう。フライトシミュレータや“神の視点”タイプのリアルタイムストラテジーゲーム(RTS)では、地形の稜線を視界に捉えることが多く、地形の稜線がいびつだと不自然さが露呈しやすい。地形の稜線は低ポリゴンにしてしまうと不自然。輪郭はできるだけ多ポリゴンが奨励されるのだそこで、距離適応型テッセレーションだけでなく、そのポリゴンが輪郭付近であるかどうかの判定を加え、輪郭付近であれば、テッセレーション因数を大きめに設定する工夫をハルシェーダに組み入れるのだ。逆に輪郭付近でない、視線に相対する、視線から見て内側になる面のポリゴン群はテッセレーション因数を小さめに設定するといったバイアスも有効となるかもしれない。Tessellation)という最適化となり、前出の距離適応型テッセレーションと組み合わせて活用すると、よりアグレッシブな適応型テッセレーションLODになる。面の向き適応型テッセレーションも有効にした例。輪郭付近に多ポリゴン、3Dモデル内部のポリゴンは低ポリゴンにこれでもまだ完璧ではないと、Cebenoyan氏はいう。この適応型テッセレーションは効き過ぎるとディスプレースメントマッピングと相性が悪くなってしまうというのだ。Mapping)とは、その3Dモデルに付加したい細かい凹凸情報をテクスチャで与え、入力された頂点に対し、その凹凸情報に従って変移(Displace)させるもの。Mapping)は凹凸があるかのように陰影処理を行なうピクセルシェーダによるフェイクだが、ディスプレースメントマッピングは、実際にポリゴンモデルに凹凸情報通りに変移させて変形させるテクノロジーだ。イメージ的には基本形状モデルを、テクスチャに書かれた凹凸情報に沿って粘土細工のように盛ったり削ったりするものだ。11のテッセレーションステージでは、テッセレータで分割後の新生ポリゴンに対して、位置情報を与える際、あらかじめ用意しておいた凹凸情報テクスチャの情報を加味することで実現される。ディスプレースメントマッピングによる「盛る削る」の最小単位は1ポリゴンということであり、あまりにもポリゴン数が少ないと「盛る削る」がおおざっぱとなって、いびつな形状になってしまう。細かいトゲトゲを生やしたいのに、そのトゲトゲの盛り先のポリゴンが1枚しかなければトゲトゲを生やせない。前述の2つの適応型テッセレーションLODで、テッセレーション因数をあまりにも低くしすぎてしまうと、ディスプレースメントマッピングがうまく効果を果たせないことになってしまうのだ。これについては、3Dモデルにディスプレースメントマッピングする凹凸情報テクスチャの内容を吟味してテッセレーション因数を低くし過ぎない工夫が必要になる。Tessellation)の考え方だ。具体的には、ディスプレースメントマッピング用の凹凸情報テクスチャの「凹凸の傾き」を吟味して、その傾き勾配が急なところ(凹凸周波数が高いところ)ではテッセレーション因数を下げない(あるいは上げる)という工夫をする。これをハルシェーダでリアルタイムに計算すると重いので、ランタイムの初期化フェーズなどで、そのディスプレースメントマッピング用の凹凸情報テクスチャに対応するテッセレーション因数マップ的なものを生成する工夫が有効だろうと、Cebenoyan氏はいう。実際のレンダリング時には、ハルシェーダで事前生成したそのテッセレーション因数マップを読み出し、その内容を吟味しつつ、前出の2つの適応型テッセレーション(距離適応型テッセレーションと面の向き適応型テッセレーション)を駆動するというイメージだ。密度適応型テッセレーション・オフ。密度適応型テッセレーション・オン。勾配がきつい部分についてはテッセレーション因数を上げているのがわかるだろうか画面座標適応型テッセレーションこれで完璧かと思いきや、もう1つある。「まだ、研究の余地があり、かなり経験を積み上げないといけなさそうだが、画面の解像度に応じたテッセレーション因数の裁定も必要ではないか」とCebenoyan氏は述べた。1ポリゴンが8ピクセル未満になるようなポリゴン分割は形状表現としてあまり意味がないという経験即をCebenoyan氏は語り、これに基づけばレンダリング解像度(画面解像度)に依存したテッセレーション因数の裁定が有効と言うことになる。ラスタライザでピクセルに分解されるまで、そのポリゴンが占めるピクセル数はカウントできないが、とはいえ分割対象ポリゴンの一辺の長さを画面座標系で計算すれば、一辺の長さがピクセル数で算出できるわけで、これからおよそのピクセル数は推測できる。Tessellation)と呼ぶ。処理系としてはカリングに近い処理系になるので、ハルシェーダ上の適応型テッセレーションシェーダの上段でこの仕組みを組み込むのがいいかもしれない。マルチパスレンダリングとテッセレーションステージテッセレーションステージを繰り返し行なうのは無駄テッセレーションステージの最適化とは少し違うが、テッセレーションをエンジンに組み入れる際に考慮しなければならない重要な点が1つある。それは、「同じテッセレーションを繰り返さない」という工夫だ。影生成には、光源を仮想視点にして、シーン内の3Dモデルに対して様々な特殊レンダリングの実行が必要になる。デプスシャドウ技法ならば、光源からZバッファレンダリングを行なうし、ステンシルシャドウボリューム技法ならば、光源方向から3Dモデルの輪郭頂点を引き延ばして影領域のレンダリングを行なったりする。影生成に限らず、同一モデルを複数回別のバッファにレンダリングする、いわゆるマルチパスレンダリングは今や当たり前に行なわれるわけだが、その際、いちいち対象3Dモデルにテッセレーションステージを適用させていたのでは負荷が高くなりすぎる。そこで、テッセレーションステージはなるべく少ない回数行なうように配慮しなければならない。1つは、1回だけ、そうしたマルチパスレンダリングに配慮したテッセレーションを行なって、これをストリームアウトして保存しておき、マルチパスレンダリング時にはこのテッセレーション済みのモデルを用いて行なうようにする。1つは、テッセレーションを行なう前の低ポリゴンモデルを、そうしたマルチパスレンダリングに回してしまうという“手抜き”のアプローチ。遠方のキャラクタの影生成などについては、こちらの手法が有効に使えることだろう。ピクセルシェーダのタスクをドメインシェーダに委託する?~ハイパー頂点という概念の導入Cebenoyan氏は、最後に、かなりエキセントリックなテッセレーションステージの活用法を示唆した。これは、これまでピクセルシェーダで実装されてきたレンダリングテクニックの一部をドメインシェーダでやらせてしまうというもの。10.xまでのレンダリングパイプラインは、レンダリング単位として頂点とピクセルしかなかったので、頂点解像度の陰影処理で品質的に満足がいかなかったものは、ピクセル解像度の陰影処理で行なうしかなかった。11では、頂点解像度とピクセル解像度の中間解像度の陰影処理ができるというのだ。テッセレーションステージにて、意図的に「ピクセル解像度よりはとても荒いが、しかし充分に多ポリゴン」という状態にポリゴン分割を行なってしまって、これに対しドメインシェーダで頂点単位の陰影処理を行なうようにする。ピクセルシェーダではその結果を補間するだけのシンプルな陰影計算を行なって描画するようにする。することで、用意した3Dモデルの頂点解像度よりは細かく、ピクセル解像度よりは荒い、計算処理をサボったレンダリングが行なえる。いうなれば「ハイパー頂点」という概念でのレンダリングを行なうのだ。そんなレンダリングがどこに使えるか......というと、たとえば影だ。ソフトシャドウなどは1度、フル解像度でレンダリングした影を余計なポストプロセスレンダリングパスを使って低解像度にわざわざぼかす。このハイパー頂点レンダリングの手法を使えば、頂点解像度よりは高解像度だがピクセル解像度よりはぼやっとした影が自ずと描画できる。おおざっぱな静的な影は、頂点属性に影を焼き込むという手法は遙か昔から用いられてきた手法なので、たしかに突飛なアイディアというわけではない。この他、Cebenoyan氏は水面表現の際に水底に生じる火線(CAUSTICS)の表現も、このハイパー頂点レンダリングの手法を使えば負荷とクオリティのバランスがちょうどいいのではないか、とその実装例を紹介した。11の花形機能であるテッセレーションステージについては、その基本機能がどういうモノであるかを紹介するだけで、「どうやって使うのが正しいのか」、「一体なにができるのか」という部分が見えていなかったのだが、今回のCebenoyan氏のセッションでは、この部分が具体的に示され、明確に例示されたことで、テッセレーションステージの活用がより一層現実味を帯びたように見えた。Cebenoyan氏が示したLODの具体的な実装アイディアの数々はゲーム開発者にとって、いい刺激になったのではないだろうか。11を冷ややかに見てきていたゲーム開発者も少なくないのも事実。Cebenoyan氏が示したドメインシェーダを使ったハイパー頂点レンダリングの手法は、既存のレンダリングエンジンにも比較的組み込みやすいはず。テッセレーションステージをレンダリングパフォーマンスの向上に使おうという発想は、これまでになかったものだけに、今後、どのように浸透していくかという点でも興味深い。