可以說我有多個要使用不同材質渲染的網格。我知道我可以在這個例子中使用push constants
,但這個問題更多的是理解vkDescriptorset是如何工作的。更新渲染通道內的VkDescriptorSet
struct Material {
vec4 color;
vkDescriptorset descriptorSet;
VkDescriptorBufferInfo descriptorBufferInfo;
};
的數據緩衝區被創建後我只能打電話vkUpdateDescriptorSets
爲_descriptorBufferInfo
。一切正常。
我測試了另一個解決方案。每種材料沒有一個vkDescriptorset
,我只有一個適用於所有材料。在rendepass
內部,我爲VkDescriptorBufferInfo
中的每一種材料撥打vkUpdateDescriptorSets
。
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中更新它嗎?
一如既往的絕佳答案,謝謝 – hidayat