当前位置: 首页 > news >正文

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 中连接 着色器 和 外部资源 的桥梁。
  • 它通过 描述符集布局 和 推送常量 定义数据访问规则。
  • 正确配置管道布局是实现动态渲染(如切换纹理、更新矩阵)的基础。
http://www.dtcms.com/a/339740.html

相关文章:

  • 微服务-07.微服务拆分-微服务项目结构说明
  • VulKan笔记(九)-着色器
  • Qt消息队列
  • MySQL深分页性能优化实战:大数据量情况下如何进行优化
  • MySQL 三大日志:redo log、undo log、binlog 详解
  • 面试题储备-MQ篇 1-说说你对RabbitMQ的理解
  • 3D检测笔记:MMDetection3d环境配置
  • 基于单片机智能手环/健康手环/老人健康监测
  • DataSourceAutoConfiguration源码笔记
  • 47 C++ STL模板库16-容器8-关联容器-集合(set)多重集合(multiset)
  • Lec. 2: Pytorch, Resource Accounting 课程笔记
  • 告别手写文档!Spring Boot API 文档终极解决方案:SpringDoc OpenAPI
  • 一文速通Ruby语法
  • GeoTools 读取影像元数据
  • 常见 GC 收集器与适用场景:从吞吐量到亚毫秒停顿的全景指南
  • Kotlin 相关知识点
  • 驱动开发系列66 - glCompileShader实现 - GLSL中添加内置函数
  • 从“为什么”到“怎么做”——Linux Namespace 隔离实战全景地图
  • [激光原理与应用-309]:光学设计 - 什么是光学系统装配图,其用途、主要内容、格式与示例?
  • 线性基 系列
  • Java static关键字
  • OptiTrack光学跟踪系统,提高机器人活动精度
  • 讯飞星火语音大模型
  • CAD图纸如何批量转换成PDF格式?
  • 机器学习概念(面试题库)
  • 部署tomcat应用时注意事项
  • vue3+element-plus 输入框el-input设置背景颜色和字体颜色,样式效果等同于不可编辑的效果
  • t-SNE详解与实践【附代码】
  • 自定义组件可使用的方法
  • 在 Python 中操作 Excel 文件的高效方案 —— Aspose.Cells for Python