[Vulkan教程]绘制一个三角形/图形管线基础/介绍
在接下来的几章中,我们将设置一个图形管线(Graphics pipeline),用于绘制我们的第一个三角形。图像管线是一个操作序列,它将网格的顶点和纹理输送到渲染目标中的像素。
输入汇编器(input assembler) 从我们指定的缓冲区收集原始顶点数据,还可以使用索引缓冲区来重复使用某些顶点,从而减少内存使用。
顶点着色器(vertex shader) 每个顶点跑一下子, 通常用来应用变换,将顶点坐标从模型空间转换到屏幕空间。它还沿管线向下传递每个顶点的数据。
细分着色器(tessellation shader) 允许我们根据某些规则细分几何体以提高网格质量。这通常用于砖墙和楼梯等表面,使近它们距离观看时不那么平坦。
几何着色器(geometry shader) 每个图元(三角形、线、点)跑一下子,可以丢弃或输出比输入更多的图元。这类似于曲面细分着色器,但更加灵活。它在今天的应用程序中使用不多,因为除了Intel的集成GPU外,大多数显卡的性能都不大好。
光栅化(rasterizaition) 阶段将图元离散化为片元。片元指的是在帧缓冲上填充的像素元素。任何落在屏幕外的片元都将被丢弃,顶点着色器输出的属性会在这些片元之间插值,如上图所示。通常,在其它片元后面的片元在这里也会因为深度测试而被丢弃(这通常吗?…)。
片元着色器(fragment shader) 每个幸存的片元跑一下子,并确定将片元写入到哪个帧缓冲、使用什么颜色和深度值。它可以使用来自顶点着色器的插值数据来实现,包括纹理坐标、照明法线等。
颜色混合(color blending) 阶段应用混合操作来混合映射到相同帧缓冲像素的不同片元。片元可以简单地覆盖、相加或基于透明度混合。
绿色阶段为固定功能(fixed-function) 阶段。这些阶段允许我们通过参数调整它们的操作,但它们的工作方式是预定义的。
橙色阶段是可编程的,我们可以将自己的代码上传到显卡来准确的应用我们想要的操作。我们可以使用片元着色器做任何事,包括纹理和照明,甚至光线追踪等。这些程序在GPU的多个核心上同时执行,并行地处理多个对象,包括顶点和片元等。
如果你以前用过OpenGL或Direct3D,那你可能习惯于使用glBlendFunc
和OMSetBlendState
等函数来更改管线的设置。Vulkan中的图形管线几乎完全不可变,因此,如果我们想更换着色器、绑定不同的帧缓冲或更改混合函数,我们必须从头开始重新创建管线。这样做的劣势是,我们必须创建许多管道来表示要在渲染操作中使用的所有不同状态组合。优势就是,因为我们在管线中执行的所有操作都是预先知道的,因此驱动程序可以更好地对其进行优化。
一些可编程阶段是可选的。例如,如果我们只是想绘制简单的几何图形,则可以禁用曲面细分和几何图形阶段。如果我们只对深度值感兴趣,我们可以禁用片元着色器,这对于生成阴影贴图非常有用。
在下一章中,我们会首先创建两个可编程阶段顶点着色器和片元着色器,来将我们的三角形放到屏幕上。混合、视口、光栅化等固定功能配置将在后面的章节中进行设置。Vulkan中创建图形管线的最后一步是指定输入和输出帧缓冲的规范。
创建createGraphicsPipeline
函数,然后在initVulkan
中的createImageViews
后面调用。我们将在下一章来研究这个函数。
void initVulkan() {
createInstance();
setupDebugMessenger();
createSurface();
pickPhysicalDevice();
createLogicalDevice();
createSwapChain();
createImageViews();
createGraphicsPipeline();
}
...
void createGraphicsPipeline() {
}