Skip to content

mnrn/VKGraphics

Folders and files

NameName
Last commit message
Last commit date
Feb 16, 2021
Jan 6, 2021
Jan 26, 2021
Feb 16, 2021
Dec 27, 2021
Feb 16, 2021
Jan 27, 2021
Feb 18, 2021
Feb 16, 2021
Jan 27, 2021
Jan 6, 2021
Feb 8, 2021
Jan 24, 2021
Feb 16, 2021
Jan 6, 2021
Feb 17, 2021

Repository files navigation

Vulkan グラフィックメモ

License: MIT Launguage-C++

グラフィックに関する実装を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があるので詳しくはそちらを参照ください。

Features

物理ベースレンダリング (Physically Based Rendering)

PBR

BRDFによるMicrofacet Modelの描画を行っています。
このあたりの理論はGoogleの物理ベースレンダリングエンジンFilamentのドキュメントなどを参考にしました。
左が金属(Metallic Material)、右が非金属(Dielectric Material)です。

GUIの使用を少し変更したこともあり、細かいところは移植元から移植していませんが準備はしています。
また、IBLなどはいまのところ実装しておりません。


遅延シェーディング (Deferred Shading)

Deferred

2次元の画面空間上でシェーディングを行う手法です。
半透明をうまく扱えない点やメモリを大きく消費する点などからゲームではあまり使われないかもしれません。
大量のライトを使う場合は候補に入れても良いかもしれません。

上から位置情報、法線情報、色情報を格納したテクスチャを表示させています。

3つの情報からライティングを施した結果です。


スクリーンスペースアンビエントオクルージョン (SSAO)

SSAO

アンビエントオクルージョン(環境光遮蔽)をスクリーン空間上で考えて計算するシェーディング手法です。
Deferred Renderingで実装しましたが、Forward Renderingでも用いることは可能です。

SSAOOnly

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