![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
vulkan
文章平均质量分 74
祝太勇
一蓑烟雨任平生
展开
-
vulkan-队列族
Vulkan 的几乎所有操作,从绘制到加载纹理都需要将操作指令提交给一个队列,然后才能执行。Vulkan 有多种不同类型的队列,它们属于不同的队列族,每个队列族的队列只允许执行特定的一部分指令。比如,可能存在只允许执行计算相关指令的队列族和只允许执行内存传输相关指令的队列族。我们需要检测设备支持的队列族,以及它们中哪些支持我们需要使用的指令。为了完成这一目的,我们添加了一个叫做 findQueueFamilies 的函数,这一函数会查找出满足我们需求的队列族。目前而言,我们需要的队列族只需要原创 2022-01-17 15:16:43 · 176 阅读 · 0 评论 -
vulkan-校验层
校验层是什么?Vulkan API 的设计是紧紧围绕最小化驱动程序开销进行的,所以,默认情况下,Vulkan API 提供的错误检查功能非常有限。很多很基本的错误都没有被 Vulkan 显式地处理,遇到错误程序会直接崩溃或者发生未被明确定义的行为。Vukan 需要我们显式地定义每一个操作,所以就很容易在使用过程中产生一些小错误,比如使用了一个新的 GPU 特性,却忘记在逻辑设备创建时请求这一特性。然而,这并不意味着我们不能将错误检查加入 API 调用。Vulkan 引入了校验层来优雅地解原创 2022-01-17 15:00:52 · 156 阅读 · 0 评论 -
vulkan-实例
VkApplicationInfo appInfo{};appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;appInfo.pApplicationName = "Hello Triangle";appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);appInfo.pEngineName = "No Engine";appInfo.engineVersion = VK_MAKE_VER原创 2022-01-17 14:35:35 · 153 阅读 · 0 评论 -
vulkan杂记-描述符池和描述符集
上一章我们介绍了用于描述可以绑定的描述符类型的描述符布局。在这一章节,我们为每一个 vkBuffer 创建描述符集,将其和 uniform 缓冲描述符进行绑定。描述符池描述符集不能被直接创建,需要通过描述符池来分配。我们添加一个叫做 createDescriptorPool 的函数来进行描述符池的创建:描述符集不能被直接创建,需要通过描述符池来分配。我们通过 VkDescriptorPoolSize 结构体来对描述符池可以分配的描述符集进行定义:VkDescriptorPoolSi原创 2022-01-12 15:07:08 · 237 阅读 · 0 评论 -
vulkan杂记-描述符布局
我们已经可以传递顶点属性给顶点着色器,但对于一些所有顶点都共享的属性,比如顶点的变换矩阵,将它们作为顶点属性为每个顶点都传递一份显然是非常浪费的。Vulkan 提供了资源描述符来解决这一问题。描述符是用来在着色器中访问缓冲和图像数据的一种方式。我们可以将变换矩阵存储在一个缓冲中,然后通过描述符在着色器中访问它。使用描述符需要进行下面三部分的设置:• 在管线创建时指定描述符布局• 从描述符池分配描述符集• 在渲染时绑定描述符集描述符布局用于指定可以被管线访问的资源类型,类似渲染原创 2022-01-12 10:35:49 · 249 阅读 · 0 评论 -
vulkan杂记-暂存缓冲
上一篇中,我们的顶点缓冲使用的内存类型并不是适合显卡读取的最佳内存类型。最适合显卡读取的内存类型具有 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT 标记,含有这一标记的内存类型通常 CPU 无法直接访问。在本章节,我们会创建两个顶点缓冲。一个用于 CPU 加载数据,一个用于显卡设备读取数据。我们通过缓冲复制指令将 CPU 加载到的缓冲中的数据复制到显卡可以快速读取的缓冲中去。传输队列缓 冲 复 制 指 令 需 要 提 交 给 支 持 传 输 操 作 的原创 2022-01-12 09:20:29 · 105 阅读 · 0 评论 -
vulkan杂记-顶点缓存
Vulkan 的缓冲是可以存储任意数据的可以被显卡读取的内存。和之前我们见到的 Vulkan 对象不同,缓冲对象并不自动地为它们自己分配内存。填写 VkBufferCreateInfo 结构体:VkBufferCreateInfo b u f f e r I n f o = {};b u f f e r I n f o . sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;bufferInfo . size = sizeof ( vertices [原创 2022-01-11 13:40:22 · 156 阅读 · 0 评论 -
vulkan杂记-子流程依赖
渲染流程的子流程会自动进行图像布局变换。这一变换过程由子流程的依赖所决定。子流程的依赖包括子流程之间的内存和执行的依赖关系。虽然我们现在只使用了一个子流程,但子流程执行之前和子流程执行之后的操作也被算作隐含的子流程。在 渲 染 流 程 开 始 和 结 束 时 会 自 动 进 行 图 像 布 局 变 换,但 在 渲 染 流程 开 始 时 进 行 的 自 动 变 换 的 时 机 和 我 们 的 需 求 不 符, 变 换 发 生 在 管线 开 始 时,但 那 时 我 们 可 能 还 没原创 2022-01-10 14:28:32 · 298 阅读 · 0 评论 -
vulkan杂记-信号量
drawFrame 函数用于执行下面的操作:• 从交换链获取一张图像• 对帧缓冲附着执行指令缓冲中的渲染指令• 返回渲染后的图像到交换链进行呈现操作上面这些操作每一个都是通过一个函数调用设置的, 但每个操作的实际执行却是异步进行的。函数调用会在操作实际结束前返回,并且操作的实际执行顺序也是不确定的。而我们需要操作的执行能按照一定的顺序,所以就需要进行同步操作。栅栏 (fence) 和信号量 (semaphore) 的不同之处是,我们可以通过调用 vkWaitForFences原创 2022-01-10 14:19:05 · 149 阅读 · 0 评论 -
vulkan杂记-栅栏fence
栅栏 (fence) 和信号量 (semaphore) 类似,可以用来发出信号和等待信号。我们为每一帧创建一个 VkFence 对象:s t d : : v e c t o r <VkSemaphore> imageAvailableSemaphores ;2s t d : : v e c t o r <VkSemaphore> renderFinishedSemaphores ;3s t d : : v e c t o r <VkFence> i n F l原创 2022-01-10 13:57:49 · 293 阅读 · 0 评论