引言
在接下来的几个章节中,我们将搭建一个图形管线(graphics pipeline),用于绘制我们的第一个三角形。图形管线是一系列操作的集合,它能将网格的顶点(vertices)和纹理(textures)最终转化为渲染目标(render targets)中的像素(pixels)。以下是简化的概述:

图形管线各阶段说明
管线阶段类型
- 绿色标记的阶段为固定功能阶段(fixed-function stages):这些阶段允许你通过参数调整其操作,但工作方式是预定义的。
- 橙色标记的阶段为可编程阶段(programmable):你可以将自定义代码上传到显卡,以执行完全符合需求的操作。例如,利用片元着色器,你可以实现从纹理映射(texturing)、光照(lighting)到光线追踪(ray tracers)等各类功能。这些程序在多个 GPU 核心上并行运行,同时处理大量对象(如顶点和片元)。
如果你之前使用过 OpenGL、Direct3D 等较旧的 API,可能习惯通过glBlendFunc、OMSetBlendState等调用随意修改管线设置。但 Vulkan 中的图形管线几乎是完全不可变的(immutable),因此如果需要更换着色器(shaders)、绑定不同的帧缓冲区或修改混合函数(blend function),必须重新创建整个管线。其缺点是你需要创建多个管线,以覆盖渲染操作中可能用到的所有状态组合。但优势在于,由于管线中所有操作都是预先确定的,驱动程序(driver)可以进行更充分的优化。
部分可编程阶段是可选的,具体取决于你的使用场景。例如,若仅绘制简单几何图形,可禁用曲面细分着色器和几何着色器;若仅关注深度值(depth values),可禁用片元着色器 —— 这在阴影贴图生成(shadow map generation)中非常实用。
在下一章节中,我们将首先创建在屏幕上绘制三角形所需的两个可编程阶段:顶点着色器和片元着色器。混合模式(blending mode)、视口(viewport)、光栅化等固定功能配置将在后续章节中设置。Vulkan 图形管线搭建的最后一步是指定输入和输出帧缓冲区。
代码实现
创建一个createGraphicsPipeline函数,并在initVulkan函数中的createImageViews调用之后执行。后续章节将逐步完善该函数的实现。
void initVulkan() {
createInstance();
setupDebugMessenger();
createSurface();
pickPhysicalDevice();
createLogicalDevice();
createSwapChain();
createImageViews();
createGraphicsPipeline();
}
…
void createGraphicsPipeline() {
}
下一章节将介绍在屏幕上实际渲染内容所需的着色器模块(shader modules)。


