提示:vulkan API

管理组件

每个使用Vulkan API的应用必须创建一个VkInstance,通过VkInstance可以查询系统中可被Vulkan识别的显卡硬件VkPhysicalDevice。Vulkan渲染使用的设备是选择并通过VkPhysicalDevice创建的VkDevice。用户空间是通过VkQueue向VkDevice提交渲染和控制指令。所以,一个应用只有一个VkInstance,可以有多VkPhysicalDevice,但是大部分情况下只会选择一个VkPhysicalDevice。一个VkPhysicalDevice可以多个VkDevice,一个VkDevice可以有多个VkQueue。
流程:创建实例 --> 创建表面 --> 选择物理设备 --> 创建逻辑设备 --> 创建交换链 --> 创建帧缓冲区
在这里插入图片描述
VkFrameBuffer是渲染目标和渲染过程使用的color、depth和stencil等渲染目标缓存组件,在Vulkan叫VkFrameBuffer。
如果渲染的结果需要显示在屏幕上,就需要VkSurfaceKHR。对于Vulkan,如果不需要在屏幕显示,就不需要创建Surface对象。因为Vulkan是一个与平台无关的API,所以与平台相关的部分会统一放到WSI,其中VK_KHR_surface提供VkSurfaceKHR。
由于PageFilp存在,会有多个VkFrameBuffer轮流在Surface对象上显示内容。当一个VkFrameBuffer显示的时候,另一个VkFrameBuffer在绘制。控制PageFilp的Vulkan对象是VkSwapChainKHR(VK_KHR_swapchain扩展提供的句柄),它是渲染与显示之间的桥梁。

管线资源

Render Pass描述一系列资源和使用方法:告诉 GPU 在什么阶段对哪些图像进行读写、以什么方式处理。
在这里插入图片描述
Pipeline着色器阶段:
顶点着色器:告诉 GPU 怎么处理每个顶点的数据;
片元着色器:决定每个像素最终长啥样;
动态:指定哪些固定函数状态是“动态”的结构体;
光栅化:把顶点数据组成的几何图元(三角形、线段等)转化成像素片段,送片段着色器;
多重采样:抗锯齿;
颜色混合:把片段着色器输出的颜色和帧缓冲中已有颜色按规则混合;
管线布局:管线阶段要用的所有外部数据的总清单;

资源组件

交换链中的每个图像(VkImage)都是一个独立的资源,用于存储渲染结果。但由于VkImage不可以直接在着色器访问,需要先基于VkImage创建VkImageView。VkFrameBuffer为交换链中的每个图像创建一个帧缓冲区
主要是VkBuffer和VkImage。
(1)数据类型
VkBuffer可以看作一片连续的内存(连续布局)
存放:顶点数据、索引数据、着色器常量。
VkImage并不是单张图像,而是包含Mip Level等中间大小的图像
存放:纹理映射、帧缓冲区。
(2)用法
VkBufer通过vkMapMemory映射到系统内存进行处理
VkImage平时不能映射到系统内存。
为VkImage准备数据,使用VkBuffer作为临时数据,vkCmdCopyBufferToImage可以将数据拷贝到VkImage。
(3)注意
从数据组织来看,VkImage包括:
VkImageLayout 如何被GPU访问VkFormat 数据存储格式
VkImageTiling 数据存储布局
在这里插入图片描述

渲染流程

在这里插入图片描述
渲染显示过程整体上有3个异步完成的子过程,也就是GPU要参与执行的过程:
(1)vkAcquireNextImageKHR从VkSwapchainKHR中获得VkImage。
(2)vkQueueSubmit提交硬件执行录制的渲染指令。
(3)vkQueuePresentKHR显示过程。
在这里插入图片描述
vkAcquireNextImageKHR从VkSwapChainKHR获取一个VkFrameBuffer序号,该序号对应的vkFrameBuffer可以用于录制Vulkan渲染指令的渲染目标,通过vkQueueSubmit函数将录制提交到渲染计算执行队列中,最后渲染结果在计算完成后存放到VkFrameBuffer中。使用vkQueuePresentKHR将包含渲染结果的VkFrameBuffer停止到对应的VkSwapChainKHR,使得VkSwapChainKHR可以用刚提交的VkFrameBuffer替换正在VkSurfaceKHR对应的Surface对象显示的VkFrameBuffer。

补充

提示:资源绑定情况
在这里插入图片描述
描述符集合descriptorset绑定不同着色器,set0一般是顶点buffer,gl_Position告诉 GPU 顶点的位置。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐