Vulkan的各種Draw指令

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即可。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值