Как «смешать» кадр Im Gui с рендерингом сцены в Vulkan - PullRequest
0 голосов
/ 17 марта 2020

Я не эксперт по Вулкану. Я хочу знать, как мне представить Vulkan Frame (Отправить especif commandBuffer, который записывается каждый кадр для рисования изменений пользовательского интерфейса) в верхней части моего обычного рендеринга сцены. Так что в этом случае у меня есть два renderPasses, один для сцены и другой для Im Gui, а также два commandBuffers. При попытке отправить эти два командных буфера отображается только последний, так как они используют образ подкачки. Что мне не хватает? должно ли вложение кадра frameBuffer в проходе im gui быть swapchainImage?

1 Ответ

1 голос
/ 17 марта 2020

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

Судя по вашему описанию, второй проход рендеринга правильно установлен на VK_ATTACHMENT_LOAD_OP_CLEAR для loadOp, что приводит к очистке кадрового буфера текущим чистым цветом, как только вы начинаете второй проход рендеринга.

Таким образом, в вашем сценарии вам нужно сохранить содержимое на первом проходе, чтобы убедиться, что оно не было отброшено из-за оптимизации:

std::array<VkAttachmentDescription, 2> attachments = {};
// Attachment 0 = Color attachment
attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
...

А на втором проходе рендеринга вам необходимо установить его Чтобы загрузить предыдущее содержимое:

std::array<VkAttachmentDescription, 2> attachments = {};
// Attachment 0 = Color attachment
attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
...

Если вы отправляете несколько командных буферов, вам также необходимо обеспечить правильное упорядочение команд, используя соответствующие примитивы синхронизации, такие как семафоры или конвейерные барьеры (например, неявные через подпроцессы renderpass).

Другой, возможно, более простой подход (в зависимости от ваших настроек) состоит в простом добавлении рендеринга пользовательского интерфейса в тот же буфер команд, что и рендеринг вашей сцены. Таким образом, вы просто визуализируете свой интерфейс поверх геометрии сцены без синхронизации. Хотя это может быть не вариант для всех вариантов использования. Или вы можете go с промежуточными проходами (тяжелые) отрисовки проходов.

...