グラフィックに関する実装をOpenGLで行っていきます。
Vulkanへの移行を始めていますが、OpenGLでの実装も続けていきます。
また、統合してしまうことも考えておりますが、今のところ未定になります。
もともとはLinuxで動かしていたプログラムですが、PCが壊れたのでMacに移していたものです。
再入門にあたりWindowsでも動かせるようにしました。
現在動作確認はWindowsとMacのみになります。
動作環境にLinuxを近々追加する予定です。
動作環境にiOSとAndroidに追加するかどうかについては未定になります。
- OS
- Windows10
- Mac OSX Catalina 10.15
ビルドツールはCMakeになります。
グラフィックライブラリはOpenGLで4.3以降がターゲットになります。
ただし現在使用しているグラフィックボードのスペックなどの諸事情により4.4までの確認になります。
以下はリポジトリにすでにおいてあるのでインストールがされてなくても大丈夫です。
ビルドの例です。
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -DCMAKE_BUILD_TYPE:STRING=Debug -H/. -B/./Build -G "Ninja"
cmake --build ./Build --parallel 13
リポジトリのルートディレクトリにCMakeLists.txtがあるので詳しくはそちらを参照ください。
BRDFによるMicrofacet Modelの描画を行っています。
このあたりの理論はGoogleの物理ベースレンダリングエンジンFilamentのドキュメントなどを参考にしました。
左が金属(Metallic Material)、右が非金属(Dielectric Material)です。
2次元の画面空間上でシェーディングを行う手法です。
半透明をうまく扱えない点やメモリを大きく消費する点などからゲームではあまり使われないかもしれません。
大量のライトを使う場合は候補に入れても良いかもしれません。
アンビエントオクルージョン(環境光遮蔽)をスクリーン空間上で考えて計算するシェーディング手法です。
Deferred Renderingで実装しましたが、Forward Renderingでも用いることは可能です。
SSAOシーンのみをレンダリングした場合です。
シャドウマッピングはライトの視点からシーンを描画し、各フラグメントでデプスの計算を行います。
次にシーンを描画するときに先に計算したデプスを考慮して影を描画する手法です。
上の画像は1024x1024の解像度のシャドウマップを使用しています。
カメラの視錐台を分割して各視錐台に対してシャドウマップを適用し、影を描画する手法です。
実装していて気づきましたが、パラメータによってだいぶちらつきが発生するため、バウンディングスフィアによる安定化を採用しました。
視錐台を3分割にしてシャドウマップを生成した場合です。
手前のほうがくっきりしているのがわかると思います。
コンピュートシェーダーによるパーティクルと重力場のシミュレートになります。
コンピュートシェーダーを使用しているのでOpenGL4.3以降が必要になるためMacOSでは動作しないことに注意してください。
OpenGL 4 Shading Language Cookbook - Third Edition
HLSL Development Cookbook
Unity 2018 Shaders and Effects Cookbook - Third Edition
Physically Based Rendering in Filament
Advanced-Lighting - SSAO
Cascaded Shadow Maps
GPU Gems3 Chapter 10. Parallel-Split Shadow Maps on Programmable GPUs