Vulkan, один проход рендера, 2 шейдера, разное количество выходов - PullRequest
0 голосов
/ 21 февраля 2020

Это мои текущие настройки:

  • Запуск прохода рендеринга
  • Шейдер 1 выводит цвет на 5 вложений.
  • Шейдер 2 выводит цвет на те же 5 вложений
  • Fini sh запись команд

Однако эта секунда на самом деле не должна ничего выводить на 5 вложений, только на первое.

Is можно ли менять количество вложений на лету? Примерно так:

  • Начать проход рендеринга
  • Шейдер 1 выводит цвет на 5 вложений.
  • Изменить активный буфер кадров в проходе рендеринга
  • Шейдер 2 выводит цвет только на одно первое вложение.
  • Fini sh команды записи

Или, если это невозможно. Можно ли отключить очистку вложений между проходами рендеринга?

Редактирование рассматриваемого фрагмента шейдера выглядит следующим образом:

#version 450
#extension GL_ARB_separate_shader_objects : enable

layout(location = 0) out vec4 color_out;
layout(location = 1) out vec4 color_out1;
layout(location = 2) out vec4 color_out2;
layout(location = 3) out vec4 color_out3;
layout(location = 4) out vec4 color_out4;

void main()
{
    color_out = vec4(1,1,1,1);
    color_out1 = vec4(0,0,0,0);
    color_out2 = vec4(0,0,0,0);
    color_out3 = vec4(0,0,0,0);
    color_out4 = vec4(0,0,0,0);
}

Я пытаюсь от него избавиться.

То, как я сейчас выполняю Мой проход рендеринга:

// Initialize the FB with 5 image attachemnts + the clear values, etc...
vk::RenderPassBeginInfo render_pass_info;
render_pass_info.renderPass = *render_pass;
render_pass_info.framebuffer = *framebuffer;
render_pass_info.renderArea = vk::Rect2D({0,0}, extent);
render_pass_info.clearValueCount = clears.size();
render_pass_info.pClearValues = clears.data();

cmd.beginRenderPass(&render_pass_info, vk::SubpassContents::eInline);

/* setup pipeline 1 info, like it's descriptor sets, samplers etc*/
cmd.bindPipeline(vk::PipelineBindPoint::eGraphics, *graphics_pipeline);
cmd.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, *pipeline_layout, 0, 1, descriptor_set_ptr, 0, nullptr);

/* Do the same for the second pipeline */
cmd.bindPipeline(vk::PipelineBindPoint::eGraphics, *graphics_pipeline);
cmd.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, *pipeline_layout, 0, 1, descriptor_set_ptr, 0, nullptr);

Цель состоит в том, чтобы не выводить дополнительные 5 вложений в шейдер. Который в настоящее время завершает мою программу со следующей ошибкой:

Message ID name: UNASSIGNED-CoreValidation-Shader-InputNotProduced
Message: Attachment 1 not written by fragment shader; undefined values will be written to attachment
Severity: VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT

1 Ответ

1 голос
/ 21 февраля 2020

У вас есть много вариантов для этого.

«Шейдер 2» может использовать маски записи для отключения записи в другие вложения. Они находятся в VkPipelineColorBlendAttachmentState::colorWriteMask, поэтому вы просто устанавливаете это значение на 0 для предотвращения записи в это вложение.

В качестве альтернативы, вы можете выполнить «Shader 2» в отдельном подпроцессе, который использует только вложение проценты.

Какой из них использовать, зависит от характера ваших операций рендеринга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...