Итак, я пытаюсь реализовать отображение теней в vulkan, но когда я запускаю команду renderpass в буфере команд, валидация жалуется на то, что макеты изображений не соответствуют ожидаемым. Я использую вторичные буферы команд для рендеринга и выполнения их в первичном буфере команд. Я являюсь зависимостями подпроцесса для переходов макета между проходами рендеринга. Несмотря на то, что я использую зависимости, проверка по-прежнему жалуется. Я также не уверен, что отображение теней неверно из-за неправильных макетов. Хотя отображение теней не должно быть неправильным в шейдере. Что может быть причиной этого? Я попытался проверить пример теневого отображения Sascha Willems, но не могу понять, почему возникла какая-либо проблема.
Создание прохода рендеринга
AttachmentInfo depthAttachment;
depthAttachment.p_AttachmentType = AttachmentType::Depth;
depthAttachment.p_Format = VK_FORMAT_D16_UNORM;
depthAttachment.p_SampleCount = 1;// m_CurrentWindow->maxMSAASamples;
depthAttachment.p_LoadOp = LoadOp::Clear;
depthAttachment.p_StoreOp = StoreOp::Store;
depthAttachment.p_StencilLoadOp = LoadOp::Null;
depthAttachment.p_StencilStoreOp = StoreOp::Null;
depthAttachment.p_InitialLayout = Layout::Undefined;
depthAttachment.p_FinalLayout = Layout::DepthR;
m_ShadowMapRenderPass.addAttachment(depthAttachment);
VkSubpassDependency dependency = {};
dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
dependency.dstSubpass = 0;
dependency.srcStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
dependency.dstStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT;
dependency.srcAccessMask = VK_ACCESS_SHADER_READ_BIT;
dependency.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
dependency.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
m_ShadowMapRenderPass.m_Dependencies.push_back(dependency);
dependency.srcSubpass = 0;
dependency.dstSubpass = VK_SUBPASS_EXTERNAL;
dependency.srcStageMask = VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
dependency.dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
dependency.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
dependency.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
dependency.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
m_ShadowMapRenderPass.m_Dependencies.push_back(dependency);
m_ShadowMapRenderPass.create();
Ошибка проверки
vkCmdExecuteCommands():: Executed secondary command buffer using VkImage 0x548d63000000080e[]
(subresource: aspectMask 0x2 array layer 0, mip level 0) which expects layout
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL--instead, image current layout is
VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL.
Запись в буфер команд
m_PrimaryCommandBuffers[p_Index].cmdBegin();
// Shadow map render pass
m_PrimaryCommandBuffers[p_Index].cmdBeginRenderPass(m_ShadowMapRenderPass, SubpassContents::Secondary, m_ShadowMapFramebuffer);
m_PrimaryCommandBuffers[p_Index].cmdExecuteCommands(m_ShadowMapCommandBuffers);
m_PrimaryCommandBuffers[p_Index].cmdEndRenderPass();
// Present render pass
m_PrimaryCommandBuffers[p_Index].cmdBeginRenderPass(m_DefaultRenderPass, SubpassContents::Secondary, p_FrameBuffer, m_CurrentWindow->getWindowSize());
m_PrimaryCommandBuffers[p_Index].cmdExecuteCommands(m_CommandBuffers);
m_PrimaryCommandBuffers[p_Index].cmdEndRenderPass();
m_PrimaryCommandBuffers[p_Index].cmdEnd();
Мое отображение теней неверно, даже если карта теней верна при просмотре с renderdo c .