如何使用 Vulkan 绘制标准图元

How To Draw Standard Primitives With Vulkan

Vulkan 是否提供绘制基本图元的功能?点、线、矩形、实心矩形、圆角矩形、实心圆角矩形、圆、实心圆等。?

我认为没有任何 VkCmdDraw* 命令提供此功能。如果这是真的,需要做些什么来绘制这样简单的图元?

Vulkan 中没有这样的实用函数。如果您需要绘制某个图元,您需要自己提供顶点(和索引)。所以如果你例如想画一个圆你需要使用标准三角函数计算顶点,并使用缓冲区为你的绘制调用提供它们。

这意味着通过 vkCreateBuffer 创建一个缓冲区,通过 vkAllocateMemory 分配将数据存储到该缓冲区所需的内存,并将该缓冲区映射到主机内存后,您可以复制图元的顶点 (and/or indices) 到这样的缓冲区。

如果您使用的是非统一内存架构(即桌面 GPU),您还希望将该数据从主机上传到设备以获得最佳性能。

一旦你设置了一个缓冲区,由内存支持并且你的值存储在该缓冲区中,你就可以使用vkCmdDraw*命令绘制你的基元。

Vulkan 不是矢量图形库。它是您的 GPU 的 API。

虽然它确实有(方形)点和线。但是 1 以外的大小是可选的。您能想到的任何其他高级功能都不是 API 的一部分,除了 VK_EXT_line_rasterization 扩展中的功能。

矩形可以是四条线的线带。

Filled Rectangle 可能是两个填充的三角形(resp. Triangle Strip primitive)。

圆角和圆圈可能可以通过渲染边界矩形并在片段着色器中丢弃不需要的形状部分来制作。或者可以使用 Stencil Buffer 来完成一些事情。或者有一个计算着色器,它可以做任何事情。或者,它们可以用三角形模拟。

标准中定义了所有可用的原语类型,可以通过VkPipelineInputAssemblyStateCreateInfo中的VkPrimitiveTopology成员topology进行设置。 VkPrimitiveTopology 的手册页说明了以下可能的值:

VK_PRIMITIVE_TOPOLOGY_POINT_LIST = 0,
VK_PRIMITIVE_TOPOLOGY_LINE_LIST = 1,
VK_PRIMITIVE_TOPOLOGY_LINE_STRIP = 2,
VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST = 3,
VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP = 4,
VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN = 5,
VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY = 6,
VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY = 7,
VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY = 8,
VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY = 9,
VK_PRIMITIVE_TOPOLOGY_PATCH_LIST = 10,

如果您正在渲染不想填充的形状,您可能还需要更改 polygonMode