更改窗口大小时必须重新创建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
设置当前视口和剪刀。您不必在每次绑定每个管道后再次调用它们,只需对命令缓冲区中的第一个动态管道调用,如果前一个管道未使用动态,则在动态管道之后调用