Если вы разделяете визуализацию сцены и пользовательского интерфейса на разные отдельные этапы рендеринга, вам нужно указать цветовое вложение первого прохода рендеринга, чтобы сохранить содержимое, и второй проход рендеринга пользовательского интерфейса, чтобы загрузить содержимое буфера кадров.
Судя по вашему описанию, второй проход рендеринга правильно установлен на 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 с промежуточными проходами (тяжелые) отрисовки проходов.