Vulkan 学习笔记一

【ZeloEngine】OpenGL升级Vulkan Vulkan的资料有很多,这里以GDC2016中nvidia的slide作为讨论的基础下文中Vulkan简称vk。 阅读详情

Vulkan的起源

就像以前的图形API一样,Vulkan被设计为基于GPU的跨平台抽象。这些API的大多数问题在于,在设计API的时代就采用了图形硬件,而图形硬件大多仅限于可配置的固定功能。程序员必须以标准格式提供顶点数据,并且在照明和阴影选项方面受GPU制造商的支配。

随着图形卡体系结构的成熟,它们开始提供越来越多的可编程功能。所有这些新功能都必须以某种方式与现有API集成在一起。这导致不够理想的抽象,并且在图形驱动程序方面进行了大量猜测,以将程序员的意图映射到现代图形体系结构。这就是为什么要进行如此多的驱动程序更新以提高游戏性能的原因,有时甚至是很大的幅度。由于这些驱动程序的复杂性,应用程序开发人员还需要处理供应商之间的不一致问题,例如着色器接受的语法 。除了这些新功能,过去十年来还涌现了具有强大图形硬件的移动设备。这些移动GPU根据其能源和空间要求具有不同的体系结构。一个这样的示例就是平铺渲染,它可以通过为程序员提供对该功能的更多控制权来提高性能。源自这些API的时代的另一个限制是有限的多线程支持,这可能会导致CPU方面的瓶颈。

Vulkan通过从头开始设计用于现代图形体系结构来解决这些问题。通过允许程序员使用更详细的API明确指定其意图,它减少了驱动程序开销,并允许多个线程并行创建和提交命令。通过使用单个编译器切换到标准字节代码格式,它可以减少着色器编译中的不一致。最后,它通过将图形和计算功能统一为一个API来认可现代图形卡的通用处理能力。

说白了Vulkan 支持多线程。或者说对多线程的支持度跟高。

画一个三角形需要什么

步骤1-实例和物理设备选择

Vulkan应用程序首先通过来设置Vulkan API VkInstance。通过描述您的应用程序和将要使用的所有API扩展来创建实例。创建实例后,您可以查询Vulkan支持的硬件,并选择一个或多个***VkPhysicalDevice***用于操作。您可以查询诸如VRAM大小和设备功能之类的属性以选择所需的设备,例如更喜欢使用专用的图形卡。

步骤二-逻辑设备和队列系列

选择正确的硬件设备后,您需要创建一个VkDevice (逻辑设备),在其中更具体地描述 VkPhysicalDeviceFeatures将要使用的设备,例如多视口渲染和64位浮点数。您还需要指定要使用的队列系列。通过Vulkan执行的大多数操作(例如绘制命令和内存操作)都可以通过将其提交给对象来异步执行VkQueue。队列是从队列族分配的,每个队列族在其队列中支持一组特定的操作。例如,可能有用于图形,计算和内存传输操作的单独队列系列。队列系列的可用性也可以用作物理设备选择的区别因素。支持Vulkan的设备有可能不提供任何图形功能,但是当今所有具有Vulkan支持的图形卡通常都将支持我们感兴趣的所有队列操作。

步骤三 - 窗户表面和交换链

除非您只对屏幕外渲染感兴趣,否则将需要创建一个窗口来呈现渲染的图像。可以使用本机平台API或GLFW和SDL之类的库来创建Windows 。在本教程中,我们将使用GLFW,但在下一章中将详细介绍。

我们还需要两个组件才能实际渲染到窗口:窗口表面(VkSurfaceKHR)和交换链(VkSwapchainKHR)。请注意KHR后缀,这意味着这些对象是Vulkan扩展的一部分。Vulkan API本身与平台完全无关,这就是为什么我们需要使用标准化的WSI(窗口系统接口)扩展与窗口管理器进行交互的原因。该表面是要渲染到的窗口上的跨平台抽象,通常通过提供对本机窗口句柄的引用(例如HWND在Windows上)来实例化。幸运的是,GLFW库具有内置函数来处理特定于平台的细节。

交换链是渲染目标的集合。其基本目的是确保我们当前要渲染的图像与屏幕上当前的图像不同。确保仅显示完整的图像非常重要。每次我们要绘制框架时,我们都必须要求交换链为我们提供要渲染的图像。当我们完成绘制框架时,图像将返回到交换链,以便在某些时候显示在屏幕上。用于将完成的图像呈现到屏幕的渲染目标的数量和条件取决于当前模式。当前常见的模式是双缓冲(vsync)和三缓冲。我们将在交换链创建一章中对此进行研究。

某些平台允许您直接渲染到显示器,而无需通过VK_KHR_display和VK_KHR_display_swapchain扩展名与任何窗口管理器进行交互。这些使您可以创建代表整个屏幕的表面,并且可以用于实现自己的窗口管理器。

步骤四 - 图像视图和帧缓冲区

要绘制从交换链获取的图像,我们必须将其包装到 VkImageView和中VkFramebuffer。图像视图引用要使用的图像的特定部分,而帧缓冲区引用要用于颜色,深度和模板目标的图像视图。由于交换链中可能有许多不同的图像,因此我们将抢先为其创建图像视图和帧缓冲区,并在绘制时选择正确的图像视图和帧缓冲区。

步骤五 - 渲染过程

Vulkan中的渲染过程描述了渲染操作期间使用的图像类型,将如何使用它们以及应该如何对待它们的内容。在我们最初的三角形渲染应用程序中,我们将告诉Vulkan,我们将使用单个图像作为颜色目标,并希望在绘制操作之前将其清除为纯色。渲染过程仅描述图像的类型,而VkFramebuffer实际上将特定图像绑定到这些插槽。

步骤六 - 图形管道

Vulkan中的图形管道是通过创建VkPipeline对象来设置的。它描述了图形卡的可配置状态,例如视口大小和深度缓冲区操作以及使用VkShaderModule 对象的可编程状态。该VkShaderModule对象从着色器字节代码创建的。驱动程序还需要知道管道中将使用哪些渲染目标,我们通过引用渲染过程来指定这些目标。

与现有API相比,Vulkan最显着的功能之一就是几乎所有图形管道配置都需要预先设置。这意味着,如果要切换到其他着色器或稍微更改顶点布局,则需要完全重新创建图形管线。这意味着VkPipeline您必须为渲染操作所需的所有不同组合预先创建许多对象。只能动态更改某些基本配置,例如视口大小和清晰的颜色。还需要明确描述所有状态,例如,没有默认的颜色混合状态。

好消息是,由于您要进行的是提前编译与即时编译等效,因此驱动程序有更多的优化机会,并且运行时性能更可预测,因为大型状态更改(例如切换到不同的图形管道变得非常明确。

步骤七 - 命令池和命令缓冲区

如前所述,我们要在Vulkan中执行的许多操作(例如绘图操作)都需要提交到队列中。这些操作首先需要记录到中,VkCommandBuffer然后才能提交。这些命令缓冲区是从VkCommandPool与特定队列系列相关联的分配的。要绘制一个简单的三角形,我们需要使用以下操作记录命令缓冲区:

  1. 开始渲染过程
  2. 绑定图形管道
  3. 绘制3个顶点
  4. 结束渲染过程

由于帧缓冲区中的图像取决于交换链将为我们提供的特定图像,因此我们需要为每个可能的图像记录一个命令缓冲区,并在绘制时选择正确的图像。另一种方法是每帧再次记录命令缓冲区,效率不高。

步骤八 - 主循环

现在,绘图命令已经包装到命令缓冲区中,主循环非常简单。我们首先使用来从交换链获取图像vkAcquireNextImageKHR。然后,我们可以为该图像选择适当的命令缓冲区并使用来执行它vkQueueSubmit。最后,我们将图片返回到交换链,以使用呈现在屏幕上vkQueuePresentKHR。

提交到队列的操作是异步执行的。因此,我们必须使用诸如信号量之类的同步对象来确保正确的执行顺序。必须设置绘制命令缓冲区的执行以等待图像获取完成,否则可能会发生我们开始渲染到仍在读取以在屏幕上呈现的图像的情况。将 vkQueuePresentKHR依次调用需要等待渲染完成,为此,我们将使用正在呈现完成后,标志着一个第二旗语。

总结:

简而言之,要绘制第一个三角形,我们需要:

  • 创建一个 VkInstance
  • 选择支持的图形卡(VkPhysicalDevice)
  • 创建VkDevice和VkQueue用于绘图和演示
  • 创建窗户,窗户表面和交换链
  • 将交换链图像包装到 VkImageView
  • 创建一个渲染通道,以指定渲染目标和用途
  • 为渲染过程创建帧缓冲区
  • 设置图形管道
  • 使用绘制命令为每个可能的交换链映像分配和记录命令缓冲区
  • 通过获取图像,提交正确的绘制命令缓冲区并将图像返回到交换链来绘制框架

这一篇都是网上下载的废话,其实可以不用细看,但是得过一遍,有一个大概的了解就好了。

Vulkan研究一:概述Vulkan的使用流程 Vulkan的初始化过程始于创建一个Vulkan实例(VkInstance)。每个Vulkan实例是相互独立的,彼此之间没有影响。在创建实例时,需要指定所需的层(layer)和扩展(extension)。若不确定可用的层或扩展,可以通过查询函数枚举它们。在获得VkInstance后,可以检测可用的GPU设备。每个GPU设备对应一个VkPhysicalDevice类型的句柄。 阅读详情

相关推荐

【从Vulkan渲染器到自研游戏引擎】一、Vulkan渲染流程

项目链接:https://gitlab.com/FeliHNU/vkguideengine

qq_50679110的博客 2687

Vulkan第一个三角形

Vulkan第一个三角形初始化窗口初始化Vulkan创建实例设置调试回调创建Surface选择物理设备创建逻辑设备创建交换链创建图像视图创建渲染步骤创建图形流水线创建帧缓冲创建命令池创建命令缓冲创建同步对象主循环清理工作 初始化窗口 使用SDL初始化窗口。 SDL_Init(SDL_INIT_VIDEO) SDL_CreateWindow(..., SDL_WINDOW_VULKAN) 初始化Vulkan 创建实例 SDL_Vulkan_GetInstanceExtensions() vk::create

qtxzh的博客 993

Vulkan与OpenGL对比——Vulkan的全新渲染架构

OpenGL是KhronosGroup组织发布的跨平台图像渲染引擎。在这里科普一下Khronos组织,由Intel、Nvidia等公司共同创立,致力于创建开放标准的应用程序API。大名鼎鼎的OpenGL、OpenGLES、WebGL、Vulkan都是来自Khronos。而vulkan称为“下一版本的OpenGL”,旨在提供更低的CPU开销和更多GPU控制。AndroidAPI24以后支持vulkan,iOS在WWDC2014也推出Metal图像渲染。本文主要探讨Vulkan的全新渲染架构。...

iijik55的博客 1万+

“Vulkan的第一个三角形”

学了有关Vulkan的一些基本用法,在这里系统的记录一下。感觉Vulkan这个API确实非常麻烦,如果有没接触过图形API的同学看到这里,但是还没深入学习的话,说句实话不推荐把Vulkan作为入门API。因为它非常非常繁琐,这是官方自己说的。

m0_73087695的博客 1790

Vulkan小白 - Vulkan Graphics Pipeline

Vulkan Pipeline创建时即可完成shader编译,驱动程序只需绑定pipeline到GPU,而避免大量开销,但属性修改通常意味着Pipeline的重新创建且pipeline的创建相对繁琐(Dynamic State在一定程度上避免重新创建),Vulkan Pipeline对性能有一定提升,但shader编译的耗时是无法避免的。OpenGL基于状态机,且要与Context绑定,其设置的状态基本都是全局的。2、部分可编程阶段shader的编译只能被动的发生在draw过程。

笔落梦昙的博客 1609

Vulkan系列教程—VMA教程(一)—快速上手VMA

Vulkan的内存分配器VMA系列教程

weixin_50523841的博客 2514

Vulkan学习笔记一

创建Qt的工程

hometoned的博客 2252

Vulkan 学习(2)---- Vulkan Instance

的功能扩展,它们允许硬件制造商、平台开发者和第三方提供额外的功能和特性,这些功能和特性不包含在核心。参数是最为重要的核心参数 ,当创建实例时,该参数用于指定此实例环境中 Vulkan 的核心版本号。主要的特点是模块化,可以根据需要加载和卸载,开发者可以选择在应用程序初始化时启用哪些层。这几个值随便设置,甚至可以不设置,空值都可以,这些参数不影响实例的创建。涉及向驱动程序提供应用程序的一些细节,比如应用程序的信息和引擎信息等。上运行,可以看到窗口左上角的帧率信息和。的核心功能上插入额外的功能和工具。

小猪佩奇的博客 1680

Vulkan学习笔记【一】 创建窗口与实例

Vulkan 是作为一个跨平台的图形 API 设计的。以往许多图形 API 采用固定功能渲染管线设计,应用程序按照一 定格式提交顶点数据,配置光照和着色选项。随着显卡架构逐渐成熟,提供了越来越多的可编程功能,这些功能被集成到原有的 API 中。造成驱动程序要做的工 作越来越复杂,应用程序开发者要处理的兼容性问题也越来越多。随着移动浪潮到来,人们对移动 GPU 的要求也 越来越高,但以往的图形 API 不能够进行更加精准地控制来提升效率,对多线程的支持也非常不足,导致没有发挥 出图形硬件真正的潜力。

weixin_43469171的博客 1415

vulkansdldemo:Vulkan SDL集成测试演示

Vulkan SDL集成演示 描述 SDL和Vulkan集成测试演示。 本演示尝试使用SDL创建窗口和vulkan兼容的表面。 在Windows下使用多个GPU进行了验证和测试。 应该可以在所有其他受SDL / Vulkan支持的操作系统(OSX,Linux,Android)上运行。 main()清楚地概述了创建vulkan实例,选择设备并创建与窗口关联的vulkan兼容表面(不透明)所采取的所有特定步骤。 该演示还验证了GPU可以渲染到表面。 编译后,您应该准备使用Vulkan绘制一些东西。 该演示基于一组教程(混合匹配): 汇编 Windows:将vulkansdldemo项目放在vulkan SDK旁边(相同级别) 即sdk:root / vulkan / 1。* / ... 即DEM:根/ vulkansdldemo Windows:打开VS解决方案并进行编译。 Win

一组实用功能,旨在帮助使用 Vulkan 和 SDL 创建 3D 游戏_c语言_代码_下载

一组实用功能,旨在帮助使用 Vulkan 和 SDL 创建 3D 游戏。总的来说,GF3D 将作为一个最小的游戏引擎。分支包含用于实现 3D 游戏的不同功能的示例代码。 一组实用功能,旨在帮助创建 3D 游戏OpenGLVulkan 和 SDL2 这个项目专门用作我学习 3D 游戏编程的学生的教育工具。 目前该项目处于WIP状态。它代表了我第一次尝试设置 vulkan 渲染管道。它不稳定,我打算一有时间就彻底重写 vulkan 系统 构建过程 在构建我们为您提供的示例代码之前,您需要获取源代码所需的库。其中一些库很容易获得,而其他库则由安装在您计算机中的硬件供应商提供。获得库后,应该可以从终端中克隆的 git 存储库的根目录中的以下步骤执行以下步骤序列。 更多详情、使用方法,请下载后阅读README.md文件

Vulkan学习笔记(一)-开始

最近刚系统的看完计算机图形学,想深入学一门图形api,正好发现刚出生不久的Vulkan,貌似挺有前景,所以打算学一下,貌似也买不到书,网上教程也不多,发现一处系列教程,网址是https://software.intel.com/zh-cn/articles/api-without-secrets-introduction-to-vulkan-preface,想跟着作者学一遍,敲一遍,本系列学习笔记

时间是最为奇妙的东西 5478

opencode完整使用指南:从安装配置到Agent式编程实战

AI编程工具正从辅助补全向智能体协作演进。编程智能体不仅理解项目全局,还能自主执行原子级重构、测试验证等工程任务,显著提升研发效能。以opencode为代表的开源终端AI编程工具,凭本地优先和灵活模型接入成为技术团队新宠。本文围绕opencode的完整使用链路展开,从Node.js环境准备、npm全局安装,到解决Windows环境变量配置问题,再到接入OpenAI、Anthropic或多模型管理平台,梳理一套标准化接入方案。同时演示VSCode插件调用、LSP语义分析及Playwright驱动的浏览器自动化

weixin_28837817的博客 319

Vulkan 开发(一):Vulkan 概述

Vulkan 是由 Khronos Group 开发的一种现代、高性能的图形和计算 API。它设计用于替代 OpenGL,并提供的硬件控制。与 OpenGL 相比,Vulkan 可以更详细的向显卡描述你的应用程序打算做什么,从而可以获得更好的性能和更小的驱动开销。Vulkan 的开发者来自图形领域的各行各业,有 GPU 厂商,有系统厂商,有游戏引擎厂商等。所以 Vulkan 诞生之初就决定了它一定要有跨平台属性,目的就是成为行业内的统一标准。

字节流动 2777

产生式系统的完整示例——医疗诊断系统(附python代码)

发烧(Fever)、咳嗽(Cough)、皮疹(Rash)、喉咙痛(SoreThroat)、头痛(Headache)、流涕(RunnyNose)、呼吸困难(ShortnessOfBreath)、白细胞计数高(HighWBC)、接触流感患者(ContactFlu)、接触麻疹患者(ContactMeasles)。(2)若规则库中存在尚未使用过的规则,而且它的前提(前件)可与综合数据库中的已知事实匹配,则转第(3)步;(3)执行当前选中的规则,并对该规则做上标记,把该规则执行后得到的结论送入综合数据库中。

搏博的专栏 1701

电机控制个人学习路线及专业书籍资源分享

个人学习电机控制的学习路线,和相关专业书的电子文档分享

weixin_45182459的博客 9914

【Vulkan 入门系列】什么是 Vulkan API?(一)

这个快速导览应该能让你基本了解绘制第一个三角形所需的工作。一个真实的程序包含更多的步骤,例如分配顶点缓冲区、创建统一缓冲区和上传纹理图像等。创建一个VkInstance选择一个支持的显卡 (创建用于绘制和呈现的VkDevice和VkQueue创建一个窗口、窗口 Surface 和交换链将交换链图像包装到中创建一个指定渲染目标和用法的渲染通道为渲染通道创建帧缓冲区设置图形管线为每个可能的交换链图像分配并记录带有绘制命令的命令缓冲区。

洪伟的专栏 3293

Unity Tilemap瓦片动态缩放:保持网格尺寸不变的三种实现方案

本文详细探讨了在Unity中实现Tilemap瓦片动态缩放同时保持网格尺寸不变的三种核心方案。针对编辑器静态调整、整体风格化处理及运行时动态控制等不同场景,分别解析了直接修改瓦片属性、调整Tilemap Renderer材质参数以及使用SetTransformMatrix与Matrix4x4矩阵变换的实践方法、优缺点及选型指南,为2D游戏开发提供灵活高效的视觉与交互解决方案。

grass的博客 627

Vulkan教程翻译之一 Vulkan简介

Vulkan简介 Vulkan是Khronos组织开发的一套高级图形API。其他的图形API(例如OpenGL和Direct3D)要求驱动实现从高层API到适配硬件的必要转换。当时的目的是保证开发者不必去管理关于图形硬件的更复杂的细节。 随着这些老旧的图形API不断地发展,它们逐渐把越来越多的底层硬件功能直接暴露给开发者。开发者要求硬件底层访问权,权衡手持设备的便捷性和安全性,这造成了高开销低...

Bleach3的博客 1323

【打卡帖】7日玩转ESP32——(第4日) 串口的输入输出

【福利帖】7日玩转ESP32——(第4日) 串口的输入输出

1377

R语言机器学习算法实战系列(四)随机森林算法分类器+SHAP值 (Random Forest)

本文介绍了如何使用R语言实现随机森林算法,用于构建乳腺癌分类器。随机森林通过多棵决策树投票判断标签,具有避免偏差和提升模型效果的优势。文章详细讲解了数据下载、R包加载、数据预处理、特征选择、模型构建与评估等步骤。数据集包含569份恶性和良性肿瘤样本的32类指标,通过随机森林模型进行特征选择和分类。最终,文章提供了完整的代码和可视化结果,帮助读者理解并实现随机森林算法。

专注生信领域 3321

Vulkan入门教程 | 第一部分:Vulkan简介

本文介绍了Vulkan图形API的核心概念和学习资源。Vulkan作为现代跨平台图形API,相比OpenGL提供了更低的开销和更强的控制力,但也更复杂。教程详细讲解了Vulkan开发所需的工具链(GLFW窗口管理、Vulkan SDK、GLM数学库等)和核心概念体系。

weixin_62934777的博客 2480

【ChatGPT】实用 Prompt 指令大全 —— 一文教你如何更好地挖掘 GPT 的价值

ChatGPT 是由 OpenAI 开发的一种先进的大型语言生成模型,能够理解和生成准确、自然且连贯的文本。文本生成数据分析内容审核语义理解自然语言推理以及其他众多任务ChatGPT是一种基于GPT-3.5架构的大型语言模型,由OpenAI公司开发。该模型在自然语言处理领域有着广泛的应用,可以用于文本生成、文本分类、情感分析、问答系统等任务。本文将从模型的架构、训练方式、优缺点等方面对ChatGPT进行详细介绍。一、模型架构。

AI天才研究院 2万+

vulkan学习(一)

vulkan

tianyapai的专栏 1102

【异常】OpenClaw 飞书端 OpenClaw: access not configured. Pairing code: [] Ask the bot owner to approve with

摘要: OpenClaw飞书机器人交互中出现的access not configured报错,是因用户或组织未配置访问权限触发的拦截提示。报错包含组织单元ID和配对校验码,需管理员审批开通权限。普通用户需提交完整报错信息给管理员处理;管理员可通过执行标准化命令单次审批,或批量配置组织白名单优化权限管理。建议提前梳理权限范围、及时同步组织架构变更,并定期审计权限列表以确保安全合规。

奶爸的编程之路,也就一周冷个三天 371

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: QMake的实用变量
下一篇: Vulkan 学习笔记二 - 开发环境搭建
低配天才
博客等级 码龄10年 277粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值