Using Vulkan -- Pipeline Dynamic State
概述创建图形VkPipeline对象时设置状态的逻辑流程如下// 以视口状态为例 VkViewport viewport {0.0, 0.0, 32.0, 32.0, 0.0, 1.0}; // 设置状态值 VkPipelineViewportStateCreateInfo viewportStateCreateInfo; viewportStateCreateInfo.pViewports viewport; viewportStateCreateInfo.viewportCount 1; // 传入已设置的状态值创建管线 VkGraphicsPipelineCreateInfo pipelineCreateInfo; pipelineCreateInfo.pViewportState viewportStateCreateInfo; vkCreateGraphicsPipelines(pipelineCreateInfo, pipeline); vkBeginCommandBuffer(); // 绑定管线并使用状态的静态值进行绘制 vkCmdBindPipeline(pipeline); vkCmdDraw(); vkEndCommandBuffer();当VkPipeline使用动态状态时部分管线信息可在创建时省略转而在命令缓冲区录制阶段进行设置。新的逻辑流程如下// 以视口状态为例 VkViewport viewport {0.0, 0.0, 32.0, 32.0, 0.0, 1.0}; VkDynamicState dynamicState VK_DYNAMIC_STATE_VIEWPORT; // 此对象暂不启用 VkPipelineViewportStateCreateInfo viewportStateCreateInfo; viewportStateCreateInfo.pViewports nullptr; // 仍需在此处指定要使用的视口数量 viewportStateCreateInfo.viewportCount 1; // 将该状态设置为动态状态 VkPipelineDynamicStateCreateInfo dynamicStateCreateInfo; dynamicStateCreateInfo.dynamicStateCount 1; dynamicStateCreateInfo.pDynamicStates dynamicState; // 创建管线此时暂未指定状态值 VkGraphicsPipelineCreateInfo pipelineCreateInfo; pipelineCreateInfo.pViewportState viewportStateCreateInfo; pipelineCreateInfo.pDynamicState dynamicStateCreateInfo; vkCreateGraphicsPipelines(pipelineCreateInfo, pipeline); vkBeginCommandBuffer(); vkCmdBindPipeline(pipeline); // 在录制阶段为管线设置状态 vkCmdSetViewport(viewport); vkCmdDraw(); viewport.height 64.0; // 在两次绘制之间设置新的状态值 vkCmdSetViewport(viewport); vkCmdDraw(); vkEndCommandBuffer();何时使用动态状态Vulkan 是一款工具因此与大多数工具的使用逻辑相同动态状态的使用并没有唯一的标准答案。在部分实现中使用某些VkDynamicState动态状态相比使用静态值可能会产生性能损耗但动态状态能够避免应用程序创建大量的管线对象变体这一点对应用程序而言可能更为重要。动态状态的生命周期相关规范中提及了动态状态的生命周期概念以下通过示例对其进行最佳阐释// 示例1 - 合法 vkCmdSetViewport() vkCmdBindPipeline() // 静态状态 vkCmdDraw() // 示例2 - 合法 vkCmdBindPipeline() // 静态状态 vkCmdSetViewport() vkCmdBindPipeline() // 动态状态 vkCmdDraw() // 示例3 - 非法VUID-vkCmdDraw-None-07831 vkCmdBindPipeline() // 静态状态 vkCmdBindPipeline() // 动态状态 vkCmdDraw() // 示例4 - 非法VUID-vkCmdDraw-None-08608 vkCmdBindPipeline() // 动态状态 vkCmdBindPipeline() // 静态状态 vkCmdSetViewport() vkCmdDraw() // 示例5 - 非法VUID-vkCmdDraw-None-07831 vkCmdSetViewport() vkCmdBindPipeline() // 静态状态 vkCmdBindPipeline() // 动态状态 vkCmdDraw() // 示例6 - 非法VUID-vkCmdDraw-None-07831 vkCmdSetViewport() vkCmdBindPipeline() // 静态状态 vkCmdDraw() vkCmdBindPipeline() // 动态状态 vkCmdDraw()哪些状态为动态状态所有可用的动态状态完整列表可参考VkDynamicState。VK_EXT_extended_dynamic_state、VK_EXT_extended_dynamic_state2、VK_EXT_extended_dynamic_state3、VK_EXT_vertex_input_dynamic_state、VK_EXT_attachment_feedback_loop_dynamic_state和VK_EXT_color_write_enable这些扩展的新增旨在为需要减少编译和绑定的管线状态对象数量的应用程序提供支持。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2475225.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!