Screen Space Ambient Occlusion (SSAO) のサンプルプログラムです。FBO (Frame Buffer Object) と MRT (Multiple Render Targets) を用いた遅延レンダリングにより、デプスバッファをもとにリアルタイムで環境遮蔽 (Ambient Occlusion) を計算・描画します。
本プログラムは、以下のブログ記事の解説のために提供されています。
- CMake 3.22 以上
- C++17 に対応した C++ コンパイラ (MSVC, GCC, Clang など)
- OpenGL 2.1 以上 (GL_EXT_framebuffer_object および GL_ARB_texture_float をサポートする GPU)
- 依存ライブラリ: GLEW, FreeGLUT (CMake の FetchContent により自動取得されます)
cmake -B build
cmake --build build --config Releasecmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build buildビルド完了後、実行ファイルと同じディレクトリに必要なシェーダファイル(pass1.vert, pass1.frag, pass2.vert, pass2.frag)およびリソースファイル(bunny.obj, room.raw, campus.raw)がコピーされます。
.\build\Release\ssao.exe./build/ssao- マウス左ドラッグ: トラックボールによるモデルの回転
- カーソルキー (← / → / ↑ / ↓): 視点の平行移動
- z / Z: 視点の前後移動 (ズームイン / ズームアウト)
- q / Q / Esc: プログラムの終了
- 1 パス目 (pass1.vert / pass1.frag):
- MRT を用いて、拡散反射光・鏡面反射光 (D + S)、環境光の反射光 (A)、ビュー空間の位置 (P)、ビュー空間の法線ベクトル (N) を複数のテクスチャ (浮動小数点テクスチャ) に同時レンダリングします。
- 2 パス目 (pass2.vert / pass2.frag):
- 画面全体を覆う矩形を描画し、1 パス目で記録したビュー空間座標とデプスバッファを参照して、照射点周辺の球状サンプリング点とデプス値の比較から環境遮蔽係数 (Ambient Occlusion) を計算します。
- 計算された環境遮蔽係数を環境光成分に適用し、背景画像や疑似的な映り込み・屈折と合成して最終画像を出力します。