Vulkan Cookbook
JavinYang
这个作者很懒,什么都没留下…
展开
-
Vulkan Cookbook 前言
前言计算机图形学有着悠久而有趣的历史。许多API或自定义方法来生成2D或3D图像已经过时了。这一历史中的一个里程碑是OpenGL的发明,OpenGL是最早的图形库之一,它允许我们创建实时,高性能的3D图形,并且可供多个操作系统上的每个人使用。它至今仍在开发和广泛使用。今年我们可以庆祝它的25岁生日!但自OpenGL创建以来,许多事情都发生了变化。图形硬件行业正在快速发展。最近,为了适应这些变...翻译 2018-10-15 11:42:34 · 748 阅读 · 0 评论 -
Vulkan Cookbook 第一章 2 启用验证层
启用验证层Vulkan API的设计考虑了性能。提高其性能的一种方法是降低驱动程序执行的状态和错误检查。这是Vulkan被称为“瘦API”或“瘦驱动程序”的原因之一,它是硬件的最小抽象,这是API可跨多个硬件供应商和设备类型(高性能桌面)计算机,移动电话以及低功耗嵌入式系统。但是,与传统的高级API(如OpenGL)相比,这种方法使得使用Vulkan API创建应用程序变得更加困难。这是因...翻译 2018-10-15 11:46:41 · 1548 阅读 · 6 评论 -
Vulkan Cookbook 第一章 实例与设备 1 下载Vulkan SDK
实例与设备在本章中,我们将介绍以下内容:译者总结篇下载Vulkan SDK启用验证层连接Vulkan Loader库准备加载Vulkan API函数从Vulkan Loader库加载导出函数加载全局级函数检查可用实例扩展创建Vulkan实例加载实例级函数枚举可用的物理设备检查可用的设备扩展获取物理设备的功能和属性检查可用的队列族及其属性选择具有期望能力的队列族的索引创建逻辑设备加载设备级函数...翻译 2018-10-15 11:44:26 · 1695 阅读 · 0 评论 -
Vulkan Cookbook 第一章 3 连接Vulkan Loader库
连接Vulkan Loader库译者注:示例代码点击此处对Vulkan API的支持由图形硬件供应商实现,并通过图形驱动程序提供。每个供应商都可以在他们选择的任何动态库中实现它,甚至可以通过驱动程序更新来更改它。这就是为什么和驱动程序一起安装Vulkan Loader的原因。我们也可以从安装SDK的文件夹中安装它。它允许开发人员通过Windows操作系统上的vulkan-1.dll库或L...翻译 2018-10-15 12:24:01 · 2376 阅读 · 0 评论 -
Vulkan Cookbook 第一章 4 准备加载Vulkan API函数
准备加载Vulkan API函数译者注:示例代码点击此处当我们想在我们的应用程序中使用Vulkan API时,我们需要获取Vulkan文档中指定的过程。为了做到这一点,我们可以向Vulkan Loader库添加一个依赖项,在我们的项目中静态链接它,并使用vulkan.h头文件中定义的函数原型。第二种方法是禁用vulkan.h头文件中定义的函数原型,并在我们的应用程序中动态加载函数指针。第...翻译 2018-10-15 16:56:19 · 1100 阅读 · 0 评论 -
Vulkan Cookbook 第一章 15 创建逻辑设备
创建逻辑设备译者注:示例代码点击此处逻辑设备是在我们的应用程序中创建的最重要的对象之一。它代表从真正的硬件启用的所有扩展、特性以及队列的抽象:逻辑设备允许我们执行通常在渲染应用程序中完成的所有工作,例如创建图像和缓冲区、设置管道状态或加载着色器。 它给我们最重要的能力是记录命令(例如分配绘制调用或调度计算工作)并将它们提交给队列,由给定的硬件执行和处理它们。执行此类操作后,我们将获...翻译 2018-10-19 10:57:00 · 504 阅读 · 0 评论 -
Vulkan Cookbook 第一章 5 从Vulkan Loader库加载导出函数
从Vulkan Loader库加载导出函数译者注:示例代码点击此处加载(连接)Vulkan Loader库时,我们需要加载它的函数,以便在应用程序中使用Vulkan API。不幸的是,不同的操作系统有不同的方法来获取从动态库导出的函数的地址(Windows上的.dll文件或Linux上的.so文件)。然而Vulkan API在许多操作系统上都是可移植的。因此,为了允许开发人员加载API中可...翻译 2018-10-16 07:14:15 · 887 阅读 · 0 评论 -
Vulkan Cookbook 第一章 6 加载全局级函数
加载全局级函数译者注:示例代码点击此处我们已经获得了vkGetInstanceProcAddr()函数,通过这个函数,我们可以以独立于OS的方式加载所有其他Vulkan API入口点。Vulkan函数可分为全局函数、实例函数和设备函数三个层次。设备级函数用于执行典型的操作,如绘图、着色器模块创建、图像创建或数据复制。实例级函数允许我们创建逻辑设备。要加载设备和实例级函数,我们需要创建一...翻译 2018-10-16 08:58:27 · 885 阅读 · 0 评论 -
Vulkan Cookbook 第一章 7 检查可用实例扩展
检查可用实例扩展译者注:示例代码点击此处Vulkan Instance收集应用程序状态,并允许我们创建逻辑设备,几乎所有的操作都在该逻辑设备上执行。在创建实例对象之前,我们应该考虑要启用的实例级扩展。其中一个最重要的实例级扩展是交换链相关扩展,用于在屏幕上显示图像。与OpenGL相反,Vulkan中的扩展是显式启用的。我们不能创建不支持的Vulkan实例和请求扩展,因为实例创建操作将失...翻译 2018-10-16 09:52:39 · 435 阅读 · 0 评论 -
Vulkan Cookbook 第一章 8 创建Vulkan实例
创建Vulkan实例译者注:示例代码点击此处Vulkan实例是一个收集应用程序状态的对象。它包含诸如应用程序名称、引擎的名称和版本之类的信息,或启用实例级扩展和层。通过实例,我们还可以枚举可用的物理设备并创建逻辑设备,在这些逻辑设备上执行典型的操作,例如图像创建或绘图。因此,在使用Vulkan API之前,我们需要创建一个新的实例对象。怎么做...1.准备一个名为desired...翻译 2018-10-16 12:41:05 · 824 阅读 · 0 评论 -
Vulkan Cookbook 第一章 9 加载实例级函数
加载实例级函数译者注:示例代码点击此处我们创建了一个Vulkan Instance对象。 下一步是枚举物理设备,选择其中一个,然后从中创建逻辑设备。 这些操作是使用实例级函数执行的,我们需要从中获取地址。怎么做...1.获取之前创建的Vulkan Instance的句柄,是名为instance的VkInstance类型变量。2.选择要添加的实例级函数的名称(表示为<func...翻译 2018-10-16 16:42:35 · 418 阅读 · 0 评论 -
Vulkan Cookbook 第一章 16 加载设备级函数
加载设备级函数译者注:示例代码点击此处我们已经创建了一个逻辑设备,可以在其上执行任何所需的操作,例如渲染3D场景,计算游戏中对象的碰撞或处理视频帧。 这些操作是使用设备级功能执行的,但在我们获取它们之前它们不可用。怎么做...1.获取已创建的逻辑设备对象的句柄,将其储存在名为logical_device的VkDevice类型中。2.选择要加载的设备函数的名称(表示为<fun...翻译 2018-10-19 14:18:06 · 563 阅读 · 0 评论 -
Vulkan Cookbook 第一章 10 枚举可用的物理设备
枚举可用的物理设备译者注:示例代码点击此处Vulkan中的几乎所有工作都是在逻辑设备上执行的:我们在它们上创建资源,管理内存,记录从它们创建的命令缓冲区,并提交命令以便处理它们的队列。 在我们的应用程序中,逻辑设备代表启用了一组功能和扩展的物理设备。 要创建逻辑设备,需要选择给定硬件平台上一个可用的物理设备。可是我们如何知道给定计算机上有多少物理设备可用呢?着需要枚举它们。怎么做......翻译 2018-10-16 19:12:42 · 335 阅读 · 0 评论 -
Vulkan Cookbook 第一章 11 检查可用的设备扩展
检查可用的设备扩展译者注:示例代码点击此处我们想要使用的一些Vulkan功能要求我们明确启用某些扩展(与OpenGL相反,其中扩展是自动/隐式启用的)。 扩展有两种或两种级别:实例级和设备级。 与实例扩展类似,在逻辑设备创建期间启用设备扩展。 如果某个物理设备不支持设备扩展,或者我们无法为其创建逻辑设备,则不能要求设备扩展。 因此,在我们开始创建逻辑设备之前,我们需要确保给定物理设备支持所...翻译 2018-10-16 20:47:47 · 394 阅读 · 0 评论 -
Vulkan Cookbook 第一章 17 获取设备队列
获取设备队列译者注:示例代码点击此处在Vulkan中,为了利用给定设备的处理能力,需要向设备的队列提交操作。 队列不是由应用程序显式创建的。 在设备创建期间请求它们:检查可用的族和每个族包含的队列数。 我们只能询问现有队列族中可用队列,并且我们不能请求比给定族暴露更多的队列。请求的队列与逻辑设备一起自动创建。 我们不管理和创建它们。 也不能摧毁它们,它们会随逻辑设备一起销毁。 要使用它们...翻译 2018-10-19 15:22:41 · 343 阅读 · 0 评论 -
Vulkan Cookbook 第一章 18 使用几何着色器,图形和计算队列创建逻辑设备
使用几何着色器,图形和计算队列创建逻辑设备译者注:示例代码点击此处在Vulkan中,当我们创建各种对象时,需要准备许多描述创建过程本身的不同结构体,但是它们也可能需要创建其他对象。逻辑设备也不例外:我们需要枚举物理设备,检查它们的属性和支持的队列族,并准备一个需要更多信息的VkDeviceCreateInfo结构。为了组织这些操作,我们将提供一个示例,用于从支持几何着色器,图形和计算队...翻译 2018-10-20 11:07:45 · 357 阅读 · 0 评论 -
Vulkan Cookbook 第一章 12 获取物理设备的功能和属性
获取物理设备的功能(Features)和属性怎么做...当我们创建一个支持Vulkan的应用程序时,它可以在许多不同的设备上执行。它可能是台式电脑、笔记本或手机。每个这样的设备具有不同的配置,并且提供不同性能不同图形硬件。给定的计算机可以安装多个图形卡。因此,为了找到适合我们需求的设备,并且能够执行我们想在代码中实现的操作,我们不仅应该检查有多少设备,而且为了能够正确地选择其中之一,我们需...翻译 2018-10-17 14:53:51 · 982 阅读 · 0 评论 -
Vulkan Cookbook 第一章 13 检查可用的队列族及其属性
检查可用的队列族及其属性译者注:示例代码点击此处在Vulkan中,当我们想要在硬件上执行操作时,我们将它们提交给队列。 单个队列中的操作将按照提交的顺序一个接一个地处理 - 这就是它被称为队列的原因。 但是,提交到不同队列的操作是独立处理的(如果需要,我们可以同步它们):不同的队列可以代表硬件的不同部分,因此可以支持不同类型的操作。 并非所有操作都可以在所有队列上执行。具有相同操作...翻译 2018-10-17 18:35:38 · 345 阅读 · 0 评论 -
Vulkan Cookbook 第一章 14 选择具有期望能力的队列族的索引
选择具有期望能力的队列族的索引译者注:示例代码点击此处在创建逻辑设备之前,我们需要考虑要在其上执行什么操作,因为这将影响到我们需要请求哪些队列族。对于简单的事例,单个支持图形操作功能的族就应该足够了。更高级的场景将需要支持图形和计算操作功能,或者需要额外的传输队列来进行非常快速的内存复制。在本小节中,我们将研究如何搜索支持所需的队列族。怎么做...1.获取vkEnumera...翻译 2018-10-18 14:22:15 · 230 阅读 · 0 评论 -
Vulkan Cookbook 第一章 19 销毁逻辑设备
销毁逻辑设备译者注:示例代码点击此处在我们完成并且想要退出应用程序时,应该自己清理。 尽管在Vulkan实例被销毁时驱动程序应自动销毁所有资源,但我们也应该在应用程序中明确地执行此操作以遵循良好的编程习惯。 销毁资源的顺序应与创建它们的顺序相反。提示:资源应该按照其创造的相反顺序释放。在本章中,逻辑设备是最后创建的对象,因此它将首先被销毁。怎么做...1.获取已创建并储存在...翻译 2018-10-20 15:25:01 · 296 阅读 · 0 评论 -
Vulkan Cookbook 第一章 20 摧毁Vulkan实例
摧毁Vulkan实例译者注:示例代码点击此处在所有其他资源被销毁之后,我们可以销毁Vulkan实例。怎么做...1.获取已创建并储存在名为instance的VkInstance类型变量中的实例句柄。2.调用vkDestroyInstance( instance, nullptr),第一个参数传入instance,第二个参数为nullptr。3.出于安全原因,请将VK_NULL_...翻译 2018-10-20 15:46:01 · 227 阅读 · 0 评论 -
Vulkan Cookbook 第一章 21 释放Vulkan Loader库
释放Vulkan Loader库译者注:示例代码点击此处必须显式关闭(释放)动态加载的库。 为了能够在我们的应用程序中使用Vulkan,我们打开了Vulkan Loader(Windows上的vulkan-1.dll库或Linux上的libvulkan.so.1库)。 因此,在我们关闭应用程序之前,我们应该释放它。怎么做...在Windows操作系统上: 1.获取名为vul...翻译 2018-10-20 15:58:03 · 620 阅读 · 0 评论 -
Vulkan Cookbook 第一章 译者总结篇
本篇对第一章进行总结。要想使用Vulkan进行计算,必须使用队列(Queue)来提交命令。为了得到我们想要的队列,需要先创建或启用一些东西。顺序是:实例->物理设备->逻辑设备->队列族->队列。拿到队列前每个部分都要经过三个步骤: 查找->选择->创建/获取实例: 查找:在Vulkan Loader库中查找所有支持的实例功能(扩展信息)。...原创 2018-10-21 12:54:13 · 500 阅读 · 0 评论 -
Vulkan Cookbook 第二章 2 创建表示表面
创建表示表面译者注:示例代码点击此处演示表面表示应用程序的窗口。 它允许我们获取窗口的参数,例如尺寸,支持的颜色格式,所需的图像数量或演示模式。 它还允许我们检查给定的物理设备是否能够在给定窗口中显示图像。这就是为什么,在我们想要在屏幕上显示图像的情况下,我们需要首先创建一个表面,因为它将帮助我们选择适合我们需求的物理设备。做好准备要创建表示表面,我们需要提供应用程序窗口的参数。...翻译 2018-10-25 14:01:28 · 413 阅读 · 0 评论 -
Vulkan Cookbook 第二章 图像演示
图像演示在本章中我们将介绍以下内容:创建启用了WSI扩展的Vulkan实例创建表示表面选择支持给定表面呈现的队列族创建启用了WSI扩展的逻辑设备选择期望的呈现模式获得呈现表面的功能选择一些交换链图像选择交换链图像的大小选择交换链图像的所需使用场景选择交换链图像的转换选择交换链图像的格式创建交换链获取交换链图像的句柄使用R8G8B8A8格式和邮箱呈现模式创建交换链获取交换链图像呈现一个图像销毁交...翻译 2018-10-21 15:21:28 · 273 阅读 · 0 评论 -
Vulkan Cookbook 第二章 1 创建启用了WSI扩展的Vulkan实例
创建启用了WSI扩展的Vulkan实例译者注:示例代码点击此处为了能够在屏幕上正确显示图像,我们需要启用一组WSI扩展。 它们分为实例级和设备级,具体取决于它们引入的功能。 第一步是创建一个Vulkan实例,其中包含一组启用的扩展,允许我们创建一个表示表面 - 应用程序窗口的Vulkan表示。怎么做...在windows操作系统上:1.准备一个名为instance的VkInsta...翻译 2018-10-23 08:16:04 · 979 阅读 · 0 评论 -
Vulkan Cookbook 第二章 3 选择支持给定表面呈现的队列族
选择支持给定表面呈现(presentation)的队列族译者注:示例代码点击此处通过向设备的队列提交特殊命令来执行在屏幕上显示图像。 我们无法使用任意队列显示图像,因为它可能不受支持。 图像呈现以及图形,计算,传输和稀疏操作是队列族的另一个属性。 与所有类型的操作类似,并非所有队列都支持它,更重要的是,甚至并非所有设备都支持它。 这就是为什么我们需要检查哪个物理设备允许我们在屏幕上显示图像...翻译 2018-10-26 19:00:17 · 189 阅读 · 0 评论 -
Vulkan Cookbook 第二章 4 创建启用了WSI扩展的逻辑设备
创建启用了WSI扩展的逻辑设备译者注:示例代码点击此处当我们创建一个启用了WSI扩展的实例并找到支持图像显示的队列族时,是时候创建一个逻辑设备了。 设备级WSI扩展允许我们创建交换链。 这是由呈现引擎管理的图像集合。 为了使用这些图像中的任何一个并将其渲染到它们中,我们需要获取它们。 完成后,再将其返回到呈现引擎(译者注:显示出来)。 此操作称为呈现,它通知驱动程序我们要向用户显示图像。 ...翻译 2018-10-30 15:02:32 · 321 阅读 · 0 评论 -
Vulkan Cookbook 第二章 7 选择一些交换链图像
选择一些交换链图像译者注:示例代码点击此处当应用程序想要渲染到交换链图像时,必须从呈现引擎获取它。 应用程序可以获取更多图像; 我们不仅限于一次只有一个图像。 但是,可用的图像数量(在给定时间由呈现引擎未使用)取决于指定的呈现模式,应用程序的当前情况(呈现/呈现历史记录)和图像数量 - 当我们创建交换链时, 我们必须指定应该创建的(最小)图像数量。怎么做...1.获取呈现表面功能(...翻译 2018-11-03 11:57:27 · 259 阅读 · 0 评论 -
Vulkan Cookbook 第二章 8 选择交换链图像的大小
选择交换链图像的大小译者注:示例代码点击此处通常,为交换链创建的图像应该适合应用程序的窗口。 支持的尺寸应该可在呈现表面的功能中使用。 但在某些操作系统上,图像的大小定义了窗口的最终大小。 我们还应该牢记这一点,并检查交换链图像的适当尺寸。怎么做...1.获取呈现表面的功能(请参阅获得呈现表面的功能)。将他们储存在名为surface_capabilities的VkSurfaceCa...翻译 2018-11-03 14:54:50 · 250 阅读 · 0 评论 -
Vulkan Cookbook 第二章 9 选择交换链图像的所需使用场景
选择交换链图像的所需使用场景译者注:示例代码点击此处使用交换链创建的图像通常用作颜色附件。 这意味着我们想要渲染它们(将它们用作渲染目标)。 但我们并不仅限于这种情况。 我们可以将交换链图像用于其他目的 - 可以从中进行采样,将它们用作复制操作中的数据源,或将数据复制到其中。 这些都是不同的图像用法,可以在交换链创建过程中指定它们。 但是,我们需要再次检查这些用法是否得到支持。怎么做....翻译 2018-11-03 15:37:31 · 222 阅读 · 0 评论 -
Vulkan Cookbook 第二章 10 选择交换链图像的转换
选择交换链图像的转换在某些(特别是移动)设备上,可以从不同的方向查看图像。有时希望能够指定图像在屏幕上显示的方向。在Vulkan中我们有这样的可能性。创建交换链时,需要指定在呈现图像之前应该用于图像的转换。译者注:示例代码点击此处怎么做...1.获取呈现表面的功能(请参阅呈现表面的功能)。将它们储存在名为surface_capabilities的VkSurfaceCapabilit...翻译 2018-11-03 16:00:21 · 250 阅读 · 0 评论 -
Vulkan Cookbook 第二章 11 选择交换链图像的格式
选择交换链图像的格式译者注:示例代码点击此处格式定义颜色分量的数量,每个组件的位数以及使用的数据类型。 在交换链创建期间,我们必须指定是否要使用带或不带alpha分量的红色,绿色和蓝色通道,是否应使用无符号整数或浮点数据类型对颜色值进行编码,以及它们的精度是什么。 我们还必须选择是否使用线性或非线性颜色空间对颜色值进行编码。 但与其他交换链参数一样,我们只能使用呈现表面支持的值。做好准...翻译 2018-11-03 17:25:43 · 374 阅读 · 0 评论 -
Vulkan Cookbook 第二章 12 创建交换链
创建交换链译者注:示例代码点击此处交换链用于在屏幕上显示图像。他是一组图像,可以由应用程序获取,然后在我们的应用程序窗口中显示。每个图像都具有相同的已定义属性集。当我们准备好所有这些参数时,意味着我们为交换链图像选择了数量,大小,格式和使用场景,并且还获取并选择了一种可用的呈现模式,我们就可以创建交换链了。怎么做...1.获取已创建的逻辑设备对象的句柄。将其储存在名为logical...翻译 2018-11-04 15:12:01 · 346 阅读 · 0 评论 -
Vulkan Cookbook 第三章 1 创建命令池
创建命令池译者注:示例代码点击此处命令池是命令缓冲区获取内存的对象。内存本身是隐式并动态分配的,但如果没有它,命令缓冲区将没有任何存储空间来保存记录的命令。这就是为什么在我们分配命令缓冲区之前首先需要为它们创建一个内存池。怎么做...1.创建一个名为logical_device的VkDevice类型变量,并使用创建的逻辑设备句柄对其进行初始化。2.获取为逻辑设备逻辑设备请求的其中...翻译 2018-11-09 15:43:07 · 433 阅读 · 0 评论 -
Vulkan Cookbook 第三章 2 分配命令缓冲区
分配命令缓冲区译者注:示例代码点击此处命令缓冲区用于储存(记录)稍后提交给队列的命令,它们位于队列中由硬件执行处理后给我们结果。当我们创建命令池时,可以用它们来分配命令缓冲区。怎么做...1.获取已创建逻辑设备的句柄,并将其储存在名为logical_device的VkDevice类型变量中。2.获取命令池的句柄并使用它们来初始化名为command_pool的VkCommandPo...翻译 2018-11-09 16:15:58 · 273 阅读 · 0 评论 -
Vulkan Cookbook 第二章 13 获取交换链图像的句柄
获取交换链图像的句柄译者注:示例代码点击此处创建交换链对象时,获取与交换链一起创建的所有图像的数量和句柄可能非常有用。怎么做...1.获取已创建的逻辑设备句柄。将其储存在名为logical_device的VkDevice类型变量中。2.将创建的交换链的句柄分配给名为swapchain的VkSwapchainKHR类型变量。3.创建名为images_count的uint32_t类...翻译 2018-11-04 15:53:16 · 337 阅读 · 0 评论 -
Vulkan Cookbook 第二章 14 使用R8G8B8A8格式和邮箱呈现模式创建交换链
使用R8G8B8A8格式和邮箱呈现模式创建交换链译者注:示例代码点击此处要创建交换链,需要获取大量附加信息并准备想到多的参数。为了呈现准备阶段所需的所有步骤的顺序以及如何使用所获得的信息,我们将创建我们选择参数的交换链。为此,将设置一个邮箱呈现模式,最常用的R8G8B8A8颜色格式,带有无符号标准化值(类似OpenGL的RGBA8格式),无变换和标准颜色附件图像用法。怎么做...1...翻译 2018-11-04 21:32:55 · 1181 阅读 · 0 评论 -
Vulkan Cookbook 第二章 5 选择期望的呈现模式
选择期望的呈现模式译者注:示例代码点击此处在屏幕上显示图像的能力是Vulkan交换链的最重要特征之一 - 事实上,它是交换链的设计目的。 在OpenGL中,当我们完成渲染到后台缓冲区时,只是用前缓冲区切换它,渲染的图像显示在屏幕上。 我们只能确定是否要显示图像以及消隐间隔(如果我们想要启用v-sync)。在Vulkan中,不仅限于我们可以渲染的一个图像(后缓冲区)。 并且,我们可以选择在...翻译 2018-11-02 23:25:00 · 380 阅读 · 0 评论 -
Vulkan Cookbook 第二章 6 获得呈现表面的功能
获得呈现表面的功能译者注:示例代码点击此处当我们创建交换链时,需要指定创建参数。 必须提供符合支持限制的值, 但我们并不清楚这些值。它们可以从呈现表面获得。 因此,为了正确创建交换链,我们需要获取表面的功能。怎么做...1.使用vkEnumeratePhysicalDevices()函数获取所有枚举的物理设备句柄,并将其存储在名为physical_device的VkPhysical...翻译 2018-11-03 10:44:49 · 243 阅读 · 0 评论