[英]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_CLEAR
的loadOp
值,或者附件具有深度/模板格式並使用VK_ATTACHMENT_LOAD_OP_CLEAR
的stencilLoadOp
值。 該數組由附件編號索引。 僅使用與已清除附件相對應的元素。pClearValues
的其他元素被忽略。 1 個存檔
創建VkRenderPass
對象時,您指定是否希望在VkRenderPassCreateInfo
結構中清除每個附件。 如果您不想在渲染通道開始時清除附件,則需要將每個loadOp
的VkAttachmentDescription
設置為VK_ATTACHMENT_LOAD_OP_LOAD
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.