据我了解,如果我有一个绘制调用以某种方式使用任何先前绘制调用的结果或写入相同的渲染目标(帧缓冲区),那么我需要确保稍后的绘制调用可以看到所有先前绘制调用的内存效果抽奖。
但是,当我渲染带有一堆对象的场景时,每个这样的对象都是一个绘制调用,并且所有这些绘制调用都写入同一个帧缓冲区。
每次绘制调用后我都需要发出内存屏障吗?
例如 Sascha Willem 的 pbrbasic 示例有这段代码(有点简化),我在那里没有看到任何管道障碍:
VK_CHECK_RESULT(vkBeginCommandBuffer(drawCmdBuffers[i], &cmdBufInfo));
vkCmdBeginRenderPass(drawCmdBuffers[i], &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
VkViewport viewport = vks::initializers::viewport((float)width, (float)height, 0.0f, 1.0f);
vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport);
VkRect2D scissor = vks::initializers::rect2D(width, height, 0, 0);
vkCmdSetScissor(drawCmdBuffers[i], 0, 1, &scissor);
VkDeviceSize offsets[1] = { 0 };
vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 0, NULL);
vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.objects[models.objectIndex].vertices.buffer, offsets);
vkCmdBindIndexBuffer(drawCmdBuffers[i], models.objects[models.objectIndex].indices.buffer, 0, VK_INDEX_TYPE_UINT32);
Material mat = materials[materialIndex];
for (uint32_t y = 0; y < GRID_DIM; y++) {
for (uint32_t x = …Run Code Online (Sandbox Code Playgroud)