我正在使用Vulkan API编写游戏引擎。我想使用VK_KHR_dynamic_rendering扩展,而不是使用渲染通道。
我正在使用graphics_pipeline_create_info.renderPass = VK_NULL_HANDLE;
创建一个图形管道,并将一个指针指向分配给graphics_pipeline_create_info.pNext
的VkPipelineRenderingInfo。
我的图形管道包含一个顶点着色器和一个片段着色器阶段。
我的VkPipelineRenderingInfo:
VkFormat color_attachment_formats = {VK_FORMAT_R32G32B32A32_SFLOAT};
VkPipelineRenderingCreateInfo rendering_create_info{VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO};
rendering_create_info.viewMask = 0;
rendering_create_info.colorAttachmentCount = 1;
rendering_create_info.pColorAttachmentFormats = &color_attachment_formats;
rendering_create_info.depthAttachmentFormat = VK_FORMAT_UNDEFINED;
rendering_create_info.stencilAttachmentFormat = VK_FORMAT_UNDEFINED;
字符串
但是在创建管道时,我得到了以下验证错误:[ VUID-VkGraphicsPipelineCreateInfo-pStages-06894 ] | MessageID = 0xdfcd6d41 | vkCreateGraphicsPipelines(): pCreateInfos[0] does not have fragment shader state, but stages (VK_SHADER_STAGE_VERTEX_BIT|VK_SHADER_STAGE_FRAGMENT_BIT) contains VK_SHADER_STAGE_FRAGMENT_BIT. The Vulkan spec states: If the pipeline requires pre-rasterization shader state but not fragment shader state, elements of pStages must not have stage set to VK_SHADER_STAGE_FRAGMENT_BIT (https://vulkan.lunarg.com/doc/view/1.3.268.0/linux/1.3-extensions/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-06894)
我不明白这条消息。一开始的错误是我没有指定一个片段着色器阶段,但我做得很正确(用调试器检查了值)。
第二件事是链接的规范条目:基本上,它说如果我的管道不需要片段着色器阶段,我就不应该提供任何。但是为什么我的管道不需要它呢?
有人能帮我吗?
我尝试修改VkPipelineRenderingCreateInfo::viewMask
,因为在VkGraphicsPipelineMask Info的描述中有一句话,说viewMask对片段着色器阶段有影响,但我不确定是如何影响的。
但是如果我给viewMask赋一个非0的值,它需要VK_KHR_multiview扩展,而我不需要。
1条答案
按热度按时间4ktjp1zp1#
我自己调查了这个问题:
问题是我将
VkPipelineRasterizationStateCreateInfo::rasterizerDiscardEnable
设置为VK_TRUE
。