[程式] 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