2016-02-21 4 views
2

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

vkCmdBeginRenderPass(command_buffer, &render_pass_info, VK_SUBPASS_CONTENTS_INLINE); 

// Draw primitives here 

vkCmdEndRenderPass(command_buffer); 
+6

Переполнение стека не является учебным сайтом. Ответ на этот вопрос потребует объяснения: шейдеров и компиляции шейдеров, объектов состояния конвейера, конвейеров, распределения памяти, синхронизации памяти, загрузки памяти, буферов, используемых для ввода вершин, и, возможно, наборов дескрипторов и/или констант push. Это слишком много для SO. Существует множество примеров кода примера; Vulkan SDK поставляется с некоторыми. –

+0

@NicolBolas Хотя я понимаю беспокойство, похоже, нет хороших примеров. Все доступные примеры включают много ненужных рывков (т. Е. Привязывающих текстур, цветов и т. Д.). Минимального образца или даже шагов для рисования примитивных фигур было бы достаточно, чтобы помочь. – tambre

+6

Я не изучил всю совокупность доступных в Вулкане примеров. Но мой первый хит Google для «Vulkan single triangle example» появился [это] (https://github.com/SaschaWillems/Vulkan), который кажется совершенно исправным. Если вы не можете обойти тот факт, что в этом примере есть данные о цвете, то я подозреваю, что вы ищете что-то для копирования и вставки в свой код, а не из того, что вы действительно можете узнать. –

ответ

3

Установка чертежа довольно востребована, но фактические призывы, необходимые для розыгрыша, довольно просты. Из 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.