再探Vulkan(3):管道动态状态(dynamic state)

本文详述了Vulkan中的管道动态状态,允许在不重新创建管道的情况下改变状态,通过命令缓冲区在运行时进行调整。讨论了管道绑定、派生法创建多个管道,特别强调了如何改变动态状态,如视口、裁剪和线宽。此外,还解析了动态状态在多视口绘制中的应用和效率优势。
摘要由CSDN通过智能技术生成

08/15/2020

管道动态状态

**不需要重新创建管道,就可以改变之前已经设置好的状态。**直接使用命令缓冲区里的命令在运行时改变,而不是通过用不同的对象。许愿在管道阶段设置动态状态,VkGraphicsPipelineCreateInfo的成员pDyanmicState做到。

VkPipelineViewportStateCreateInfo pipelineViewportStateCreateInfo {
   };
pipelineViewportStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
pipelineViewportStateCreateInfo.viewportCount = 1;
pipelineViewportStateCreateInfo.scissorCount = 1;

std::vector<VkDynamicState> dynamicStateEnables = {
    
		VK_DYNAMIC_STATE_VIEWPORT, 				//设置动态状态  视口矩阵
		VK_DYNAMIC_STATE_SCISSOR, 				//裁剪矩阵
		VK_DYNAMIC_STATE_LINE_WIDTH, 			//线段宽度
};

//动态状态的描述信息
VkPipelineDynamicStateCreateInfo dynamicState = pipelineDynamicStateCreateInfo(dynamicStateEnables);

inline VkPipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo(
			const std::vector<VkDynamicState>& pDynamicStates,
			VkPipelineDynamicStateCreateFlags flags = 0)
{
   
	VkPipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo{
   };
	pipelineDynamicStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
	pipelineDynamicStateCreateInfo.pDynamicStates = pDynamicStates.data();
	pipelineDynamicStateCreateInfo.dynamicStateCount = static_cast<uint32_t>(pDynamicStates.size());
	pipelineDynamicStateCreateInfo.flags = flags;
	return pipelineDynamicStateCreateInfo;
}

最后在命令缓冲区阶段可以更改动态状态。

管道绑定

VkGraphicsPipelineCreateInfo pipeline;
pipelineCI.pDynamicState = &dynamicState;

创建多个管道:派生法

创建三个管道,分别对应三个不同的视口,并在绑定命令时候做出改变。

首先声明三个管道,分别是:

  • phong 正常光线
  • wireframe 线框模式
  • toon

struct {
   
	VkPipeline phong;
	VkPipeline wireframe;
	VkPipeline toon;
} pipelines;

void preparePipelines()
{
   
	VkGraphicsPipelineCreateInfo pipelineCreateInfo {
   };
	pipelineCreateInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
	pipelineCreateInfo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值