Как правильно реализовать «Instanced рендеринг» в Vulkan? - PullRequest
0 голосов
/ 10 февраля 2019

В настоящее время я пытаюсь эффективно визуализировать несколько кубов, поэтому я хотел бы знать, как использовать этот "Instanced Rendering" в Vulkan.

В настоящее время я знаю только 2 способа рендеринга.(идентичные) объекты:

1) несколько наборов дескрипторов;

2) один набор дескрипторов с динамическими формами / динамическими смещениями;

В первом случае тратится много памятипотому что каждому кубу нужна только отдельная матрица модели, но все еще используется целый набор DescriptorSet: также, поскольку я регистрирую новый буфер команд каждый кадр, каждый куб стоит мне 2 вызова 'Cmd':

vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, descriptorSet, 0, nullptr);
vkCmdDraw(commandBuffer, numberOfVertices, 1, 0, 0);

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

Во втором случае мне нужен только один набор дескрипторов, регистрирующий матрицу модели в качестве динамическойУнифицируем и заполняем его всеми модельными матрицами;Однако мне все еще нужны (с небольшими изменениями) те же 2 вызова Cmd для каждого куба:

vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, descriptorSet, 1, index);
vkCmdDraw(commandBuffer, numberOfVertices, 1, 0, 0);

Как и прежде, для большого количества кубов, несмотря на огромную экономию памяти для использования уникального DescriptorSet,загрузка процессора все еще беспокоит меня.

Так что я слышал об этом "рендеринге Instanced", который должен как-то сказать одной командой отрисовать все кубы, предоставив ему набор матриц моделей (вероятно, все еще Buffer).

Как это сделать, чтобы моя программа не регистрировала тысячи «Cmd» в одном буфере команд, используя один вызов?Спасибо.

1 Ответ

0 голосов
/ 11 февраля 2019

Вы устанавливаете один из атрибутов вершины, чтобы иметь VkVertexInputBindingDescription::inputRate == VK_VERTEX_INPUT_RATE_INSTANCE.Затем вы помещаете необходимые данные для смещения и поворота в аттибут.

Другой вариант - использовать встроенную переменную вершинного шейдера, которая указывает, какой экземпляр обрабатывается.Вы можете использовать это для индексации в SSBO или UBO для получения необходимых данных.

...