如何在 Vulkan 中绘制基元
How to draw primitives in Vulkan?
假设 Vulkan
已经初始化,您正在录制到命令缓冲区,您有一个帧缓冲区和一个渲染通道,如何使用 Vulkan 绘制原始的 2D 几何形状?
vkCmdBeginRenderPass(command_buffer, &render_pass_info, VK_SUBPASS_CONTENTS_INLINE);
// Draw primitives here
vkCmdEndRenderPass(command_buffer);
绘图设置非常复杂,但绘制所需的实际调用相当简单。从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
。执行包含VkCommandBuffer
后,实际发出要绘制的命令的是vkCmdDraw
。
相关文章:
- QuadTree只在窗口的右上角绘制
- 绘制旋转的三角形
- 使用Vulkan hpp vk::enumerateInstanceVersion()会导致segfault
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 如何在QT中的自定义视频小工具t上绘制矩形
- 如何在Visual Basic中使用矩形函数OpenGL绘制矩形
- 无法使用VAO和EBO(openGL)绘制多个对象
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- Vulkan 中的动态顶点缓冲区格式设置
- 绘制顺时针三角形,重新排序点
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- 将 Vulkan 与 SFML 结合使用?
- Vulkan SDK 版本 1.1.85.0 在 Kubuntu 18.10 上链接
- 在 Vulkan Qt 中获取队列系列
- SFML 文本未绘制在窗口上
- 如何在快板的屏幕中显示子位图的绘制?
- 如何绘制自定义形状的元素?
- 在 Vulkan 中绘制多个对象
- 如何在 Vulkan 中绘制基元