Vulkan入门:渲染三角形需要哪些步骤

前言

大家好,2026年了,宗宝又回来了;

在这断更的一年中,宗宝没有闲着,也在一直提升自己,尤其是现在AI如此火的当下,不提升就会被淘汰;AI对各行各业都带来了很大的冲击;AI时代的到来,让每个人对接触新的知识变得非常轻松容易,也就是个人的知识广度会极速扩大,但是宗宝觉得,知识广度只一部分,知识的深度才是更重要的;所以,宗宝会继续努力,提升自己的知识深度,也会继续分享自己的知识,希望能帮助到更多的人;
最近,宗宝一直在空闲时间研究渲染方向的知识,所以今天硬货是有关渲染流程的知识;

Vulkan

先简单说一下vulkan吧;

1751767923033_.pic

Vulkan是一个跨平台的2D和3D绘图应用程序接口(API),最早由科纳斯组织(Khronos Group)在2015年游戏开发者大会(GDC)上发表。他与OpenGL一样,都是由Khronos Group开发的,但是Vulkan是一个更底层的API,它的设计目标是为了提供更好的性能和更多的控制。

Draw Call

大家都知道Draw Call是指在渲染管线中,将顶点数据、索引数据、材质数据等传递给GPU进行渲染的操作。每个Draw Call都对应着一次渲染操作,渲染管线会根据Draw Call中的数据,进行顶点 shader、几何 shader、片段 shader 等阶段的处理,最终将渲染结果输出到屏幕上。

而在我们开发过程中,优化Draw Call始终是提升运行性能的重要手段之一,那么啥是Draw Call,一次Draw Call到底包含了那些操作,接下来宗宝详细的介绍一下

DC的统计

在我们常见的游戏开发中,dc是一个很重要的指标,尽可能的降低这个指标来提高性能,对应到vulkan中其实就是每帧下边两个函数的调用次数。

vkCmdDrawIndexed(...); 索引绘制
vkCmdDraw(...); 非索引绘制

也就是用于向命令缓冲区提交绘制操作

三角形

接下来从最简单的三角形出发,我们一步步了解,在vkCmdDrawIndexed/vkCmdDraw提交之前,都会经历那些过程

上图就是渲染一个三角形所需的步骤,也就是我们所说的渲染流程

1.Render Pass

Render Pass是 Vulkan 渲染框架的核心组织单元,它定义了 一帧渲染的整体结构和依赖关系

管理渲染目标:有哪些渲染目标(颜色附件、深度附件、模板附件),这些目标如何被使用(清除、加载、存储),以及它们之间的依赖关系

组织渲染顺序(子流程):一个复杂的渲染可能需要多个阶段,Render Pass 将它们组织成子流程:

2.Pipeline(渲染状态)

相比Render Pass,对于开发者来说Pipeline(渲染状态)才是与我们息息相关的,都是我们可以手动控制的属性

直接说渲染状态,大家可能比较含糊,在宗宝接触vulkan之前也只是大概的了解,现在将每个列出来,是不是清楚多了;

当然除了上边列举的,还有VkPushConstantRange(推送常量),VkDescriptorSetLayout(描述符集:UBO,采样器等)

以上的所有项组合起来就是一个完整的渲染状态,当其中一个属性值发生了变换,那么就相当是创建了一个新的渲染状态,而整个渲染过程是通过状态机进行更新,当绑定了一种渲染状态,后续的所有vkCmdDrawIndexed都会按照这这个渲染状态执行;相同的渲染状态不需要进行重复的更新,只有当渲染状态发生变化后需要进行更新;

至于每一项具体的用途,在后续的文章中会逐步进行单独分享

3.Vertex(顶点数据)/Index(索引数据)

绑定顶点缓冲区:将一个或多个顶点缓冲区绑定到指定的顶点绑定槽位,供后续的绘制命令使用。
绑定索引缓冲区:绑定索引缓冲区,用于索引绘制

4.vkCmdDrawIndexed(提交绘制)

vkCmdDrawIndexed 是 Vulkan 中执行索引绘制(Indexed Drawing)的核心命令。它告诉 GPU:

“使用当前绑定的顶点和索引缓冲区,绘制指定数量的图元(三角形、线条等)”

一句话概括
“通过索引来复用顶点,绘制几何图形”

写在最后

要想真正的了解游戏开发,渲染是不可避免的一道坎。希望宗宝的分享会对大家的学习有所帮助,并且后续将会抽空持续更新自己的学习笔记以及公开相关的代码仓库,尽请期待;

感兴趣的朋友可以加宗宝的微信:Tidewalker_16

原文链接:https://mp.weixin.qq.com/s/H4cBIPN4KV2ZWz5rWQ7YIw

6赞

大佬出没,先赞后看

cocos都没了. 你回来了.

前排强势围观