Vulkan笔记(十)-图形管道的七个配置项
在Vulkan图形管道中需要设置七道工序:
1.输入汇编器并且进行装配
VkPipelineVertexInputStateCreateInfo vertexInputInfo{};vertexInputInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;vertexInputInfo.vertexBindingDescriptionCount = 1;vertexInputInfo.pVertexBindingDescriptions = &bindingDescription;;vertexInputInfo.vertexAttributeDescriptionCount = static_cast<uint32_t>(attributeDescriptions.size());vertexInputInfo.pVertexAttributeDescriptions = attributeDescriptions.data();//输入装配VkPipelineInputAssemblyStateCreateInfo assemblyInfo{};assemblyInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;assemblyInfo.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;assemblyInfo.primitiveRestartEnable = VK_FALSE;
这里对顶点属性比如:位置 、颜色 、法线、纹理等描述信息进行创建,装配按照什么方式是点、线还是三角形等方式把顶点数据组织起来。
2.视口与裁剪矩形
VkPipelineViewportStateCreateInfo viewPortInfo{};
viewPortInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
viewPortInfo.pNext = nullptr;
viewPortInfo.flags = 0;
viewPortInfo.viewportCount = 1;
viewPortInfo.pViewports = nullptr;
viewPortInfo.scissorCount = 1;
viewPortInfo.pScissors = nullptr;
3.光栅化 离散器
VkPipelineRasterizationStateCreateInfo rasterizationInfo{};rasterizationInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;rasterizationInfo.depthClampEnable = VK_FALSE;rasterizationInfo.rasterizerDiscardEnable = VK_FALSE;rasterizationInfo.polygonMode = VK_POLYGON_MODE_FILL;rasterizationInfo.lineWidth = 1.f;rasterizationInfo.cullMode = VK_CULL_MODE_NONE;rasterizationInfo.frontFace = VK_FRONT_FACE_CLOCKWISE;rasterizationInfo.depthBiasEnable = VK_FALSE;rasterizationInfo.depthBiasConstantFactor = 0.f;rasterizationInfo.depthBiasSlopeFactor = 0.f;rasterizationInfo.depthBiasClamp = 0.f;
将几何图元(如三角形)离散化为屏幕上的像素(称为片元/Fragment),确定哪些像素被图元覆盖,并进行属性插值计算(如颜色、深度)
4.多重采样
VkPipelineMultisampleStateCreateInfo multisampleInfo{};
multisampleInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
multisampleInfo.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
multisampleInfo.sampleShadingEnable = VK_FALSE;
multisampleInfo.minSampleShading = 1.0f;
multisampleInfo.pSampleMask = nullptr;
multisampleInfo.alphaToCoverageEnable = VK_FALSE;
multisampleInfo.alphaToOneEnable = VK_FALSE;
对每个像素进行多次采样(而不仅仅是中心点),然后混合这些采样结果,使边缘看起来更平滑。
5.深度与模板测试
VkPipelineDepthStencilStateCreateInfo depthStencilInfo{};
depthStencilInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
depthStencilInfo.depthTestEnable = VK_TRUE;
depthStencilInfo.depthWriteEnable = VK_TRUE;
depthStencilInfo.depthCompareOp = VK_COMPARE_OP_LESS;
depthStencilInfo.depthBoundsTestEnable = VK_FALSE;
depthStencilInfo.minDepthBounds = 0.0f;
depthStencilInfo.maxDepthBounds = 1.0f;
depthStencilInfo.stencilTestEnable = VK_FALSE;
depthStencilInfo.front = {};
depthStencilInfo.back = {};
深度测试和模板测试是两种关键的像素筛选机制,用于决定哪些像素最终被绘制到屏幕上。它们通常在片元处理阶段(Fragment Processing)之后执行,确保正确的遮挡关系和特殊效果(如阴影、轮廓、镜面反射等)。深度测试:解决“谁在前谁在后”的问题,是 3D 渲染的基础。模板测试:实现复杂特效(如镜子、X 光效果),灵活性高。结合使用:可高效实现 阴影体积(Shadow Volumes)、动态门户等高级渲染技术。
6.颜色混合
VkPipelineColorBlendAttachmentState colorBlendAttachmentInfo{};colorBlendAttachmentInfo.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;colorBlendAttachmentInfo.blendEnable = VK_TRUE;colorBlendAttachmentInfo.colorBlendOp = VK_BLEND_OP_ADD;colorBlendAttachmentInfo.alphaBlendOp = VK_BLEND_OP_ADD;colorBlendAttachmentInfo.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;colorBlendAttachmentInfo.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;colorBlendAttachmentInfo.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE;colorBlendAttachmentInfo.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO;VkPipelineColorBlendStateCreateInfo colorCreateInfo{};colorCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;colorCreateInfo.logicOpEnable = VK_FALSE;colorCreateInfo.logicOp = VK_LOGIC_OP_COPY;colorCreateInfo.attachmentCount = 1;colorCreateInfo.pAttachments = &colorBlendAttachmentInfo;colorCreateInfo.blendConstants[0] = 0.f;colorCreateInfo.blendConstants[1] = 0.f;colorCreateInfo.blendConstants[2] = 0.f;colorCreateInfo.blendConstants[3] = 0.f;
用于处理 半透明物体 或 多渲染目标(MRT) 的颜色叠加。它决定了当前绘制的像素(源颜色,Source Color)如何与帧缓冲区(目标颜色,Destination Color)中已有的像素进行混合。
7.管道布局
VkPipelineLayoutCreateInfo pipelineLayoutInfo{};pipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;pipelineLayoutInfo.setLayoutCount = 1;pipelineLayoutInfo.pSetLayouts = &uboSetLayout_;pipelineLayoutInfo.pushConstantRangeCount = 0;pipelineLayoutInfo.pPushConstantRanges = nullptr;if (vkCreatePipelineLayout(logicDevice_, &pipelineLayoutInfo, nullptr, &pipelineLayout_) != VK_SUCCESS){throw std::runtime_error("Failed to create pipeline layout!");}
着色器如何访问外部资源(如 Uniform Buffer、纹理、采样器等)的核心对象。它相当于一个“资源访问协议”,告诉 GPU 着色器可以读取哪些数据以及这些数据的组织方式。
- 管道布局 是 Vulkan 中连接 着色器 和 外部资源 的桥梁。
- 它通过 描述符集布局 和 推送常量 定义数据访问规则。
- 正确配置管道布局是实现动态渲染(如切换纹理、更新矩阵)的基础。