Переход макета с неработающими зависимостями - PullRequest
1 голос
/ 12 января 2020

Итак, я пытаюсь реализовать отображение теней в 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 .

...