ジオメトリシェーダを活用した新表現(5)~ディスプレースメントマッピング
テッセレーションは、端的に言えば頂点の増加、すなわちポリゴンを増やすことに相当する。ということであれば、「ジオメトリシェーダが使えるのではないか」ということになってくる。
ATIは、Radeon HD 2000/3000シリーズにテッセレータ・ハードウェアがあるにもかかわらず、このテッセレータの仕組みをジオメトリシェーダで実装する例を示した。
ATIの実装例では、3Dモデルのアニメーションやスキニング処理は通常通り頂点シェーダで行ってしまい、一通り、座標変換を終えた頂点データをジオメトリシェーダへと流し、ここでテッセレーションを行う。
ATIの実装例でテッセレーションは指定した1~9のテッセレーションレベル(分割レベル)で可変に行える仕組みとなっていた。
分割レベルを2と設定したときは、元の三角形の辺を2分割するようなポリゴン分割が行われる。3ならば辺が3分割、4ならば4分割だ。この実装では分割レベルは整数しか与えることしかできない。なお、こうした分割レベルを整数で与えるテッセレータの仕組みを「離散型テッセレーション」(Discrete Tessellation)という。そして浮動小数点で与えられる仕組みは「連続型テッセレーション」(Continuous Tessellation)と呼び、さらに三角形の辺ごとに異なる分割レベルが設定できる仕組みは「適応型テッセレーション」(Adaptive Tessellation)と呼ぶ。
漠然と「分割する」といっても、ジオメトリシェーダで「どうポリゴンを生成していいか」がイメージしづらいかもしれない。
ATIの実装では、プログラム・ループで回すのに都合のよい、シンプルかつユニークな分割方法を実装している。
まず、分割レベルがいくつであっても最初の三角形は最小サイズで1個生成し、続いて、3個互い違いに整然と並べて生成し、続いて5個、7個……と奇数個で同じように互い違いに整然と並べていく。これでジオメトリシェーダで三角形の一辺を分割レベルの値で分割した形での三角形が生成できることになる。(続く)
(トライゼット西川善司)