【问题标题】:How to draw primitives in Vulkan? [closed]如何在 Vulkan 中绘制图元? [关闭]
【发布时间】:2016-02-21 13:05:01
【问题描述】:

假设 Vulkan 已经初始化,你正在录制到命令缓冲区,你有一个帧缓冲区和一个渲染通道,如何使用 Vulkan 绘制原始 2D 几何形状?

vkCmdBeginRenderPass(command_buffer, &render_pass_info, VK_SUBPASS_CONTENTS_INLINE);

// Draw primitives here

vkCmdEndRenderPass(command_buffer);

【问题讨论】:

  • Stack Overflow 不是一个教程网站。回答这个问题需要解释:着色器和着色器编译、管道状态对象、管道、内存分配、内存同步、内存上传、用于顶点输入的缓冲区,以及可能的描述符集和/或推送常量。这对 SO 来说太过分了。那里有很多示例代码; Vulkan SDK 自带一些。
  • 我还没有探索所有可用的 Vulkan 示例。但是我第一次在 Google 上搜索“Vulkan 单三角形示例”时出现了this,这似乎非常有用。如果您无法解决此示例包含颜色数据的事实,那么我怀疑您正在寻找可以复制并粘贴到代码中的内容,而不是您可以实际学习的内容。
  • 网络上有大量的例子。至少看看官方网站:khronos.org/registry/vulkankhronos.org/vulkan 别忘了 LunarG 和供应商网站(例如 Nvidia)

标签: c++ graphics rendering vulkan


【解决方案1】:

绘图设置非常复杂,但绘图所需的实际调用相当简单。来自tri.c(绘制二维三角形):

// ...
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);
// ...

此 sn-p 假设您已经获得了 VkPipeline(包括着色器等)、VkBuffer(用于顶点缓冲区)和处于适当状态的 VkCommandBuffer。一旦包含 VkCommandBuffer 被执行,实际上是 vkCmdDraw 发出绘制命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多