В vulkan, если за время жизни одного прохода рендеринга вы наивно визуализируете в фрейм-буфер, который содержит несколько Attachemnts с конвейером, который рендерится всем им, а затем снова рендеринг с конвейером, который рендерит только одному из них, вы будете получить ошибку.
Позвольте мне привести пример.
Рассмотрим следующее изображение, которое является промежуточным шагом в многопроходном эффекте.
Что получается при написании каркаса поверх альбедо:
#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 выхода "n oop" на самом деле не нужны они существуют просто для предотвращения ошибок вулканов.
Давайте предположим, что мы вместо этого делаем это (и мы также модифицируем наш пиелин):
#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? то есть, почему spe c не означает, что если вы не пишете вложение, содержимое сохраняется?