簡體   English   中英

僅在 vulkan api 的第一個命令緩沖區上清除屏幕

[英]Clear screen only on first command buffer at vulkan api

我嘗試使用 vulkan api 實現多線程渲染。我從其他線程構建了多個命令緩沖區。 然后執行它們。但是由於每個命令緩沖區中都有一個清晰的屏幕,所以我沒有得到圖片。

VkCommandBufferBeginInfo beginInfo{};
beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;

VkRenderPassBeginInfo renderPassInfo{};
renderPassInfo.sType                = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
renderPassInfo.renderPass           = m_pRenderPass;
renderPassInfo.framebuffer          = m_swapChainFrameBufferPtrs[m_nImageIndex];
renderPassInfo.renderArea.offset    = { 0, 0 };
renderPassInfo.renderArea.extent    = { m_nWidth, m_nHeight };

std::array<VkClearValue, 2> clearValues{};
clearValues[0].color            = { {0.0f, 0.0f, 0.0f, 1.0f} };
clearValues[1].depthStencil     = { 1.0f, 0 };
renderPassInfo.clearValueCount  = static_cast<uint32_t>(clearValues.size());
renderPassInfo.pClearValues     = clearValues.data();

VkViewport viewport{...};
VkRect2D scissor{...};

CFrameCommandBuffer& currentFrame = m_frames[m_nCurrentFrame];

for (std::uint32_t n = 0; n < currentFrame.m_commandBufferPtrs.size(); ++n)
{
    auto& pCmdBuffer = currentFrame.m_commandBufferPtrs[n];

    vkResetCommandBuffer(pCmdBuffer, 0);
    vkBeginCommandBuffer(pCmdBuffer, &beginInfo);
    vkCmdBeginRenderPass(pCmdBuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE);
    vkCmdSetViewport(pCmdBuffer, 0, 1, &viewport);
    vkCmdSetScissor(pCmdBuffer, 0, 1, &scissor);
}

如果我不對第二個和后續緩沖區使用屏幕清除。

renderPassInfo.clearValueCount  = 0;
renderPassInfo.pClearValues     = nullptr;

我收到一個錯誤:

In vkCmdBeginRenderPass the VkRenderPassBeginInfo struct has a clearValueCount of 0 but there must be at least 2 entries in pClearValues array to account for the highest index attachment in VkRenderPass 0x1ebe0f000000012a[] that uses VK_ATTACHMENT_LOAD_OP_CLEAR is 2. Note that the pClearValues array is indexed by attachment number so even if some pClearValues entries between 0 and 1 correspond to attachments that aren't cleared they will be ignored.

如何僅在第一個命令緩沖區正確清除屏幕?

調用vkCmdBeginRenderPass時,您需要一組值來清除渲染通道附件。

pClearValues是指向clearValueCount結構數組的指針, VkClearValue包含每個附件的清除值,如果附件使用VK_ATTACHMENT_LOAD_OP_CLEARloadOp值,或者附件具有深度/模板格式並使用VK_ATTACHMENT_LOAD_OP_CLEARstencilLoadOp值。 該數組由附件編號索引。 僅使用與已清除附件相對應的元素。 pClearValues的其他元素被忽略。 1 個存檔

創建VkRenderPass對象時,您指定是否希望在VkRenderPassCreateInfo結構中清除每個附件。 如果您不想在渲染通道開始時清除附件,則需要將每個loadOpVkAttachmentDescription設置為VK_ATTACHMENT_LOAD_OP_LOAD

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM