更改窗口大小时必须重新创建Vulkan管道吗?

更改窗口大小时必须重新创建Vulkan管道吗?,vulkan,Vulkan,如图所示: 更改窗口大小时,调用createGraphicsPipeline()重新创建管道,在下面的代码中设置尺寸 VkViewport viewport = {}; viewport.x = 0.0f; viewport.y = 0.0f; viewport.width = (float) swapChainExtent.width; viewport.height = (float) swapChainExtent.height; viewport.minDepth = 0.0f; vie

如图所示: 更改窗口大小时,调用
createGraphicsPipeline()
重新创建管道,在下面的代码中设置尺寸

VkViewport viewport = {};
viewport.x = 0.0f;
viewport.y = 0.0f;
viewport.width = (float) swapChainExtent.width;
viewport.height = (float) swapChainExtent.height;
viewport.minDepth = 0.0f;
viewport.maxDepth = 1.0f;

VkRect2D scissor = {};
scissor.offset = {0, 0};
scissor.extent = swapChainExtent;

VkPipelineViewportStateCreateInfo viewportState = {};
viewportState.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
viewportState.viewportCount = 1;
viewportState.pViewports = &viewport;
viewportState.scissorCount = 1;
viewportState.pScissors = &scissor;


如果场景包含大量材质,更改窗口大小将重新创建所有材质,这非常耗时。我可以直接修改它们的
vkret2d
VkViewport
而不重新创建管道吗?

您必须在所有管道中创建剪刀和视口动态状态,它们将取决于窗口大小。为此:

  • 使用
    VK_DYNAMIC_STATE_视口
    VK_DYNAMIC_STATE_剪刀
    VkPipelineDynamicStateCreateInfo::pddynamicstates中填写
    VkGraphicsPipelineCreateInfo::pDynamicStates

  • 使用动态视口和剪刀状态绑定管道后,调用
    vkCmdSetViewport
    vkcmdsetcissor
    设置当前视口和剪刀。您不必在每次绑定每个管道后再次调用它们,只需对命令缓冲区中的第一个动态管道调用,如果前一个管道未使用动态,则在动态管道之后调用