【发布时间】:2020-02-22 20:08:42
【问题描述】:
在 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
为什么根据规范不明确写入帧缓冲区的附件无效?即为什么没有规范,如果您不写入附件,则内容会被保留?
【问题讨论】:
-
"第二张图片产生多个错误" 这些是警告,而不是错误。
-
很公平。为什么他们是一个警告?为什么不鼓励这种行为?
标签: c++ graphics vulkan validation-layers