1.直接绘制
- vkCmdDraw
void vkCmdDraw( VkCommandBuffer commandBuffer,
uint32_t vertexCount,
uint32_t instanceCount,
uint32_t firstVertex,
uint32_t firstInstance)
根据顶点数据直接绘制。指定了绘制所需的顶点数量,实例数量,以及从哪个顶点和实例开始绘制。
-
vkCmdDrawIndexed
void vkCmdDrawIndexed( VkCommandBuffer commandBuffer,
uint32_t indexCount,
uint32_t instanceCount,
uint32_t firstIndex,
int32_t vertexOffset,
uint32_t firstInstance)
根据顶点索引数据直接绘制。指定了绘制所需的索引数量,实例数量,顶点偏移, 以及从哪个顶点索引和实例开始绘制。
2.间接绘制
-
vkCmdDrawIndexedIndirect
-
void vkCmdDrawIndexedIndirect( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride)
执行间接绘制时,并不会将绘制的具体信息直接记录在commandbuffer中。GPU会从指定的Vkbuffer的offset+(index*stride)处读取绘制数据,进行绘制,一共绘制drawCount次(index指第几次绘制)。
VkBuffer中主要存放如下结构体的数据:
//indexed
struct VkDrawIndexedIndirectCommand { uint32_t indexCount;
uint32_t instanceCount;
uint32_t firstIndex;
int32_t vertexOffset;
uint32_t firstInstance; };
//non indexed
typedef struct VkDrawIndirectCommand { uint32_t vertexCount;
uint32_t instanceCount;
uint32_t firstVertex;
uint32_t firstInstance; }
在使用时,我们需要创建一个vkbuffer,依次将填充每一个VkDrawIndexedIndirectCommand(或者VkDrawIndirectCommand )结构体,一个VkDrawIndexedIndirectCommand就对应了一个网格模型。
create_buffer(MAX_COMMANDS *sizeof(VkDrawIndexedIndirectCommand),
VK_BUFFER_USAGE_TRANSFER_DST_BIT |
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT,
VMA_MEMORY_USAGE_CPU_TO_GPU);
3.区别
使用VKBudder传递绘制参数更加灵活,可以是CPU也可以是GPU端传入绘制参数,只需要更新缓冲区而不更改commandbuffer就可绘制新的物体。他还有一个作用就是GPU剔除,将不需要绘制物体的instanceCount = 0即可。