Vulkan:如果有多个帧缓冲区,是否应该为每个着色器统一创建多个VkBuffer?

时间:2019-09-26 17:48:22

标签: vulkan

glsl:

#version 450

layout(set = 0, binding = 0) uniform mat4 MyMatrix;

void main() {
}

如果有多个帧缓冲区,则可以同时将多个帧缓冲区提交到队列,例如:

while(!isClose) {
    ...
    VkSubmitInfo submitInfo = {};
    submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
    std::vector<VkCommandBuffer> cs = {commandBuffers[imageIndex]}; // bind different frame buffer
    ...
    vkQueueSubmit(graphicsQueue, 1, &submitInfo, inFlightFences[currentFrame]);
    ...
    currentFrame = (currentFrame + 1) % MAX_FRAMES_IN_FLIGHT;
    ...
}

MyMatrix需要更新每一帧。如果MyMatrix使用相同的VkBuffer,则可能会覆盖每一帧数据?那我应该为MyMatrix创建多个VkBuffers吗?

1 个答案:

答案 0 :(得分:0)

多个缓冲区可能是多余的-通常分配一个大的统一缓冲区,然后为每个draw call batch从该缓冲区中再分配。然后,您可以为每个绘图只在该缓冲区中使用偏移量,而不是每次都需要一个新缓冲区。

通常,偏移量对于硬件来说要比全新的缓冲区描述符便宜。