グラフィックに関する実装をVulkanで行っていきます。
もともとはOpenGLで動かしていたプログラムですが、
- デバッグをOpenGLよりも楽にしたい点
- もっと低レイヤーな部分に触れたい点
- HLSLが使用したい点
- マルチプラットフォームが可能な点(DirectXではない理由)
- OpenGL の遺産を使いたい点
などからVulkanへ移行することにしました。
現時点では VULKAN_SDK が環境変数として設定されていないとビルドができないことに注意してください。
MoltenVKでMacOSXのみの動作確認になります。
後にWindowsとLinuxにも対応するつもりですが、手持ちのWindows機のグラフィックスカードがVulkanに対応していないため、対応は後になりそうです。
Windowsでビルドできる事自体は確認済みになります。
AndroidやiOSの対応は未定になります。
- OS
- Mac OSX Big Sur 11.1
ビルドツールはCMakeになります。
グラフィックライブラリはVulkanでバージョン1.0以降がターゲットになります。
したがって、Vulkanはインストール済みであることが想定されることに注意してください。
インストールしていない場合はこちらからダウンロードができます。
以下はリポジトリにすでにおいてあるのでインストールがされてなくても大丈夫です。
リポジトリのルートディレクトリにCMakeLists.txtがあるので詳しくはそちらを参照ください。
BRDFによるMicrofacet Modelの描画を行っています。
このあたりの理論はGoogleの物理ベースレンダリングエンジンFilamentのドキュメントなどを参考にしました。
左が金属(Metallic Material)、右が非金属(Dielectric Material)です。
GUIの使用を少し変更したこともあり、細かいところは移植元から移植していませんが準備はしています。
また、IBLなどはいまのところ実装しておりません。
2次元の画面空間上でシェーディングを行う手法です。
半透明をうまく扱えない点やメモリを大きく消費する点などからゲームではあまり使われないかもしれません。
大量のライトを使う場合は候補に入れても良いかもしれません。
上から位置情報、法線情報、色情報を格納したテクスチャを表示させています。
3つの情報からライティングを施した結果です。
アンビエントオクルージョン(環境光遮蔽)をスクリーン空間上で考えて計算するシェーディング手法です。
Deferred Renderingで実装しましたが、Forward Renderingでも用いることは可能です。
SSAOシーンのみをレンダリングした場合です。
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
Examples and demos for the new Vulkan API