[程式] Unheard Engine - 自製Vulkan小引擎

作者: Renzokuken (獅子心)   2022-11-24 03:46:04
大家好, 不才名字Squall
目前在英國從事Graphics Programmer, 參與研發AAA專案
即使平常在工作上已經收穫許多
我個人是那種不用別人催也會想辦法變強的個性
所以平常是會開一些Side Project給自己練習的
這次的Vulkan小引擎 - Unheard Engine便是其中之一了
https://i.imgur.com/WygBvq1.jpg
利用空閒時間實作約57天, 目前的功能還沒有很多
- Deferred Rendering Pass (PBR)
- Ray Tracing Shadow
- Lighting Pass
- Skybox Pass
- Motion Vector Pass
- Tone mapping
- Temporal AA
但從物件渲染、後製特效、光追的使用
應該涵蓋各種基本的用法了
希望能幫到剛好也在學習Vulkan的人:)
然後也不用問為什麼沒有半透明物件, 為什麼沒有XXX之類的
就只是還沒實作而已, 一切從0開始做是需要點時間的
任何沒實作的功能都是Future Work, no ETA
網頁好讀版 (我發在GameDev.net的文章):
https://tinyurl.com/5t9824xu
由於篇幅有點過長, 我不會在這提所有的細節 (尤其是程式碼)
那如果你是那種喜歡直接觀察程式碼的人
可以直接下拉到置底連結
● 引擎名稱
由於過往使用過的引擎剛好都Un-開頭 (Unity, Unreal)
我就隨便抓個Un開頭的字來用了XD
以下我會簡單稱為UHE
如果你對Vulkan程式有興趣, 我建議還是從官方教學開始
● 環境
如同多數的學習者一樣, 我從下列兩個網站開始:
https://vulkan-tutorial.com/
https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html
所以你大概預期UHE是Vulkan+GLFW+GLM這種組合, 但,恰好相反!
UHE的組合為Vulkan + Win32 Window + DirectX math
+ HLSL + WIC texture loader + FBX importer
主要是因為我已經有DirectX 12的開發經驗了
我想最大化利用學習時間, 盡量維持在我熟悉的環境
跨平台?以後想做的時候再改就行了
所以這邊只有Vulkan / FBX SDK對我來說是陌生的
然後我是在筆電上開發的
i7 - 11375H, RTX 3060 Laptop, 16GB RAM
● Debug vs Release Build
我有特別區分這兩種Build
一些功能像是Editor不會出現在Release Build
● Vulkan的誤報錯誤
如果真的有把UHE載下來跑, 可能會遇到兩種誤報
1. VUID-VkSwapchainCreateInfoKHR-imageFormat-01778(ERROR / SPEC)
VUID-VkImageViewCreateInfo-usage-02275(ERROR / SPEC)
這個問題, 我是只有在開啟RTSS的時候才遇到的
我猜其他FPS測量工具可能也會造成此問題
2. Microsoft C++ exception: MONZA::IgcThreadingContext::msg_end
在呼叫vkCreateSwapchainKHR()時有可能會存在的例外
以上這兩種誤報都不影響UHE的運行
如果有人對於此兩種誤報有解決經驗, 還請不吝指點!
● 素材匯入
由於還沒有實作一些編輯器, 目前UHE將會自動匯入RawAssets/下的素材
然後加入自製的Renderer架構裡
素材匯入有著簡單的快取機制, 匯入過的素材會生成.uhxxxx檔案
下次再啟動時, 已匯入過的素材不會再匯入(除非有變)
不然說真的匯入FBX可是很卡的..
● Shader編譯
DirectXShaderCompiler才是真的MVP!
Vulkan的shader模組其實採用了他們的Spir-V語言
所以HLSL是需要轉換成Spir-V的
只要在呼叫dxc.exe時傳入 -spirv 參數就能轉換
另外也為了光追shader傳入了-fspv-target-env=vulkan1.1spirv1.4
UHE也有簡單的shader變體管理, 同個shader但使用不同keyword的
我會給他們產生不同的hashcode
https://i.imgur.com/KoJyvp6.jpg
● Culling
目前完全沒有做culling, 也還沒有做draw call batching
另外要提的是為了最佳深度精度, 使用了reversed infinite z
所以物件離鏡頭再遠都絕對不會被剔除
效能優化是之後才要做的事
目前Release Build大概是跑280~340 FPS在跑 (不開Vsync)
● Pool機制
UHE會盡量重複使用性質相同的物件
例如目前的維京小屋測試雖然有著747個Draw Calls
但實際上只用到了16個VkPipeline物件
以及只有5個VkSampler物件等等
相信我, 如果每個Renderer都生不一樣的物件, 效能絕對降
● 渲染流程
目前很簡單, 一個Main Thread + Render Thread
所有渲染工作都是在RT上完成
物件Constant Buffer或Storage Buffer的更新
採用了Dirty Flag機制, 也就是說大多數靜態物件
根本不需要每個物件每個Frame都做Buffer Copy的動作!
流程和開頭說得差不多:
https://i.imgur.com/HbVBFIG.jpg
1. Base Pass - Filling GBuffer
要點在於: 如何建立MRT (Multiple Render Target)
Vulkan教學網站只教了單一RT的使用
但其實很簡單, 在建立vkFrameBuffer物件時
所使用的VkAttachmentDescription, VkAttachmentReference
改成複數就好了
2. 更新Top Level Acceleration結構
對於DXR光追不熟的人可以參考這個連結:
https://microsoft.github.io/DirectX-Specs/d3d/Raytracing.html
簡單來說Acceleration Structure是光追必備的結構
分成Top Level, Bottom Level兩種
前者是基於Instance的, 後者是基於Mesh的
可以簡單把他們的關係想成Renderer跟Mesh
一個Mesh可以被不同的Renderer使用
一個Bottom Level AS可以被不同Instance Level AS使用
UHE給模型建立Bottom Level AS (無Transform)
然後給Instance建立Top Level AS (包含Transform)
當然這只是UHE的做法, 你要給Bottom Level AS施加Transform也是可以的
詳細的建立過程請參閱程式碼, 真的不好轉過來
3. 光追陰影
https://i.imgur.com/yy7uYgv.jpg
https://i.imgur.com/Ggq38g9.jpg
作者: iLeyaSin365 (伊雷雅鑫)   2022-11-24 04:52:00
真猛 有生之年我想我都不會做到開發引擎這種事
作者: dklassic (DK)   2022-11-24 07:42:00
讚欸感謝分享 XD感覺對 Unity 失望透頂的時候會想要來試試看(?
作者: luckyexcel (G.G.S)   2022-11-24 07:43:00
強大
作者: zxc9764315 (Norus)   2022-11-24 07:56:00
Vulken教學還躺在我的書籤裡面XD,感謝分享
作者: KanzakiHAria (神崎・H・アリア)   2022-11-24 11:38:00
Unreal表示:都在我的source code裡 去找吧
作者: Mchord (Mchord)   2022-11-24 12:00:00
Respect
作者: coolrobin (泳圈)   2022-11-24 13:02:00
請手下我的膝蓋 m(_"_)m收
作者: kyushu (蘇打綠嚇倒我了)   2022-11-24 17:37:00
太強了,你跟另一個wicked engine的作者還滿像了
作者: a82611141   2022-11-24 18:55:00
好強
作者: newyellow (newyellow)   2022-11-24 20:34:00
最近在學 webgl,對所有寫底層的人感到敬佩 XD
作者: aegis123321 (PE)   2022-11-25 07:17:00
感謝分享 網誌有不少感興趣的文章
作者: nicetw20xx (哇愛台灣)   2022-11-25 08:21:00
好猛 推
作者: dklassic (DK)   2022-11-25 15:02:00
我已經對 Unity 的可靠度失望到開始自己寫很多理所當然的東西了 XD但當然自製引擎就主要是順便學習,如果目的是做商業遊戲的話應該也是轉 Godot 不是轉 UE(
作者: NCTU87 (八七)   2022-11-26 09:59:00
作者: johnny94 (32767)   2022-11-26 10:21:00
推,自幹過引擎,真的很累但很好玩
作者: EasyIsBeauty (業餘新手)   2022-11-28 17:11:00
超猛,大學project跟同學一起幹過後就懶了 XD
作者: RadiationXen (Xen)   2022-12-03 08:46:00
作者: sck921 (The Fate)   2022-12-07 12:20:00
感謝分享,開發引擎真的是佛心
作者: purplvampire (阿修雷)   2021-01-20 20:33:00
太強了!
繼續閱讀

Links booklink

Contact Us: admin [ a t ] ucptt.com