セットアップエンジンの拡大図のところを今一度見て欲しい。右上のところの黄色いマスに「プログラマブル・テッセレータ」(Programmable Tessellator)というユニットがあるのが分かるだろうか。

セットアップエンジンの頂点アセンブラの補助ユニットとして配されるプログラマブル・テッセレータ

テッセレータとは、一言でいうならば、ポリゴンを分割するユニットのことだ。ポリゴン分割はすなわち頂点の増加だから「ジオメトリシェーダとどこが違うのか?」という疑問を持つ人もいるだろう。

テッセレータは、ジオメトリシェーダとは全く別物であり、ポリゴン分割に特化した専用ユニットと考えてもらって差し支えない。

ポリゴン分割を行うことを「テッセレーション」(Tessellation)というが、これまでにこのテッセレーションメソッドには様々なものが考案されている。

もっとも基本的なのが、ポリゴンを構成する頂点の法線ベクトルを補間するようにして新たな法線ベクトルと頂点を生成していく「N-PATCH法」だ。かつてAMDがRadeon 9700~X850時代に実装させていたポリゴン補間機能の「TRUFORM」技術はまさしくN-PATCH法を実装したものだった。

Radeon 9700~X850時代に実装されていたポリゴン補間機能「TRUFORM」はN-PATCH法によるポリゴン分割。実際のところ、日の目を見なかった不幸な機能だった

3Dグラフィックス制作ソフトウェア等では、3Dモデルを構成するなだらかな曲面を「ベジェ」「Bスプライン」などの高次多項式の基底関数を用いて表現することがある。曲面をそうした関数に従って生成し、ポリゴンとして分割生成する方法もある。

実は、Radeon HD 2000シリーズのテッセレータは、もっと基本的なもので、分割倍率因子を与えてポリゴンを分割するが、ただ分割するだけで、前述のような高度な補間法や関数による分割は行われないようだ。希望する分割メソッドに沿った分割を行うためには、分割によって生成された新しい頂点座標を頂点シェーダ側の後処理で変位させる必要がある。テクスチャ座標(u,v)も分割によって新たに生成されるが、場合によってはこちらの変位も必要になる。

テッセレーションモード

分割倍率因子は最大15.0倍までが与えられるとしている。分割モードは、整数倍率で分割する離散型(Discrete)、浮動小数点倍率で分割する連続型(Continuous)、ポリゴンの各稜線に対して異なる浮動小数点倍率で分割する適応型(Adaptive)の全てのテッセレーション・モード(分割モード)に対応する。Radeon HD 2000シリーズではテッセレーションユニット自体は1基のみだが、前述したように単純作業のユニットなので非常に高速であり、ここが頂点スループットのボトルネックになることはまずないとAMDは強調している。

(左)粗い3Dモデルを用意。(中)これをテッセレータでポリゴンを分割。(右)ディテールを表現したハイトマップテクスチャからディテールをディスプレースメントマッピングで生成

主な活用方法だが、この仕様だと曲面再現をするためのテッセレータとしては扱いが難しい。おそらくそれよりは、適当な分割数で分割したあと、頂点シェーダからハイトマップなどのテクスチャを参照してポリゴンを変位させる、いわゆる「ディスプレースメントマッピング」(Displacement Mapping)を行うような活用が主流となるはずだ。視点からの距離に応じてポリゴン分割数を制御してディスプレースメントマッピングを行えば、これまでCPUで行ってきたような3DグラフィックスエンジンにおけるLOD(Leve of Detail:視点からの距離に応じて処理品質を上下すること)処理をGPUで実現できるようになる。

図はRadeon HD 2000シリーズのテッセレータが、レンダリングパイプラインにおいてどういう位置づけになっているかを表したものだ。レンダリングパイプラインの流れとして見ると、外注下請けユニットのような扱いで、頂点シェーダやジオメトリシェーダの流れにの前段階に置かれているのが特徴だ。

レンダリングパイプラインにおけるテッセレータの位置付け

つまり、レンダリングパイプラインをRadeon HD 2000用に設計し直すことなく、最低限のテッセレータ制御用の拡張APIの活用と頂点シェーダプログラムの追加コード(こちらはそれなりの長さになるとは思うが)だけで、テッセレータの恩恵を得ることができるというわけだ。