【ZeloEngine】OpenGL升级Vulkan
Vulkan的资料有很多,这里以GDC2016中nvidia的slide作为讨论的基础
Vulkan - 高性能渲染 - 知乎 // 结果发现是文刀秋二做的talk,这就是大佬把
还有一本基础书《Learning Vulkan》
这本书和大部分Packt的书一样有一个问题,有很多流水账一样的线性流程代码
下文中Vulkan简称vk
Scope
最终目标:多线程渲染框架
笔者水平有限,无法一步完成多线程渲染框架,拆解一下,大致分几步:
- GL升级Vulkan,跑通原来的Demo
- 多线程调研:Asio/TaskFlow
- 多线程引擎架构
是什么?不是什么?
vk是图形接口,笔者学习vk主要是理解CPU和GPU协同完成绘制的软件过程
vk不是GPU硬件,也不是图形学,但是有一定辅助理解作用
vk在渲染架构的位置
理想的分层架构如下,实际上由于缺乏经验,笔者无法很好地分离出RHI层,vk call到处飞
Why not DX12?
换开发框架,数学库,坐标系手性,shader,总之风险比Vulkan大
坑
1. 初始化时序依赖
这里出现新的case了,下面两句不依赖window,尽早初始化
volk就是loader,调了才能调vk call,否则代码段错误
volk < create-window < vk-call
此外,还有一个依赖,所有显卡操作需要走命令队列,因此要先创建命令队列:
command pool < command buffer < vk-command-call
glslang_initialize_process();
volkInitialize();
2. 多图形接口宏管理
GL,Vulkan,两个宏,用ifdef到处打洞,打补丁,window这种强平台相关其实还不如每个写一个版本
一种比较干净的写法就是派生WindowGL,WindowVulkan类,顶层包一下宏,避免ifdef到处飞
由于SDL的Vulkan扩展总共就5个接口,这里就不派生了,统一放在一个Window类
3. SDL
市面上大部分例程都是glfw的,但是Zelo用的是SDL
SDL封装了窗口 / 平台相关的API,折腾了一会
// 1. native way
// Creat empty Window
CreateWindowEx(...); /*Windows*/
// Query WSI extensions,store as function pointers. For example:
// vkCreateSwapchainKHR, vkCreateSwapchainKHR .....
// Create abstract surface object
VkWin32SurfaceCreateInfoKHR createInfo = {
};
vkCreateWin32SurfaceKHR(instance, &createInfo