网站建设怎样避免犯法一键网站建设

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

网站建设怎样避免犯法,一键网站建设,网站开发执行文档,郑州app开发哪家好一、图形管线概述 输入汇编器#xff08;Input assembler#xff09;从您指定的缓冲区收集原始顶点数据#xff0c;并且还可以使用索引缓冲区来重复某些元素#xff0c;而无需复制顶点数据本身。 顶点着色器(Vertex shader)为每个顶点运行#xff0c;通常应用变换将顶点位…一、图形管线概述 输入汇编器Input assembler从您指定的缓冲区收集原始顶点数据并且还可以使用索引缓冲区来重复某些元素而无需复制顶点数据本身。 顶点着色器(Vertex shader)为每个顶点运行通常应用变换将顶点位置从模型空间转换为屏幕空间。它还将每个顶点的数据传递到管线中。 细分着色器(Tessellation)允许您根据某些规则细分几何图形以提高网格质量。这通常用于使附近的砖墙和楼梯等表面看起来不那么平坦。 几何着色器(Geometry shader)在每个图元三角形、直线、点上运行可以丢弃它或输出比输入更多的图元。这与细分着色器类似但更加灵活。但是它在当今的应用程序中使用不多因为除了英特尔的集成 GPU 外大多数图形卡的性能都不是很好。 光栅化阶段(Rasterization)将图元离散化为片段。这些是它们在帧缓冲上填充的像素元素。落在屏幕外的任何片段都会被丢弃并且顶点着色器输出的属性会在片段之间进行插值如图所示。通常由于深度测试此处也会丢弃其他图元片段后面的片段。 片段着色器(Fragment shader)为每个幸存的片段调用并确定将片段写入哪个哪些帧缓冲区以及使用哪个颜色和深度值。它可以使用来自顶点着色器的插值数据来做到这一点其中可以包括纹理坐标和用于照明的法线等内容。 颜色混合阶段(Color blending)应用操作来混合映射到帧缓冲区中同一像素的不同片段。片段可以简单地相互覆盖、相加或基于透明度进行混合。 颜色为绿色的阶段称为固定功能阶段。这些阶段允许您使用参数调整其操作但它们的工作方式是预定义的。 橙色的阶段是可编程的这意味着您可以将自己的代码上传到图形卡以精确应用您想要的操作。这使您可以使用片段着色器例如实现从纹理和照明到光线追踪器的任何功能。这些程序在许多 GPU 内核上同时运行以并行处理许多对象如顶点和片段。 Vulkan 中的图形管线几乎完全不可变因此如果您想更改着色器、绑定不同的帧缓冲区或更改混合功能则必须从头开始重新创建管线。优点管线中执行的所有操作都是预先知道的因此驱动程序可以更好地对其进行优化缺点必须创建许多代表您希望在渲染操作中使用的所有不同状态组合的管线。 二、着色器模块 Vulkan 着色器代码使用 SPIR-V 字节码格式可以通过 D:\VulkanSDK\1.4.313.2\Bin\glslc.exe 把 GLSL编写的着色器编译为字节码。 确保VulkanSDK环境变量配置正确编写脚本compile.bat放到着色器目录。 glslc triangle.vert -o triangle_vert.spv glslc triangle.frag -o triangle_frag.spv 每次修改完 traingle glsl 着色器运行 compile.bat。 Vulkan NDC标准化设备坐标和 OpenGL有差异Y轴坐标符号翻转了。 着色器模块只参与创建管线过程管线创建完成后直接销毁。 三、图形管线初步配置 void HelloTriangle::createGraphicsPipeline() {// 1. 读取着色器SPIR-V二进制代码auto vertShaderCode utils::readFile(assets/shaders/triangle_vert.spv);auto fragShaderCode utils::readFile(assets/shaders/triangle_frag.spv);// 2. 创建着色器模块封装SPIR-V代码供管线使用VkShaderModule vertShaderModule createShaderModule(vertShaderCode);VkShaderModule fragShaderModule createShaderModule(fragShaderCode);// ——————— 3. 配置着色器阶段 ———————// 顶点着色器阶段信息VkPipelineShaderStageCreateInfo vertShaderStageInfo{};vertShaderStageInfo.sType VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;vertShaderStageInfo.stage VK_SHADER_STAGE_VERTEX_BIT; // 指定为顶点着色器阶段vertShaderStageInfo.module vertShaderModule; // 关联顶点着色器模块vertShaderStageInfo.pName main; // 指定入口函数名// 片段着色器阶段信息VkPipelineShaderStageCreateInfo fragShaderStageInfo{};fragShaderStageInfo.sType VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;fragShaderStageInfo.stage VK_SHADER_STAGE_FRAGMENT_BIT; // 指定为片段着色器阶段fragShaderStageInfo.module fragShaderModule; // 关联片段着色器模块fragShaderStageInfo.pName main; // 指定入口函数名// 合并着色器阶段配置数组VkPipelineShaderStageCreateInfo shaderStages[] {vertShaderStageInfo, fragShaderStageInfo};// ——————— 4. 顶点输入配置 ———————VkPipelineVertexInputStateCreateInfo vertexInputInfo{};vertexInputInfo.sType VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;vertexInputInfo.vertexBindingDescriptionCount 0; // 无顶点绑定描述示例未使用顶点数据vertexInputInfo.vertexAttributeDescriptionCount 0; // 无顶点属性描述// ——————— 5. 图元装配配置 ———————VkPipelineInputAssemblyStateCreateInfo inputAssembly{};inputAssembly.sType VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;inputAssembly.topology VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; // 图元拓扑为三角形列表inputAssembly.primitiveRestartEnable VK_FALSE; // 禁用图元重启// ——————— 6. 视口与裁剪配置 ———————VkPipelineViewportStateCreateInfo viewportState{};viewportState.sType VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;viewportState.viewportCount 1; // 单个视口viewportState.scissorCount 1; // 单个裁剪区域// ——————— 7. 光栅化阶段配置 ———————VkPipelineRasterizationStateCreateInfo rasterizer{};rasterizer.sType VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;rasterizer.depthClampEnable VK_FALSE; // 禁用深度值裁剪rasterizer.rasterizerDiscardEnable VK_FALSE; // 禁用光栅化丢弃rasterizer.polygonMode VK_POLYGON_MODE_FILL; // 多边形填充模式实体填充rasterizer.lineWidth 1.0f; // 线宽rasterizer.cullMode VK_CULL_MODE_BACK_BIT; // 背面剔除rasterizer.frontFace VK_FRONT_FACE_CLOCKWISE; // 顺时针为正面rasterizer.depthBiasEnable VK_FALSE; // 禁用深度偏移// ——————— 8. 多重采样配置 ———————VkPipelineMultisampleStateCreateInfo multisampling{};multisampling.sType VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;multisampling.sampleShadingEnable VK_FALSE; // 禁用采样着色multisampling.rasterizationSamples VK_SAMPLE_COUNT_1_BIT; // 1倍采样无抗锯齿// ——————— 9. 颜色混合配置 ———————VkPipelineColorBlendAttachmentState colorBlendAttachment{};colorBlendAttachment.colorWriteMask // 允许写入RGBA通道VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;colorBlendAttachment.blendEnable VK_FALSE; // 禁用颜色混合VkPipelineColorBlendStateCreateInfo colorBlending{};colorBlending.sType VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;colorBlending.logicOpEnable VK_FALSE; // 禁用逻辑操作colorBlending.logicOp VK_LOGIC_OP_COPY; // 逻辑操作类型示例未使用colorBlending.attachmentCount 1; // 单个颜色附件colorBlending.pAttachments colorBlendAttachment; // 关联颜色附件配置// ——————— 10. 动态状态配置 ———————std::vectorVkDynamicState dynamicStates {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};VkPipelineDynamicStateCreateInfo dynamicState{};dynamicState.sType VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;dynamicState.dynamicStateCount static_castuint32_t(dynamicStates.size());dynamicState.pDynamicStates dynamicStates.data(); // 动态视口和裁剪区域绘制时动态设置// ——————— 11. 管线布局创建 ———————VkPipelineLayoutCreateInfo pipelineLayoutInfo{};pipelineLayoutInfo.sType VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;pipelineLayoutInfo.setLayoutCount 0; // 无描述符集布局pipelineLayoutInfo.pushConstantRangeCount 0; // 无推送常量范围// 创建管线布局用于绑定着色器资源if (vkCreatePipelineLayout(device, pipelineLayoutInfo, nullptr, pipelineLayout) ! VK_SUCCESS) {throw std::runtime_error(failed to create pipeline layout!);}// ——————— 12. 资源清理 ———————// 管线创建完成后着色器模块不再需要销毁以释放资源vkDestroyShaderModule(device, fragShaderModule, nullptr);vkDestroyShaderModule(device, vertShaderModule, nullptr); } 着色器中使用 uniform 值是类似于动态状态变量的全局变量可以在绘制时更改以改变着色器的行为而无需重新创建它们。uniform 值需要在创建管线期间通过创建 VkPipelineLayout 对象来指定。 推送常量是另一种将动态值传递给着色器的方法也在管线布局中指定。 四、渲染过程 在创建管线前需告知Vulkan渲染时使用的帧缓冲附件包括颜色/深度缓冲区数量、采样数及内容处理方式。这些信息封装在渲染过程对象中将通过createRenderPass函数实现。 void HelloTriangle::createRenderPass() {// 1. 配置颜色附件VkAttachmentDescription colorAttachment{};colorAttachment.format swapChainImageFormat; // 使用交换链图像格式colorAttachment.samples VK_SAMPLE_COUNT_1_BIT; // 无多重采样colorAttachment.loadOp VK_ATTACHMENT_LOAD_OP_CLEAR; // 渲染前清除附件colorAttachment.storeOp VK_ATTACHMENT_STORE_OP_STORE; // 渲染后保存结果colorAttachment.stencilLoadOp VK_ATTACHMENT_LOAD_OP_DONT_CARE; // 不使用模板缓冲colorAttachment.stencilStoreOp VK_ATTACHMENT_STORE_OP_DONT_CARE;colorAttachment.initialLayout VK_IMAGE_LAYOUT_UNDEFINED; // 初始布局未定义colorAttachment.finalLayout VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; // 最终用于呈现// 2. 配置附件引用VkAttachmentReference colorAttachmentRef{};colorAttachmentRef.attachment 0; // 引用索引0的附件colorAttachmentRef.layout VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; // 用作颜色附件时的最佳布局// 3. 配置子过程VkSubpassDescription subpass{};subpass.pipelineBindPoint VK_PIPELINE_BIND_POINT_GRAPHICS; // 图形管线子过程subpass.colorAttachmentCount 1; // 1个颜色附件subpass.pColorAttachments colorAttachmentRef; // 关联颜色附件引用// 4. 创建渲染过程VkRenderPassCreateInfo renderPassInfo{};renderPassInfo.sType VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;renderPassInfo.attachmentCount 1; // 1个附件renderPassInfo.pAttachments colorAttachment; // 关联附件描述renderPassInfo.subpassCount 1; // 1个子过程renderPassInfo.pSubpasses subpass; // 关联子过程描述// 创建渲染过程对象if (vkCreateRenderPass(device, renderPassInfo, nullptr, renderPass) ! VK_SUCCESS) {throw std::runtime_error(Failed to create render pass!);} } 五、完善图形管线配置 已拥有的对象类型 着色器阶段定义图形管线可编程阶段功能的着色器模块 固定功能状态定义管线固定功能阶段的所有结构如输入汇编、光栅化器、视口和颜色混合 管线布局着色器引用的、可在绘制时更新的 uniform 和 push 值 渲染通道管线阶段引用的附件及其用法
void HelloTriangle::createGraphicsPipeline() { // …省略之前的着色器模块创建和状态配置代码// 配置图形管线创建信息VkGraphicsPipelineCreateInfo pipelineInfo{};pipelineInfo.sType VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;pipelineInfo.stageCount 2; // 包含顶点和片段两个着色器阶段pipelineInfo.pStages shaderStages; // 关联着色器阶段配置数组pipelineInfo.pVertexInputState vertexInputInfo; // 顶点输入状态pipelineInfo.pInputAssemblyState inputAssembly; // 图元装配状态pipelineInfo.pViewportState viewportState; // 视口与裁剪状态pipelineInfo.pRasterizationState rasterizer; // 光栅化状态pipelineInfo.pMultisampleState multisampling; // 多重采样状态pipelineInfo.pColorBlendState colorBlending; // 颜色混合状态pipelineInfo.pDynamicState dynamicState; // 动态状态配置pipelineInfo.layout pipelineLayout; // 关联管线布局pipelineInfo.renderPass renderPass; // 关联渲染过程pipelineInfo.subpass 0; // 使用渲染过程的第0号子过程pipelineInfo.basePipelineHandle VK_NULL_HANDLE; // 不基于其他管线创建// 创建图形管线if (vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, pipelineInfo, nullptr, graphicsPipeline) ! VK_SUCCESS) {throw std::runtime_error(Failed to create graphics pipeline!);}// 之前的代码 资源清理管线创建后不再需要着色器模块vkDestroyShaderModule(device, fragShaderModule, nullptr);vkDestroyShaderModule(device, vertShaderModule, nullptr); } 六、新增成员变量和成员函数 成员变量 VkRenderPass renderPass;VkPipelineLayout pipelineLayout;VkPipeline graphicsPipeline; 成员函数 void createRenderPass(); void createGraphicsPipeline(); VkShaderModule createShaderModule(const std::vectorchar code); 清理资源 void HelloTriangle::cleanup() {vkDestroyPipeline(device, graphicsPipeline, nullptr);vkDestroyPipelineLayout(device, pipelineLayout, nullptr);vkDestroyRenderPass(device, renderPass, nullptr);// 之前的清理工作for (auto imageView : swapChainImageViews) {vkDestroyImageView(device, imageView, nullptr);}vkDestroySwapchainKHR(device, swapChain, nullptr);vkDestroyDevice(device, nullptr);if (enableValidationLayers) {DestroyDebugUtilsMessengerEXT(instance, debugMessenger, nullptr);}vkDestroySurfaceKHR(instance, surface, nullptr);vkDestroyInstance(instance, nullptr); } 当前代码分支03_graphics-pipeline