Как рисовать примитивы в Вулкане?

Предполагая, что Vulkan уже инициализирован, вы записываете в буфер команд, у вас есть буфер кадров и проход рендеринга, как рисовать примитивные 2D геометрические фигуры, используя Vulkan?

vkCmdBeginRenderPass(command_buffer, &render_pass_info, VK_SUBPASS_CONTENTS_INLINE);

// Draw primitives here

vkCmdEndRenderPass(command_buffer);

2

Решение

Настройка рисования довольно сложна, но фактические вызовы, необходимые для рисования, довольно просты. От tri.c (который рисует 2D треугольник):

// ...
vkCmdBeginRenderPass(demo->draw_cmd, &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
vkCmdBindPipeline(demo->draw_cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,
demo->pipeline);
vkCmdBindDescriptorSets(demo->draw_cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, demo->pipeline_layout,
0, 1, & demo->desc_set, 0, NULL);

VkViewport viewport = {};
viewport.height = (float) demo->height;
viewport.width = (float) demo->width;
viewport.minDepth = (float) 0.0f;
viewport.maxDepth = (float) 1.0f;
vkCmdSetViewport(demo->draw_cmd, 0, 1, &viewport);

VkRect2D scissor = {};
scissor.extent.width = demo->width;
scissor.extent.height = demo->height;
scissor.offset.x = 0;
scissor.offset.y = 0;
vkCmdSetScissor(demo->draw_cmd, 0, 1, &scissor);

VkDeviceSize offsets[1] = {0};
vkCmdBindVertexBuffers(demo->draw_cmd, VERTEX_BUFFER_BIND_ID, 1, &demo->vertices.buf, offsets);

vkCmdDraw(demo->draw_cmd, 3, 1, 0, 0);
vkCmdEndRenderPass(demo->draw_cmd);
// ...

Этот фрагмент предполагает, что вы уже получили VkPipeline (которые включают в себя шейдеры и т. д.), VkBuffer (для буфера вершин) и VkCommandBuffer в соответствующих штатах. Это vkCmdDraw который фактически выдает команду рисовать, как только содержащий VkCommandBuffer выполнен.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]