假设我有多个要使用不同材质渲染的网格。我知道我可以使用push constants
这个例子,但这个问题更多的是理解 vkDescriptorset 是如何工作的。
struct Material {
vec4 color;
vkDescriptorset descriptorSet;
VkDescriptorBufferInfo descriptorBufferInfo;
};
我只在创建数据缓冲区后才调用vkUpdateDescriptorSets
。_descriptorBufferInfo
一切正常。
我测试了另一种解决方案。我不是vkDescriptorset
每种材料都有一个,而是所有材料都只有一个。而里面rendepass
我要求vkUpdateDescriptorSets
的每一种材料VkDescriptorBufferInfo
。
vkDescriptorset globalDescriptorSet;
struct Material {
vec4 color;
VkDescriptorBufferInfo descriptorBufferInfo;
};
beginCommandBuffer
beginRenderPass
for (auto &mesh : meshes) {
...
writeDescriptorSets.dstSet = globalDescriptorSet;
writeDescriptorSets.pBufferInfo = &mesh.material.descriptorBufferInfo;
....
vkUpdateDescriptorSets(device, 1, &writeDescriptorSets, 0, nullptr);
renderMesh(mesh);
}
endRenderPass
endCommandBuffer
但是当我这样做时,它不起作用。验证层说你必须在调用我渲染的第二个网格beginCommandBuffer
的任何命令之前调用vkCmdBindDescriptorSets
,vkCmdBindPipeline
等等。
那么这里的问题是什么,我不能在多个 VkDescriptorBufferInfo 之间共享一个 vkDescriptorset,还是不能在 renderPass 中更新它?