Как я могу использовать несколько неизменяемых пробоотборников в Вулкане? - PullRequest
0 голосов
/ 10 апреля 2020

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

Я написал конвейер рендеринга для нескольких текстур, используя vulkan. Первая версия, которая поддерживает только текстуры ARGB (VK_FORMAT_R8G8B8A8_UNORM), работает нормально.

Для записи буфера команд я сделал следующее:

  1. vkBeginCommandBuffer
  2. vkCmdBeginRenderPass
  3. vkCmdBindPipeline
  4. для каждой текстуры
    1. vkCmdBindVertexBuffers
    2. vkCmdBindIndexBuffer
    3. vkCmdBindDescriptorStab * 10 * * * * * * * 10 * 10 * * * * vkCmdDrawIndexed
  5. vkCmdEndRenderPass
  6. vkEndCommandBuffer

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

Так что теперь с частью, с которой я борюсь:

Использование текстур ARGB очень неэффективно, если они обновляются часто. Поэтому я попытался использовать текстуры YCbCr, такие как I420, прямо в шейдере. После выяснения того, как их настроить, я заметил, что они должны использоваться как неизменяемые сэмплеры (VkDescriptorSetLayoutBinding pImmutableSamplers), которые могут быть статически связаны только тогда, когда определен макет набора дескрипторов (vkCreateDescriptorSetLayout). Это означает, что использование одного набора дескрипторов снова и снова, больше не работает. Правильно?

Чтобы исправить это, я предоставил несколько макетов набора дескрипторов (vkCreatePipelineLayout) для графического конвейера (vkCreateGraphicsPipelines). Теперь я могу иметь одну привязку для каждой текстуры к конвейеру, а это значит, что у меня может быть несколько статически связанных неизменяемых сэмплеров, которые никогда не будут заменены. Пока все хорошо, но мой фрагментный шейдер использует только первый сэмплер (точнее, первый набор дескрипторов) для визуализации вывода. Сначала я думал, что набор дескрипторов будет взят из набора vkCmdBindDescriptorSets, но я ошибся.

Вот мой фрагментный шейдер:

#extension GL_ARB_separate_shader_objects : enable

layout(binding = 1) uniform sampler2DArray texSampler;

layout(binding = 2) uniform UniformBufferObject {
    float alpha;
    uint layer;
} ubo;

layout(location = 0) in vec2 fragTexCoord;

layout(location = 0) out vec4 outColor;

void main() {
    vec4 color = texture(texSampler, vec3(fragTexCoord, ubo.layer));
    outColor = vec4(color.rgb, color[3] * ubo.alpha);
}

Я уже понял, что это возможно чтобы предоставить набор для макета шейдера (например, layout (set = 1, binding = 1) ), но мне нужно обновить этот набор в задаче рендеринга (для текстуры), как я это сделал со всеми остальными привязками перед рисованием.

Есть предложения? Какое рекомендуемое решение здесь?

...