002.Vulkan绘制一个三角形1——概述
# Vulkan 绘制一个三角形1 —— 概述
在 Android 平台绘制一个简单的三角形,对应代码如下:
https://github.com/yuandaimaahao/VulkanDemos

# 第一阶段:初始化 (Initialization)
这是最繁琐的阶段,通常只在程序启动时执行一次。目的是建立与 GPU 的连接并准备好绘图所需的"基础设施"。一般的流程如下:
- 创建 Instance (VkInstance),VkInstance 是应用程序与 Vulkan 库(Loader)之间的连接桥梁,可以把它理解为 Vulkan 的"上下文"或"入口点"
- 选择物理设备 (VkPhysicalDevice),查询系统中有几张显卡,选择最适合的一张(比如选独显而不是集显)。
- 创建逻辑设备 (VkDevice) 和队列 (VkQueue),建立与选定显卡的逻辑连接,并获取命令队列(Graphics Queue, Present Queue)。
- 创建窗口表面 (VkSurfaceKHR) 和交换链 (VkSwapchainKHR),连接操作系统窗口,创建一组用于显示的图像缓冲区(Images)。通常采用双缓冲或三缓冲模式。
- 创建图像视图 (VkImageView) 和帧缓冲 (VkFramebuffer),告诉 Vulkan 如何看待和使用交换链里的那些图像。
# 第二阶段:管线准备 (Pipeline Setup)
这个阶段定义了"怎么画"。
- 创建渲染流程 (VkRenderPass),描述渲染的整体流程。比如:图像的格式是什么?画之前要不要清屏(Clear)?画完后图像要存到哪里?
- 创建图形管线 (VkPipeline),这是最复杂的一步。你需要配置所有的固定功能状态(视口大小、光栅化、深度测试、混合模式)以及加载可编程着色器(Vertex/Fragment Shaders)。
- 创建命令池 (VkCommandPool) 和命令缓冲 (VkCommandBuffer),Vulkan 的绘图指令不是直接发给 GPU 的,而是先记录在 CommandBuffer 中,然后一次性提交。
# 第三阶段:渲染循环 (Render Loop)
这是程序运行时的核心循环,每一帧都在重复这个过程。
- 绘制一帧 (Draw Frame),这个过程通常包含三个同步步骤:
- 获取图像 (vkAcquireNextImageKHR):从交换链中拿一张空闲的画布。
- 提交命令 (vkQueueSubmit):把之前录好的 CommandBuffer(里面包含 vkCmdDraw)提交给 GPU 队列去执行。
- 呈现图像 (vkQueuePresentKHR):等 GPU 画完了,把这张画送回交换链,显示在屏幕上。
# 第四阶段:清理 (Cleanup)
Vulkan 没有垃圾回收机制,你创建的每一个对象都必须手动销毁。销毁资源遵循“后创建先销毁”的栈式顺序。
顺序:Pipeline -> RenderPass -> Swapchain -> Device -> Instance。
# 总结
Instance -> PhysicalDevice -> Device -> Swapchain -> RenderPass -> Pipeline -> (Loop: Acquire -> Submit -> Present) -> CleanUp