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

Jav*_*ang 7 vulkan

如https://vulkan-tutorial.com/code/23_texture_image.cpp所示:createGraphicsPipeline()更改窗口大小时调用重新创建Pipeline,尺寸在下面的代码中设置。

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;

Run Code Online (Sandbox Code Playgroud)

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

Jes*_*all 16

您必须在所有管道中使剪刀和视口处于动态状态,它们将取决于窗口大小。去做这个:

  1. 填写VkGraphicsPipelineCreateInfo::pDynamicState和。VK_DYNAMIC_STATE_VIEWPORTVK_DYNAMIC_STATE_SCISSORVkPipelineDynamicStateCreateInfo::pDynamicStates

  2. 绑定动态视口和剪刀状态的管道后,调用vkCmdSetViewportvkCmdSetScissor设置当前视口和剪刀。您不必在每次绑定每个管道后再次调用这些函数,仅针对命令缓冲区中的第一个动态管道以及动态状态管道之后(如果前一个管道未使用动态状态)调用这些函数。