【问题标题】:Structure of output of fragment shader?片段着色器的输出结构?
【发布时间】:2021-04-27 13:25:31
【问题描述】:

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

layout(location = 0) out vec4 outColor;

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

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

在 Vulkan 规范中,9.9 Fragment Shaders 中似乎没有提到它,而 26 Fragment Operations 只是链接回 9.9。

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

有什么想法吗?

【问题讨论】:

  • 这里不清楚你需要“指定”什么。例如,“位置 0 的 out 变量应该包含输出颜色”这就是在片段着色器中将out 放在全局变量声明前面的意思。比如,else 是什么意思?这里缺少哪些“细节”?
  • @NicolBolas:所以在 GLSL 第 4.4.2 节中谈到片段着色器layout(location = 3) out vec4 color 将“片段颜色 3”确定为混合方程的第一个输入?肯定有某个地方指定了片段着色器输出的语义?
  • @NicolBolas:还有一个索引属性:layout(location = 3, index = 1) out vec4 factor;,它影响混合方程的输入索引。

标签: glsl vulkan


【解决方案1】:

Fragment Output Interface章:

对于不对应于片段着色器输出的组件,混合或颜色附件写入的输入值未定义。

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

任何无法以附件格式表示的值都是未定义的。对于任何其他附件格式,不执行任何转换。如果片段着色器写入的值的类型与相应颜色附件的格式不匹配,则这些组件的结果值是未定义的。

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

如果帧缓冲区颜色附件是VK_ATTACHMENT_UNUSED,则不会通过该附件执行写入。不会对大于或等于 VkSubpassDescription::colorAttachmentCountVkSubpassDescription2::colorAttachmentCount 值的帧缓冲区颜色附件执行写入操作。

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

GL_KHR_vulkan_glsl 伪扩展指定如何将 GLSL 转换为 SPIR-V。但基本上layout(location) 会转换为Location 等。

【讨论】:

  • 是的!第 15 章着色器接口,当然。谢谢,这正是我想要的。
猜你喜欢
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
相关资源
最近更新 更多