В настоящее время я пытаюсь эффективно визуализировать несколько кубов, поэтому я хотел бы знать, как использовать этот "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» в одном буфере команд, используя один вызов?Спасибо.