2013年11月20日

OpenCLでSSAO+シャドウマッピング

以前もSSAOをやっていたのですが、CPUで遅かったのでOpenCLで試してみることにしました。
SSAOについては、[1]がとても参考になりました。
以前やっていたのはHorizon-based Ambient Occlusionもどきで、今回はStarCraft II Ambient Occlusionもどきになります。
サンプリング点の生成方法は、[2]を参考にさせていただいて、中心の方にサンプリング点が増える方式を使わせていただき、サンプリング点100個として計算しました。

シャドウマッピングについては、ガウスフィルタでぼかすことを前提にしてますので、一番基本的なものにしています。時間があればバイラテラルフィルタとかもOpenCLで実装しておきたいところです。

手順としては以下のようになります。

(1) 視点及び光源からレンダリングして深度値や法線ベクトルなどをFBOに出力
(2) FBOをOpenCLから参照してSSAO+シャドウマッピング
(3) ↑の結果にガウスフィルタ×5回
(4) 通常のレンダリング結果×↑の画像
(5) FBOをOpenGLに戻す

実行結果

通常のレンダリング結果というかテクスチャの色を出力しただけのもの
opencl_ssao_001.png

(2)〜(3)を計算した結果
opencl_ssao_002.png

↑の結果をレンダリング結果に掛け合わせたもの+ガンマ補正
opencl_ssao_003.png

(2)〜(3)で色を(SSAO, シャドウマッピング, 1.0, 1.0)にして出力した結果
opencl_ssao_004.png

データ転送を含まない(2)〜(4)の処理が約30msぐらいで、リアルタイムにはちょっとぎりぎり間に合わないぐらいですがやっぱり並列処理は早いですね。

一応OpenCLのソースコードだけ置いておきます。このソースコードを参考にして何か問題が起こったとしても責任はとりません。
gpuMain.cl

[1] http://ambientocclusion.hatenablog.com/entry/2013/11/07/152755
[2] http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20101122
web拍手 by FC2
posted by シンドラー at 23:08 | Comment(0) | TrackBack(0) | OpenCL | このブログの読者になる | 更新情報をチェックする

2013年11月07日

LU分解で行列式と逆行列の計算 その3

clBLASを使えるようになったので、LU分解で逆行列の計算を試してみることにしました。
といっても参考サイト[1][2]の遂次用っぽいアルゴリズムをそのままOpenCL用に書いただけなので、全然並列化効率とか上がっていないと思います。
(計算結果に依存する部分があるため、ループを回して何度もカーネル関数を実行しています。)

LU分解のやり方は大体以前の記事「LU分解で行列式と逆行列の計算 その2」の方法で、AをMAにしてMAをLUにしてA-1=U-1L-1Mで逆行列を計算しています。本来はLUx=bとした場合、Ly=b、Ux=yとしてxを求めるべきなのですが、上記のように三角行列の逆行列U-1とL-1を計算して逆行列を求めています。[1]によると連立1次方程式を解くのに逆行列は無用の長物らしいので、あまり良くないやり方なんだとは思います。

掛け算については前回のclBLASを使用させていただいております。

実行結果

適当に作った1024x1024の行列の逆行列を計算したところ、最初から最後まで合わせても約1秒で計算できました。ちゃんと並列化された逆行列計算のライブラリなら一瞬で終わると思いますので自分で作る意味は無いと思いますが。

せっかく作ったので一応clのコードだけ公開しておきます。万が一参考にして何か問題が起こっても責任はとりません。
gpuMatrixTest.cl

[1] http://www.math.meiji.ac.jp/~mk/labo/text/linear-eq-1.pdf
[2] http://www.kata-lab.itc.u-tokyo.ac.jp/OpenLecture/SP20120612.pdf
web拍手 by FC2
posted by シンドラー at 01:35 | Comment(0) | TrackBack(0) | OpenCL | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。