片段着色器的输出结构?

Structure of output of fragment shader?

在 GLSL 中为 Vulkan 编写片段着色器时,我想我已经通过示例了解到片段的颜色可以像这样输出:

layout(location = 0) out vec4 outColor;

void main() {
    outColor = /*...*/;
}

我的问题是,这在 Vulkan 或 GLSL 规范中的何处指定?即位置 0 的 out 变量应包含输出颜色,其类型可以是(必须是?)vec4?

在 Vulkan 规范中,它似乎没有在 9.9 片段着色器中提及,而 26 片段操作只是链接回 9.9。

GLSL 规范有两段概述 2.5 片段处理器,没有详细说明。在 7.1.5。 Fragment Shader Special Variables 它列出了全局变量,但没有提到“out”变量。布局限定符下有一些讨论,但似乎不是很具体。

有什么想法吗?

Fragment Output Interface章节:

The input values to blending or color attachment writes are undefined for components which do not correspond to a fragment shader output.

所以基本上你可以用不同于 vec4 的方式来定义它。例如。逐个组件。但是你忽略的输出将是垃圾。

Any value that cannot be represented in the attachment’s format is undefined. For any other attachment format no conversion is performed. If the type of the values written by the fragment shader do not match the format of the corresponding color attachment, the resulting values are undefined for those components.

因此,如果格式不匹配,则输出将是垃圾。

If the framebuffer color attachment is VK_ATTACHMENT_UNUSED, no writes are performed through that attachment. Writes are not performed to framebuffer color attachments greater than or equal to the VkSubpassDescription::colorAttachmentCount or VkSubpassDescription2::colorAttachmentCount value.

所以我认为理论上您也可以声明比附件更多的输出。

GL_KHR_vulkan_glsl pseudoextension 指定如何将 GLSL 转换为 SPIR-V。但是基本上layout(location)翻译成Location,等等