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

时间:2019-09-16 03:23:53

标签: vulkan

https://vulkan-tutorial.com/code/23_texture_image.cpp所示: 更改窗口大小时,调用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;

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

1 个答案:

答案 0 :(得分:0)

您必须在所有取决于窗口大小的管道中使剪刀和视口成为动态状态。为此:

  1. VkGraphicsPipelineCreateInfo::pDynamicState中的VK_DYNAMIC_STATE_VIEWPORTVK_DYNAMIC_STATE_SCISSOR填充VkPipelineDynamicStateCreateInfo::pDynamicStates

  2. 在绑定具有动态视口和剪刀状态的管道之后,调用vkCmdSetViewportvkCmdSetScissor来设置当前视口和剪刀。您不必在每次绑定每个管道之后,仅对于命令缓冲区中的第一个动态状态管道以及在动态状态管道之后(如果先前的管道不使用动态状态)之后再次调用它们。