2007年1月、Windows Vistaの登場と共にDirectX 10がリリースされ、同時にプログラマブルシェーダ仕様(SM:Shader Model)は4.0へとバージョンアップがなされた。このSM4.0で最大のトピックといえるのが「ジオメトリシェーダ(Geometry Shader)」の新設だ。これは、これまでGPU内部では行えなかった頂点を増減を可能にする画期的な仕組みだ。

まだ誕生して間もない機能であるため、その応用方法は現在も各開発シーンにおいて未だ研究が進行しているという状況だが、徐々にユニークな使い方も登場しつつある。

ここではジオメトリシェーダの代表的な活用の仕方をいくつか紹介する。

ジオメトリシェーダとは?

本連載序盤の方でも触れたように、ジオメトリシェーダはDirectX 10/SM4.0環境でないと使えない。DirectX 10はWindows Vistaに専用供給されるので、すなわち、ジオメトリシェーダはWindows Vista環境下でないと利用できないことになる。

ジオメトリシェーダの仕事は、プログラムに従って頂点を増減することだ。正確にいうと線分、ポリゴン(三角形)やパーティクルのような「プリミティブ」を増減できる。ちなみに、余談になるが、ジオメトリシェーダはDirectX 10開発当初「プリミティブシェーダ」(Primitive Shader)と呼ばれることも多かった。

ジオメトリシェーダの概念

さて、このジオメトリシェーダを使って一体なにができるのか。

現在までに登場している様々なジオメトリシェーダの活用を、カテゴライズすると二種類に分類できる。

1つは「ジオメトリシェーダのアクセラレーション的活用」、そしてもう一つは「ジオメトリシェーダを活用した新表現」だ。

前者は結果の表現こそ変わらないが、ジオメトリシェーダによって描画パフォーマンスが大きく加速するような活用だ。

後者は、これまででは実現が難しかった表現が、ジオメトリシェーダを活用することで容易に実現可能になる……といったものになる。

現在は、前述したように登場して間もないこともあり、いうなればジオメトリシェーダ黎明期ともいえる時期であるため、どちらかといえば前者のアクセラレーション的活用が多いようだ。

まずは、この「ジオメトリシェーダのアクセラレーション的活用」の方から見ていくことにしよう。

ジオメトリシェーダのアクセラレーション的活用・その1~ステンシルシャドウボリューム技法の影生成を加速する

本連載、前回までの「影の生成」のところで触れた、「ステンシルシャドウボリューム」技法による影生成では、光源から見て輪郭となる頂点を、光源ベクトル方向へ引き伸ばしてシャドウボリューム(影領域)を生成することから始まる。

SM3.0世代までの頂点シェーダとピクセルシェーダしか持たないGPUでは、この影領域生成用の……つまりは引き伸ばし用の頂点を影を生成させる3Dモデル側に仕込んでおく必要があった。この方法では、影生成に全く無関係であっても影領域引き伸ばし用の頂点計算に頂点シェーダがかり出されてしまうため、頂点負荷が高い。これを頂点負荷を軽減するために影引き伸ばし専用の、非表示の低ポリゴンモデルを用意し、これに対してシャドウボリューム生成を行うテクニックもある。しかし、この最適化では影の生成元が低ポリゴンであるため、カクカクとした影ができやすくなるという弱点がある。

根本的な問題を解決するためには、動的に光源方向から見て輪郭か否かを判断して、もしそうであればここで影領域引き伸ばし用の頂点を動的に生成すればいい。

ジオメトリシェーダを使えば、この処理が実現できる。これまで面倒だった、3Dモデルへの「引き伸ばし用頂点の仕込み」が不要となり、さらには影領域に関係のない余計な頂点処理からも解放され、開発作業効率にも、データレベル的にも、パフォーマンス的にもアクセラレーションが実現される。(続く)

シャドウボリュームを可視化した例。光源に対して輪郭となる頂点を、動的にジオメトリシェーダで複製し、これを引き伸ばす処理を行うように処理を改善

(トライゼット西川善司)