指定管线光栅化状态
译者注:示例代码点击此处
光栅化过程从组装的多边形生成片段(像素)。视口状态用于指定在帧缓冲区坐标中生成片段的位置。要指定如何(如果有)生成片段,我们需要准备光栅化状态。
怎么做...
1.创建名为rasterization_state_create_info的VkPipelineRasterizationStateCreateInfo类型变量,使用以下值初始化起成员:
·sType为VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO
·pNext为nullptr
·flags为0
·对于depthClampEnable,如果深度超出视口状态中指定的最小/最大范围的深度值应该被限制在此范围内,则使用true值;如果深度超出此范围要剪掉(丢弃),则使用false值 ; 如果未启用depthClampEnable功能,则只能指定false值。
·对于rasterizerDiscardEnable,如果正常生成片段,则使用false值;如果禁用光栅化,则使用true。
·对于polygonMode,指定应如何渲染组合多边形 - 完全填充或是否应渲染线或点(只有在启用fillModeNonSolid功能时才能使用线和点模式)。
·cullMode为多边形的面 - 前面,后面,或两面是否被剔除掉
·frontFace为从正面看以顺时针或逆时针方向的顶点顺序在屏幕上绘制
·depthBiasEnable为如果要为片段计算的深度值应另外偏移,则指定true值否则指定false值。
·depthBiasConstantFactor为应用深度偏移(depthBiasEnable)时应添加到片段计算深度值的常量值。
·depthBiasClamp为深度偏移的最大值(或最小值),可以在启用深度偏置时添加到片段的深度
·depthBiasSlopeFactor为启用深度偏移时,添加到片段深度倾斜计算中的值
·lineWidth为渲染线宽度的值; 如果未启用wideLines功能,则只能指定1.0值; 否则,也可以提供大于1.0的值。
这个怎么运作...
光栅化状态控制光栅化的参数。 首先,它定义是启用还是禁用光栅化。 通过它我们可以指定多边形的哪一边是前面 - 如果它是顶点以顺时针顺序出现在屏幕上或者是逆时针顺序的那一面。 接下来,我们需要控制是否应该为前面,后面,两面启用剔除,或者是否应禁用剔除。 在OpenGL中,默认情况下,逆时针方向面被视为正面,并且已禁用剔除。 在Vulkan中,没有默认状态,因此我们如何定义这些参数取决于自己。
提示::在创建图形管线期间始终需要光栅化状态。
栅格化状态还控制绘制多边形的方式。 通常我们希望它们被完全渲染(填充)。 但是我们可以指定是否只绘制它们的边(线)或点(顶点)。 只有在创建逻辑设备期间启用fillModeNonSolid功能时,才能使用线或点模式。
对于光栅化状态,我们还需要定义如何计算生成的片段的深度值。 我们可以启用深度宜偏移- 一个将生成的深度值偏移一个恒定值和一个额外斜率因子的过程。 我们还指定了在启用深度偏差时可应用于深度值的最大(或最小)偏移值。
之后,我们还需要定义如何处理深度值超出视口状态中指定范围的片段。 当启用深度钳位(depthClamp)时,将这些片段的深度值钳位(约束)到定义的范围,并进一步处理片段。 如果禁用深度钳位,则丢弃此类片段。
最后一件事是定义渲染线的宽度。 通常我们只能指定值1.0。 但是,如果我们启用wideLines功能,可以提供大于1.0的值。
光栅化状态是通过VkPipelineRasterizationStateCreateInfo类型的变量定义的。 使用通过其他变量提供的值填充此类变量的示例源代码显示在以下代码中:
VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {
VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,
nullptr,
0,
depth_clamp_enable,
rasterizer_discard_enable,
polygon_mode,
culling_mode,
front_face,
depth_bias_enable,
depth_bias_constant_factor,
depth_bias_clamp,
depth_bias_slope_factor,
line_width
};