GPUPPURでのラスタライズ

 今回はGPUPPURでラスタライズ法をどのように行うかについて説明します。

 おおまかに説明すると、最初にPPUを使って可視判定を行い、視点から見える図形のみをGPUで通常の方法でレンダリングします。

 まず最初に、PPUへ描画したい図形を送って、レイを送って、PPUで交差判定を行い、その結果をCPUが受け取る・・・という最初の部分はレイトレーシングを行うときと同じです。ただ、交差判定処理の結果には図形のID(図形を識別するためのユニークな番号)さえあればいいのです。レイキャストした結果には視点から見える図形のIDのみが含まれています。

 後は結果データにあったIDに対応する図形をレンダリングします。OpenGLならglBegin()〜glEnd()等を使って、DirectXならIDirect3DDevice9::DrawPrimitive等を使ってレンダリングします。


 図形の数が多いとGPUへ図形をレンダリングする命令を送る処理がボトルネックとなることがあります。大抵の場合、視界に入っている図形は空間に存在している図形より少ない事が多いのです。そこで、各図形が視界に入っているかを調べ、実際にカメラから見える図形のレンダリング命令のみをGPUへ送り、見えない図形を処理する無駄を無くす工夫がされています。例えば、物体の境界箱をつくりそれが視界に入るかを調べたり、4,8分木を使ってHeightMapを分割して効率良く可視判定したりなどがあります。これらの技法はモデルの形や配置などの特徴を生かして最適化されているため、条件によっては使えなくなったり効率が悪くなったりすることもあります。また、これらの処理はCPUで行うため、図形の量が多いとCPUに負担がかかり他の処理ができなくなることがあるかもしれません。
 GPUPPURでのPPUでの可視判定処理は、ほとんどPPUで行うのでCPUにあまり負担が掛からないだろうと思います。また、全ての図形がカメラから見えている場合を除けば、大抵の条件の下で効率よく可視判定ができそうです。また、開発者は可視判定の処理を書く手間を省くことができます。(ppuを搭載しているPCを想定していればの話ですが)