深度和模板状态

至此,深度附着已经可以使用,只剩下开启图形管线的深度测试功能。我们需要通过VkPipelineDepthStencilStateCreateInfo结构体来设置深度测试:

VkPipelineDepthStencilStateCreateInfo depthStencil = {};
depthStencil.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
depthStencil.depthTestEnable = VK_TRUE;
depthStencil.depthWriteEnable = VK_TRUE;

depthTestEnable成员变量用于指定是否启用深度测试。depthWriteEnable成员变量用于指定片段通过深度测试后是否写入它的深度值到深度缓冲。使用这两个成员变量可以实现透明效果。透明对象的片段的深度值需要和之前不透明对象片段的深度值进行比较,但透明对象的片段的深度值不需要写入深度缓冲。

depthStencil.depthCompareOp = VK_COMPARE_OP_LESS;

depthCompareOp成员变量用于指定深度测试使用的比较运算。这里我们指定深度测试使用小于比较运算,这一设置下,新的片段只有在它的深度值小于深度缓冲中的深度值时才会被写入颜色附着。

depthStencil.depthBoundsTestEnable = VK_FALSE;
depthStencil.minDepthBounds = 0.0f; // Optional
depthStencil.maxDepthBounds = 1.0f; // Optional

depthBoundsTestEnable、minDepthBounds和maxDepthBounds成员变量用于指定可选的深度范围测试。这一测试开启后只有深度值位于指定范围内的片段才不会被丢弃。这里我们不使用这一功能。

depthStencil.stencilTestEnable = VK_FALSE;
depthStencil.front = {}; // Optional
depthStencil.back = {}; // Optional

stencilTestEnable、front和back成员变量用于模板测试,在我们的教程中没有用到。如果读者想要使用模板测试,需要注意使用包含模板颜色通道的图像数据格式。

pipelineInfo.pDepthStencilState = &depthStencil;

更新之前创建图形管线时填写的VkGraphicsPipelineCreateInfo结构体信息,引用我们刚刚设置的深度模板缓冲状态信息。如果渲染流程包含了深度模板附着,那就必须指定深度模板状态信息。

现在编译运行程序,读者就可以看到被正确渲染的几何图元:

image