光栅化

光栅化程序将来自顶点着色器的顶点构成的几何图元转换为片段交由片段着色器着色。深度测试,背面剔除和裁剪测试如何开启了,也由光栅化程序执行。我们可以配置光栅化程序输出整个几何图元作为片段,还是只输出几何图元的边作为片段(也就是线框模式)。光栅化程序的配置通过VkPipelineRasterizationStateCreateInfo结构体进行:

VkPipelineRasterizationStateCreateInfo rasterizer = {};
rasterizer.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
rasterizer.depthClampEnable = VK_FALSE;

depthClampEnable成员变量设置为VK_TRUE表示在近平面和远平面外的片段会被截断为在近平面和远平面上,而不是直接丢弃这些片段。这对于阴影贴图的生成很有用。使用这一设置需要开启相应的GPU特性。

rasterizer.rasterizerDiscardEnable = VK_FALSE;

rasterizerDiscardEnable成员变量设置为VK_TRUE表示所有几何图元都不能通过光栅化阶段。这一设置会禁止一切片段输出到帧缓冲。

polygonMode成员变量用于指定几何图元生成片段的方式。它可以是下面这些值:

  • VK_POLYGON_MODE_FILL:整个多边形,包括多边形内部都产生片段

  • VK_POLYGON_MODE_LINE:只有多边形的边会产生片段

  • VK_POLYGON_MODE_POINT:只有多边形的顶点会产生片段

使用除了VK_POLYGON_MODE_FILL外的模式,需要启用相应的GPU特性。

rasterizer.lineWidth = 1.0f;

lineWidth成员变量用于指定光栅化后的线段宽度,它以线宽所占的片段数目为单位。线宽的最大值依赖于硬件,使用大于1.0f的线宽,需要启用相应的GPU特性。

rasterizer.cullMode = VK_CULL_MODE_BACK_BIT;
rasterizer.frontFace = VK_FRONT_FACE_CLOCKWISE;

cullMode成员变量用于指定使用的表面剔除类型。我们可以通过它禁用表面剔除,剔除背面,剔除正面,以及剔除双面。frontFace成员变量用于指定顺时针的顶点序是正面,还是逆时针的顶点序是正面。

rasterizer.depthBiasEnable = VK_FALSE;
rasterizer.depthBiasConstantFactor = 0.0f; // Optional
rasterizer.depthBiasClamp = 0.0f; // Optional
rasterizer.depthBiasSlopeFactor = 0.0f; // Optional

光栅化程序可以添加一个常量值或是一个基于片段所处线段的斜率得到的变量值到深度值上。这对于阴影贴图会很有用,但在这里,我们不使用它,所以将depthBiasEnable成员变量设置为VK_FALSE。