我正在关注这个 vulkan 教程:https://vulkan-tutorial.com/Drawing_a_triangle/Drawing/Rendering_and_presentation https://vulkan-tutorial.com/Drawing_a_triangle/Drawing/Rendering_and_presentation我目前位于子通道依赖部分。作者在文中表示,由于在从交换链获取图像之前可能会发生图像布局转换,因此我们需要使用如下的 VkSubpassDependency ,以便渲染通道将在片段着色器输出阶段等待。
VkSubpassDependency dependency = {};
dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
dependency.dstSubpass = 0;
dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependency.srcAccessMask = 0;
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
不过作者之前也有这段代码
vkAcquireNextImageKHR(device, swapChain, UINT64_MAX, imageAvailableSemaphore, VK_NULL_HANDLE, &imageIndex);
VkSubmitInfo submitInfo = {};
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
VkSemaphore waitSemaphores[] = { imageAvailableSemaphore };
VkPipelineStageFlags waitStages[] = { VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT };
submitInfo.waitSemaphoreCount = 1;
submitInfo.pWaitSemaphores = waitSemaphores;
submitInfo.pWaitDstStageMask = waitStages;
submitInfo.commandBufferCount = 1;
submitInfo.pCommandBuffers = &commandBuffers[imageIndex];
VkSemaphore signalSemaphores[] = { renderFinishedSemaphore };
submitInfo.signalSemaphoreCount = 1;
submitInfo.pSignalSemaphores = signalSemaphores;
if (vkQueueSubmit(graphicsQueue, 1, &submitInfo, VK_NULL_HANDLE) != VK_SUCCESS) {
throw std::runtime_error("failed to submit command buffer");
}
这段代码的作用是,在我们能够实际从交换链获取图像之前,片段着色器阶段不会启动(imageAvailableSemaphore 确保这一点)。对我来说,这两段代码正在做同样的事情,即确保片段着色器阶段在我们能够获取图像之前不会启动。这是为什么?
PS:我也很难理解 stagemask 和 access mask。