Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
フォトンマッピング 
GPU実装最新手法 
平成26年9月 
kgussan
GPU実装~リアルタイムGI 
昨年度の合宿で、様々なレイトレのわかりやすい資料が発表されたと思います。 
今回次に話題になりそうなGPU実装の論文について一つご紹介したいと思います。 
紹介するのはリアルタイム向けのアルゴリズムとして述べられ...
レイトレーシングとラスタライズアルゴリズムの比較 
レイトレーシングVSラスタライズ(グラフィックス専用演算器群) 
代表的なグラフィックスアルゴリズム比較 
リアルタイムに動かすために様々な工夫、近似を使っている。 
レイトレーシングラスタラ...
リアルタイムレイトレーシング 
真面目に計算理する方法でも,実用的なリアルタイム処理が現実に近くなっています。 
下記手法があれば解決? 
・Matt svobodaさんのリアルタイムレイトレデモ 
http://www.youtube.com...
反射・屈折のみならず、環境項、多数回の拡散反射、コースティクスを扱うためにはレイトレだ 
けでは表現が難しいです。前頁のものだけでは不足です。フォトンマッピングなど、表現に適し 
た手法があります。 
レイトレーシングのGPU実装の話題は多々あ...
論文の概要 
フォトンマッピングの実装を取り上げてみます。 
計算には、フォトンのトレーシング計算に加えて、フォトン収集パスが必要になります。 
フォトン収集には大量のフォトンをサンプリングする必要があります。 
レイトレーシングはすでに様々な...
実装手法 
ここでは実装の可能性を思いつく手法を4つほど試してみました。 
3D Bounds / 2.5D Bounds / HashGrid / Tiled
それぞれの手法の分類を詳しく見てみる。
それぞれの手法の分類を詳しく見てみる。 
メインのループをフォトンあたりにするか、 
ピクセルあたりにするか 
射影するジオメトリを 
どう処理するか 
どの空間で処理するか。 
処理するシェーダステージ 
サンプリングを全部やるか、 
離散的...
1)3D Bounds手法 
グラフィックスパイプラインのラスタライザを使って、インスタンシング等でフォトンを描画。 
フォトンの寄与範囲を20面体で表現し、干渉するオブジェクトに色を付ける。 
ラスタライザを使うことで高速に演算が可能になる。...
2)2.5D Bounds手法 
スクリーンスペースでZバッファを使い、フォトン 
を小さな球に外接するコーンとして計算。 
コーン形状はフォトン座標からGeometry Shader 
で生成する。 
スクリーンスペースで計算することから、3...
3)HashGrid Cells 
セル上にフォトンを分配し、スクリーンのピクセル座標を3D 
空間に投影し、その座標に近いフォトンを3D空間上で探 
索・収集する。 
セル内にhash6432shiftアルゴリズムでコードテーブルを作 
成し...
4)タイルベース手法 
スクリーンスペースでタイル状にピクセルを区切 
り、そのタイルごとにフラスタムを生成。フラスタ 
ムにのりしろを付けてフォトンを分配する。 
Intel のtile based renderingのような手法。ここ 
で...
サンプル手法 
真面目に周辺フォトンを探った結果と、周辺フォトンを離散的に(たとえば1飛ばしで1000フォトン中、500フォトンしか 
サンプルしない。) 
バイラテラルフィルタを使ってノイズを減らした画像をみると、差はほとんどなくすことができ...
実行結果 
リッチなフルのBRDF 
リアルタイム向けの 
ランバートのみBRDF 
2)“2.5Dバウンド”と4)”タイルド”アルゴリズムの結果が良好。 
今回はフルのBRDFではなく、リアルタイム向けにランバートのみの状態で 
良好な、タイ...
タイルベースアルゴリズムフロー 
1. フォトン投射 
a. 普通にフォトンを光源から投射してトレーシング 
2. 代表深度生成 
a. 次に生成するフラスタムの深度を計算。分割されたタイル内のもっとも手前 
をnearに、もっとも奥をfar ...
まとめ 
アルゴリズムをCPUからGPUに移動して高速にすることができる。 
この際、データ構造によって性能が大きく異なる。 
性能変化の傾向がCPUとGPUでは違う。 
現状GPUで、数百Kのフォトンをリアルタイムにサンプルして放射輝度を計算...
参考
参考:GPU実装Tips 
GPUのパイプラインは長い。流れが止まると後段 
は滞留する。 
→ 流れを止めない。ボトルネックになっている箇 
所を意識。 
ボトルネック解析ができたら当該箇所の負荷を緩 
和する。 
GPUの構成に依存して強い...
参考文献 
・フォトンマッピング入門林秀一さん 
http://www.slideshare.net/ssuser2848d3/ss-25795852 
・リアルタイムCGとフォトンマッピングのハイブリッドレンダリング 
http://game...
フォトン主軸アルゴリズム疑似コード 
(散布系) 
for (uint32_t p=0; p<photon_num; p++ ){ //フォトンループ 
photon[ p ].draw(); // グラフィックスパイプでメモリにフォトン位置を...
ピクセル主軸アルゴリズム疑似コード 
(収集系) 
for(uint32_t y=0; y<height; y++){ //スクリーン座標ループ 
for(uint32_t x=0; x<width; x++){ //pixel shader,...
Gpuフォトンマッピング手法 h26-09-kgussan-第2回レイトレ合宿
Gpuフォトンマッピング手法 h26-09-kgussan-第2回レイトレ合宿
Gpuフォトンマッピング手法 h26-09-kgussan-第2回レイトレ合宿
Gpuフォトンマッピング手法 h26-09-kgussan-第2回レイトレ合宿
Upcoming SlideShare
Loading in …5
×

Gpuフォトンマッピング手法 h26-09-kgussan-第2回レイトレ合宿

6,311 views

Published on

第2回レイトレーシング合宿で発表した資料です。
リアルタイムGPUフォトンマッピングについての論文の説明です。

Published in: Engineering
  • Be the first to comment

Gpuフォトンマッピング手法 h26-09-kgussan-第2回レイトレ合宿

  1. 1. フォトンマッピング GPU実装最新手法 平成26年9月 kgussan
  2. 2. GPU実装~リアルタイムGI 昨年度の合宿で、様々なレイトレのわかりやすい資料が発表されたと思います。 今回次に話題になりそうなGPU実装の論文について一つご紹介したいと思います。 紹介するのはリアルタイム向けのアルゴリズムとして述べられた論文です。ですが GPUにとって効率の良いアルゴリズムを知るという意味において有用だと思います。 現行リアルタイムCGとレイトレーシングの照明の違いとして、リアルタイムCGで使う 近似アルゴリズムは、環境テクスチャマッピングによる2次の反射光までが中心です。 近年、ボクセルコーントレーシング、ライトプロパゲーションボリュームなど、いくつか の条件付きで反射回数の制限がなくなってきています。 最近のGPUの性能向上から、リアルタイムCGに本格のグローバルイルミネーション が適用される日も近いのではないかと思います。 フォトンマッピングを使い、任意回数のフォトントレーシング反射結果を表現するいくつ かの手法を紹介します。
  3. 3. レイトレーシングとラスタライズアルゴリズムの比較 レイトレーシングVSラスタライズ(グラフィックス専用演算器群) 代表的なグラフィックスアルゴリズム比較 リアルタイムに動かすために様々な工夫、近似を使っている。 レイトレーシングラスタライズ 光学計算 レイトレーシング演算 スリックモデルなど フォンライティング フォン・ブリンライティングなど 大域照明 (反射が2回以上の光学計算) レイトレーシング演算 ライトプロパゲーションボリューム(LPV) 事前計算放射輝度転送(PRT) ボクセルコーントレーシングなど 影レイトレーシング演算 シャドウマッピング シャドウボリューム SSAOなど 反射 レイトレーシング演算 (任意回数の反射) キューブ環境マップスフィア環境マップなど (一回の反射まで) 屈折 レイトレーシング演算 (任意回数の屈折) キューブ環境マップスフィア環境マップなど (一回の屈折まで) 集光現象(コースティクス) レイトレーシング演算 テクスチャ焼き込みなど。 トポロジに依存するため動的には厳しい 被写界深度(DOF) レイトレーシング演算深度バッファを使った画像(後)処理 モーションブラーレイトレーシング演算深度バッファを使った画像(後)処理 プリミティブ レイトレーシング演算 (陰関数等の交差判定実装次第) 三角形 基本的に速度はレイトレーシングより もラスタライズ方式のほうが格段に高 速。前者は1フレームに数時間単位に 対してラスタライズ方式は 16.7ms(1/60秒, 60fps)で処理す ることを前提にしている。ハードウェア 化されている恩恵とともに、近似演算 で高速化されていることで可能になっ ている。近似されているゆえに高速だ が精度を捨てている。 GPU性能に合わせて性能と質のトレ ードオフを見ながらリアルタイム演算 のアルゴリズムは選択され、新しいも のが研究・開発されている。 元ネタ:raytracing.jp
  4. 4. リアルタイムレイトレーシング 真面目に計算理する方法でも,実用的なリアルタイム処理が現実に近くなっています。 下記手法があれば解決? ・Matt svobodaさんのリアルタイムレイトレデモ http://www.youtube.com/watch?v=i8hSZGTXTx8#t=144 ・Mattさんのリアルタイムレイトレデモ解説(brick map ) http://d.hatena.ne.jp/hanecci/20140209/p1
  5. 5. 反射・屈折のみならず、環境項、多数回の拡散反射、コースティクスを扱うためにはレイトレだ けでは表現が難しいです。前頁のものだけでは不足です。フォトンマッピングなど、表現に適し た手法があります。 レイトレーシングのGPU実装の話題は多々ありますが、フォトンマッピングのフォトン収集パス とそのGPU実装について述べている論文は見当たらないので紹介したいと思います。 1st 著者NVIDIA Michaelさん 今年はDeepGbuffer Morganさん: 法線マップを使ったSSAOなど 有名論文著作多数。 http://graphics.cs.williams.edu/pape rs/PhotonI3D13/ リアルタイムフォトンマッピング処理
  6. 6. 論文の概要 フォトンマッピングの実装を取り上げてみます。 計算には、フォトンのトレーシング計算に加えて、フォトン収集パスが必要になります。 フォトン収集には大量のフォトンをサンプリングする必要があります。 レイトレーシングはすでに様々な解法があります(NVIDIAには秒間数億レイが飛ばせる Optixシステムがある)。 そのためトレーシングは割愛し、今回はフォトンのサンプリング手法について調べます。 高速に実行するためにGPUを活用します。 今回試してみたところではGeForce670にて、1frame 28ms(30fps)を達成した。 演算能力1344shader pipe, 915MHz : 2460FLOPs メモリバンド幅192GB/s GDDR5 計算解像度960x540
  7. 7. 実装手法 ここでは実装の可能性を思いつく手法を4つほど試してみました。 3D Bounds / 2.5D Bounds / HashGrid / Tiled
  8. 8. それぞれの手法の分類を詳しく見てみる。
  9. 9. それぞれの手法の分類を詳しく見てみる。 メインのループをフォトンあたりにするか、 ピクセルあたりにするか 射影するジオメトリを どう処理するか どの空間で処理するか。 処理するシェーダステージ サンプリングを全部やるか、 離散的に済ませるか
  10. 10. 1)3D Bounds手法 グラフィックスパイプラインのラスタライザを使って、インスタンシング等でフォトンを描画。 フォトンの寄与範囲を20面体で表現し、干渉するオブジェクトに色を付ける。 ラスタライザを使うことで高速に演算が可能になる。 論文:http://graphics.cs.williams.edu/papers/PhotonHPG09/ デモ:https://www.youtube.com/watch?v=GckOkpeJ3BY
  11. 11. 2)2.5D Bounds手法 スクリーンスペースでZバッファを使い、フォトン を小さな球に外接するコーンとして計算。 コーン形状はフォトン座標からGeometry Shader で生成する。 スクリーンスペースで計算することから、3Dでは なく2.5Dと表現している。この状態ではZ方向のフ ォトンのバウンドは正確ではなくなる。 (同じ量のフォトンを計算する場合に、3D方式よ りも、XYについての寄与は良くなるとのこと)
  12. 12. 3)HashGrid Cells セル上にフォトンを分配し、スクリーンのピクセル座標を3D 空間に投影し、その座標に近いフォトンを3D空間上で探 索・収集する。 セル内にhash6432shiftアルゴリズムでコードテーブルを作 成しフォトンを管理する。 高速化するために共有メモリ(LDS,GDS)を使いたいが、こ の手法では使いにくい。
  13. 13. 4)タイルベース手法 スクリーンスペースでタイル状にピクセルを区切 り、そのタイルごとにフラスタムを生成。フラスタ ムにのりしろを付けてフォトンを分配する。 Intel のtile based renderingのような手法。ここ で扱うポイントライトやスポットライトの代わりにフ ォトンを扱う。 demo https://www.youtube.com/watch?v=Aogk2r_HjjA タイルベースの分割例(AMD Forward+)
  14. 14. サンプル手法 真面目に周辺フォトンを探った結果と、周辺フォトンを離散的に(たとえば1飛ばしで1000フォトン中、500フォトンしか サンプルしない。) バイラテラルフィルタを使ってノイズを減らした画像をみると、差はほとんどなくすことができる。
  15. 15. 実行結果 リッチなフルのBRDF リアルタイム向けの ランバートのみBRDF 2)“2.5Dバウンド”と4)”タイルド”アルゴリズムの結果が良好。 今回はフルのBRDFではなく、リアルタイム向けにランバートのみの状態で 良好な、タイルドアルゴリズムを詳しく見てみる。
  16. 16. タイルベースアルゴリズムフロー 1. フォトン投射 a. 普通にフォトンを光源から投射してトレーシング 2. 代表深度生成 a. 次に生成するフラスタムの深度を計算。分割されたタイル内のもっとも手前 をnearに、もっとも奥をfar に設定 3. フォトンのタイルデータベースへの分配 a. 上記投射されたデータをスクリーンスペース上でタイルに区切ったピクセル からフラスタムのleft right top bottom を指定。 b. 2と合わせてフォトン収集半径分ののりしろを付けて、フラスタムカリングが できる。これを使ってフォトンをタイルごとに分配。すべてのフォトンが対象。 4. フォトンのサンプリング a. 離散的フィルタ:N飛ばしでフォトンをサンプルし、最後に飛ばしたN倍エネ ルギーを増やす。 5. 放射輝度の計算 6. 必要に応じてバイラテラルフィルタなどノイズをごまかす
  17. 17. まとめ アルゴリズムをCPUからGPUに移動して高速にすることができる。 この際、データ構造によって性能が大きく異なる。 性能変化の傾向がCPUとGPUでは違う。 現状GPUで、数百Kのフォトンをリアルタイムにサンプルして放射輝度を計算すること ができる。 しかしながら、映画品質に向けてはまだ扱うフォトンの桁が6ケタくらい違う。 今回のGPU実装ネックはメモリ読み込みのレイテンシ。 分割したフォトンはのりしろ分の重複があるので数が増える。フォトンのデータを読み 込むのにメモリ読み込みのレイテンシの時間分毎時データ読み込みの待ちが入り、 処理が進まない。
  18. 18. 参考
  19. 19. 参考:GPU実装Tips GPUのパイプラインは長い。流れが止まると後段 は滞留する。 → 流れを止めない。ボトルネックになっている箇 所を意識。 ボトルネック解析ができたら当該箇所の負荷を緩 和する。 GPUの構成に依存して強い箇所、弱い箇所があり ます。それぞれ、GPUが持っているリソース・特性 に合わせて調整します。 よくあるネック要因 ●テクスチャネック ●頂点アトリビュートネック ●シェーダネック ●CBDB(ROP)ネック ●メモリバンド幅ネック ●命令ネック ●同期ネック ●頂点数ネック
  20. 20. 参考文献 ・フォトンマッピング入門林秀一さん http://www.slideshare.net/ssuser2848d3/ss-25795852 ・リアルタイムCGとフォトンマッピングのハイブリッドレンダリング http://game.watch.impress.co.jp/docs/series/3dcg/20091228_340280.html ・intel / tile based rendering https://software.intel.com/en-us/articles/deferred-rendering-for-current-and-future-rendering-pipelines/ ・AMD / Forward+ http://developer.amd.com/tools-and-sdks/graphics-development/ ・Fast Global Illumination Approximations on Deep G-buffers 2014 http://graphics.cs.williams.edu/papers/DeepGBuffer14/#video
  21. 21. フォトン主軸アルゴリズム疑似コード (散布系) for (uint32_t p=0; p<photon_num; p++ ){ //フォトンループ photon[ p ].draw(); // グラフィックスパイプでメモリにフォトン位置を格納 for(uint32_t y=0; y<height; y++){ //スクリーン座標ループ for(uint32_t x=0; x<width; x++){ //pixel shader, compute shaderへGPU化しやすい。 if( isVisible( photon[ p ].pos, x, y, eyePos ) ){ //スクリーン上でフォトンが見えるなら image[ y ][ x ] += contribution( p, x, y, z ); // 寄与をさせる。 } } } }
  22. 22. ピクセル主軸アルゴリズム疑似コード (収集系) for(uint32_t y=0; y<height; y++){ //スクリーン座標ループ for(uint32_t x=0; x<width; x++){ //pixel shader, compute shaderへGPU化しやすい。 for (uint32_t p=0; p<photon_num; p++ ){ //フォトンループ if( isVisible( photon[ p ].pos, x, y, eyePos ) ){ //スクリーン上でフォトンが見えるなら image[ y ][ x ] += contribution( p, x, y, z ); // 寄与をさせる。 } } } }

×