上一章文章链接
Vulkan简介
Vulkan是一个低开销、跨平台的二维、三维图形与计算的应用程序接口(API),[11]最早由科纳斯组织在2015年游戏开发者大会(GDC)上发表。与OpenGL类似,Vulkan针对全平台即时3D图形程序(如电子游戏和交互媒体)而设计,并提供高性能与更均衡的CPU与GPU占用,这也是Direct3D 12和AMD的Mantle的目标。与Direct3D(12版之前)和OpenGL的其他主要区别是,Vulkan是一个底层API,而且能执行并行任务。除此之外,Vulkan还能更好地分配多个CPU核心的使用。
科纳斯最先把Vulkan API称为“次世代OpenGL行动”(next generation OpenGL initiative)或“glNext”,但在正式宣布Vulkan之后这些名字就没有再使用了。Vulkan基于Mantle构建,AMD将其Mantle API捐赠给科纳斯组织,给予该组织开发底层API的基础,使其像OpenGL一样成为行业标准。
摘自wiki
RHI
RHI(Render Hardware Interface):渲染硬件接口 (RHI) 是几个特定于平台的图形 API 的抽象层。比如OGL、D3D等。
传统RHI:
基于Context(类似于状态机),依赖上下文,需要自己管理每个Context的生命周期。多线程不友好。
现代RHI,基于Cbuffer:
所谓CommandBuffer实际上是一个管理GPU命令的队列,多线程友好。CBuffer可以复用。
Vulkan基本操作
以上一节HomeWork0代码为例:
PS:关于windows窗口C++实现可以参考大二时期我在CSDN写的专栏,当时写这个专栏的目的就是为了方便同期的同学写(抄)C++游戏作业,顺便讲解,所以注释写的都非常小白向,非常易懂。比如HINSTANCE这种概念都有详细的注释。目前专栏也有2w+的访问量了。
Vulkan初始化
Vulkan与设备:
老师提到过根据VkPhysicalDevice查询到的队列簇:
Vulkan与屏幕:设备是否支持/
Vulkan图形管线
这部分不同的RHI基本一致,就不再赘述了。这里笔记只记一些特殊的。
顶点数据缓存的排布对的vertex shader会有一定的性能影响,常用的优化算法库meshoptimizer。
不同索引之间的顶点属性在分配过程中不要过远,cache miss影响程度一般往往大于顶点复杂度。
Draw:只有顶点数据
Draw Index:顶点数据+索引
Draw Indirect:GPU Draw
Draw Index Indirect:GPU Draw Index
Vulkan中可以自定义Pipeline,Bind Pipeline后执行。
Vulkan中FrameBuffer/RenderTarget,是否需要保持FrameBuffer中原有的数据,是否写回内存,这些是需要自行定义的。