アトラステクスチャベースのポリゴンのボクセル化の説明

概要

  • この記事では, ポリゴンモデルをボクセル化する際にアトラステクスチャを使って行う方法である "Voxel-Based Global Illumination" のボクセル化の部分について説明します.

そもそも何故, ポリゴンをボクセル化するのか ?

  • グローバルイルミネーション(間接光)をレイを使って計算はする際には, ある点からレイを飛ばし, それがシーン中のどの点にぶつかったかどうか? の計算を何度も行う必要があります.
  • そして, 現在の GPU でモデルを描画する際には基本的にポリゴンから構成されるモデルを描画します.
  • しかし, ポリゴンで構成されたシーンに対して, レイを飛ばすことを繰り返す処理は重いので, 現状のリアルタイム向けのアプリケーションには不向きです.
  • そこで, シーンのポリゴンモデルを, 右下図のように小さい立方体である集合として近似します. これをボクセル化と言います.


  • そして, ボクセルで表したシーンの形状に対して, GPUレイトレーシングして間接光の計算の処理を高速化します.
  • 上図の左は一旦, ボクセル化したシーンから間接光を計算した結果です. 床や壁などに他の物体の色味がつくカラーブリーディングが起きています.

スクリーンスペースの GI 計算の弱点

  • 一方でボクセル化などは行わずに, カメラ視点のデプスバッファやマテリアルバッファだけを利用して, ディフューズの間接光を計算する SSDO や, スペキュラのリフレクタンスを計算する ローカルリフレクションという方法があります.
  • しかし, これらの手法の弱点は画面上に映っている物体の情報(スクリーンスペース)しか使わないため, 見た目が不自然になったり, 間接光のクオリティが低くなる問題が起きます.
  • 例えば, 下図の左側がスクリーンスペースでディフューズの間接光を計算する SSDO の結果で, 右側がボクセルベースの間接光の計算結果です.
  • このシーンでは実は中央の柱の裏の見えない位置に, 緑や赤の物体が置いてあります.

  • 右側のボクセルベースの間接光の結果はこの視点で石膏像の顔に対して緑や赤のカラーブリーディングが起きています.
  • 一方で, 左側のSSDO の場合, 柱の裏の緑や赤の物体が画面中に映った時に急に石膏像の顔に対して緑や赤のカラーブリーディングが発生してしまいます.

本題 : アトラステクスチャベースのポリゴンのボクセル化

  • それでは本題のアトラステクスチャベースのポリゴンのボクセル化の方法について簡単に説明します.
  • まず, この手法のボクセル化はポリゴン表面をボクセルに変換するものです. (つまり, 中身が詰まったボクセルを作るものではないです. )
  • 下図がこの手法の概要を図で表したものです. 大雑把に言うと, ワールド座標をアトラステクスチャに書き込んだ結果を使ってボクセル化しているイメージです.

  • 手法の手順について説明したのが下のものになります.
    • 1. 「アトラステクスチャ用の UV の準備」 :ポリゴンモデルをアトラステクスチャに展開するための UV を事前に作っておきます.
    • 2. 「アトラステクスチャへのワールド座標の描画」 :ポリゴンモデルを描画して, そのワールド座標を事前に用意した UV を元にアトラステクスチャに書き込みます. このアトラステクスチャの解像度はボクセルの解像度と関連していて, "アトラステクスチャの 1テクセル" = "1ボクセル" です. また, このときに書き込んだアトラステクスチャにはフラグを立てておきます.
    • 3. 「ボクセルの取得」 : アトラステクスチャのうち, フラグが立っているテクセルの個数分だけ点を描画します. 点を描画する時には頂点シェーダで, アトラステクスチャをフェッチしてその点のワールド座標を取得します. この点は 1 個のボクセルに相当します.
    • 4. 「ボクセル空間へのボクセルの挿入」 : 3. の手順で取得した 1 個のボクセルを, シーン全体のボクセルデータを格納してるボクセルデータへと書き込みます. ボクセルをシーンのボクセルデータに挿入する際には, シェーダでワールド座標をボクセル空間の座標へと変換する処理を行います.

アトラスベースのボクセル化の利点

  • ボクセル空間のランダム書き込みが不要であることです. (代わりにボクセル空間の書き込み時には描画する点の位置を頂点シェーダでずらして書き込みます. )
  • アトラステクスチャに描画するので, 小さいポリゴンが集まった結果としてボクセルになることがあり, よりきれいにボクセル化できます.
  • シーンのポリゴンの描画の回数は 1 回で済みます. 下図の右側が本手法の結果です. (一方でポリゴンを軸方向に射影するボクセル化の場合, 1 方向だけだと下図の左側のようにボクセル化の方向と平行なポリゴンのボクセル化の結果が汚くなります. 下図の真ん中が 3 つの軸方向を使ったボクセル化の結果ですが, この場合シーンのポリゴンの描画回数は 3 回になります. )


アトラスベースのボクセル化の欠点

  • 事前にアトラステクスチャ用の UV の仕込が必要なことです.
  • アトラステクスチャへの書き込みのパスと, ボクセル空間への書き込みのパスの 2 パスから構成されることです.

参考文献