我想绘制一个具有多个对象的场景,每个对象都有自己的统一缓冲区和纹理。目前我能够使用动态统一缓冲区绘制多个对象,我这样做的方法是迭代动态统一缓冲区对象偏移量和命令缓冲区记录期间的顶点索引,这样我告诉Vulkan使用特定的全局矩阵绘制模型,但是我不知道如何在此操作期间绑定纹理信息,以便Vulkan知道使用适当的纹理在我的例子中,我有四个盒子,有四种不同的纹理。
答案 0 :(得分:3)
您可以使用vkCmdBindDescriptorSets绑定新纹理。
确保使用纹理绑定设置的描述符是布局中编号最大的设置。
当你使用firstset>调用vkCmdBindDescriptorSets时0然后绑定的描述符集索引[0 ... firstSet-1]
将保持不变。
答案 1 :(得分:2)
到目前为止,我设法使用以下方法绘制多个对象: -
注意:所有模型的所有顶点属性信息都存储在一个缓冲区中,该缓冲区按每个模型组织。
1.使用一个带有两个绑定的描述符集(一个用于UBO和一个用于纹理采样器),UBO的类型是动态的,以容纳所有对象的UBO,在命令缓冲区记录过程中,您只是迭代通过与要绘制的指定顶点属性对应的动态UBO数组
专业人士:高效快捷
缺点:所有对象都具有相同的纹理(适合使用不同的ubo多次渲染相同的模型)
绘图过程
for (uint32_t j = 0; j < m.geometryCount; j++)
{
uint32_t dynamicOffset = j * 256;
vkCmdBindDescriptorSets(commandBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 1, &dynamicOffset);
vkCmdDraw(commandBuffers[i], m.vertexCount[j], 1, vertexCount, 0);
vertexCount += m.vertexCount[j];
}
专业人士:现在每个模特都有它的个人UBO和纹理
缺点:效率低下
绘图过程
for (uint32_t j = 0; j < m.geometryCount; j++)
{
VkDescriptorSet finalSet = descriptorSet[j];
vkCmdBindDescriptorSets(commandBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &finalSet , 0, nullptr);
vkCmdDraw(commandBuffers[i], m.vertexCount[j], 1, vertexCount, 0);
vertexCount += m.vertexCount[j];
}
还有另一种涉及使用推式常量的方法,在这种方法中,您将所有模型的UBO数据排列到一个数组中,然后为顶级着色器创建并绑定该UBO数组的单个描述符集,定义一个数组输入UBO数据的变量,然后在绘制操作期间使用推送常量发送单个数组索引。但是我还没有测试过这种方法。