Как сохранить содержимое вложения между проходами рендеринга - PullRequest
0 голосов
/ 31 мая 2018

У меня есть несколько «рендеров», которые должны рисовать для одного и того же вложения (точнее, изображения цепочки обмена).Я не знаю количество таких рендеров заранее, поэтому не могу использовать подпроходы.Вот как я хотел это реализовать:

VkCommandBuffer cb{...}; // get current "main" command buffer
for(auto r : renderers)
{
    VkRenderPassBeginInfo renderPassBeginInfo{get_render_pass_begin_info(...)};
    vkCmdBeginRenderPass(cb, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
    array<VkCommandBuffer, 2> buffs{r->getCommandBuffers()}; // renderer build two secondary command buffers...
    vkCmdExecuteCommands(cb, 1, buffs[0]); // first should be used in a render pass
    vkCmdEndRenderPass(cb);
    vkCmdExecuteCommands(cb, 1, buffs[1]); // second should be used ooutside of a render pass
}

Проблема в том, что каждый новый вызов vkCmdBeginRenderPass очищает цель.Это происходит потому, что вложение было создано с помощью loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR, потому что мне нужно очистить его (но только один раз).

В моем случае решением было бы переместить vkCmdBeginRenderPass и vkCmdEndRenderPass за пределы цикла,но в этом случае мне нужно «собрать» все вторичные буферы команд, которые нельзя использовать внутри прохода рендеринга, и выполнить их позже.

Но так как концепция проходов рендеринга не приходит мне в головуИнтересно, может ли быть способ сохранить данные вложения между проходами рендеринга?

1 Ответ

0 голосов
/ 31 мая 2018

Вы можете прекратить очистку вложений при загрузке.Просто вручную очистите их, либо перед началом прохода рендеринга, либо в начале первого подпроцесса.

При этом проходы рендеринга недешевы, и это действительно не тот способ их использования.Правильное решение состоит в том, чтобы реструктурировать код рендеринга так, чтобы вам потребовался только один проход рендеринга.

...