Vulkan学习笔记:基础概念

与OpenGL的区别

  • Vulkan的目标是提供高性能与更均衡的CPU和GPU占用,这一点和DX12、Mantle一直。
  • 与DX(12之前)和OpenGL比,Vulkan是一个底层的API,可以执行并行任务。
  • 可以更好的分配多个CPU核心的使用。
  • 在传统的OpenGL编程中,OpenGL的驱动会追踪很多全局的状态,会掩盖大部分显卡操作的细节,比如命令的同步,指令排队的维护。但是在Vulkan中,这都需要程序自己维护。
  • 在Vulkan程序设计中,显卡就像一份资源,你可以往上面传输数据,可以往显卡上面传输程序。

Vulkan的内容

  • Vulkan中只设计的接口规范,比如数据传输指令规范、图形绘制指令规范、并行运算接口规范。遵循Vulkan设计规范的设备可以只实现其中的某一个规范。
  • Vulkan的API可以直接从显卡驱动中获取。
  • 现在的显卡驱动都会安装Vulkan的驱动,以我的电脑为例,nvoglv32.dll和nvoglv64.dll在C:\Program Files\NVIDIA Corporation\Installer2\Display.Driver中。

Vulkan的使用是层层调用获取API的

  • Vulkan顶层的功能是在instance层中实现的,这一层的API可以实现对所有实现了Vulkan标准的设备的管理。而每个设备都会开放出实现了某种功能的命令队列,应用程序就是通过这样的命令队列对实际的物理设备实现操作和管理。
  • 顶层API GetProcAddress(Windows):通过这个函数获得不同的操作系统上特有的API。比如创建Vulkan的instance的API,vkGetInstanceProcAddr。获得这个函数的地址后就可以进一步获得下层的API,比如vkGreateInstance。
  • Device层的API
    • 拿到vkGetInstanceProcAddr地址后就可以获得设备层的API,这些API才是我们操作显卡的API。
    • 在Instance层的API里面,有一个API是vkGetDeviceProcAddr。获得这个API的指针后,就可以进一步通过它去取出Vulkan常用的API。比如vkGetDeviceQueue、vkDestroyDevice。

逻辑设备和物理设备

  • 同一个应用程序的进程中,可以创建多个Vulkan的instance,每个instance可以操控一个或者多个实际的物理设备。这些物理设备对我们来说就是GPU,无论是独显还是集显,都可以看出Vulkan中的一个设备。
  • Vulkan的逻辑设备由instance创建而来,通常情况下,Vulkan中的逻辑设备都会有一个Vulkan的物理设备与之关联。
  • 这个逻辑设备代表着Vulkan物理设备的可以被使用的资源的一个集合,这其中不仅包含存储资源,运算能力也是一种资源。这个资源集合只是某个具体的物理设备的一部分资源,一个逻辑设备不代表一个物理设备上的所有资源。因为对于同一个物理设备,可以创建出多个逻辑设备。
  • 我们的代码与逻辑设备交互,而不是直接与Vulkan的物理设备交互。在创建了逻辑设备后,还需要从这个逻辑设备上获取到相关的命令队列。应用程序是通过Vulkan逻辑设备的命令队列向Vulkan物理设备发送操作指令的。

Vulkan执行逻辑

  • 程序进程
  • Vulkan实例:控制渲染环境,包括debug层函数指针,Vulkan surface指针
  • Vulkan的Surface:与显示的上下文(窗口)关联
  • Graphic Queue(绘图指令队列):为设备发送绘图指令
  • Present Queue(显示指令队列) :图像化完了,要显示出来,需要发送显示指令。
  • CommandPool:发送绘图指令、或者显示指令的时候,这些指令需要在CommandPool中初始化。新建出一个指令后,不断的在这个指令后面添加新的指令,然后把这个指令本身塞给Graphic Queue,然后Graphic Queue把指令链发给显卡。
  • CommandBuffer:指令链
  • 操作杆(逻辑设备):FBO、显示用的双缓冲都在这里创建的。
  • 选择一个设备(GPU):用于渲染Vulkan。Vulkan可以一次控制多个显卡一次的渲染。

image

# Vulkan
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×