在 vulkan 中,如果在单个渲染过程的生命周期内,您天真地渲染到包含多个附件的帧缓冲区,并使用渲染到所有附件的管道,然后使用仅渲染到其中一个的管道再次渲染,您将收到错误.
让我举个例子。
这是通过在反照率上编写线框获得的:
#version 450
#extension GL_ARB_separate_shader_objects : enable
layout(location = 0) out vec4 color_out;
layout(location = 1) out vec4 color_out1;
layout(location = 2) out vec4 color_out2;
layout(location = 3) out vec4 color_out3;
layout(location = 4) out vec4 color_out4;
void main()
{
color_out = vec4(1,1,1,1);
color_out1 = vec4(0,0,0,0);
color_out2 = vec4(0,0,0,0);
color_out3 = vec4(0,0,0,0);
color_out4 = vec4(0,0,0,0);
}
4 个“noop”输出并不是真正必要的,它们的存在只是为了防止 vulkan 错误。
假设我们改为这样做(并且我们也修改了我们的 pieline):
#version 450
#extension GL_ARB_separate_shader_objects : enable
layout(location = 0) out vec4 color_out;
void main()
{
color_out = vec4(1,1,1,1);
}
然后我们得到相同的图像。
但是存在一个关键的区别:
第二个图像产生多个错误,每个附件一个,如下所示:
Message ID name: UNASSIGNED-CoreValidation-Shader-InputNotProduced
Message: Attachment 1 not written by fragment shader; undefined values will be written to attachment
Severity: VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT
为什么根据规范不明确写入帧缓冲区的附件无效?即为什么不规范如果您不写入附件,则内容会被保留?