【问题标题】:GLSL variable not passing from vertex to fragment shaderGLSL 变量未从顶点传递到片段着色器
【发布时间】:2020-02-12 00:20:00
【问题描述】:

尝试将浮点数从我的顶点传递到片段着色器时,我遇到了一个奇怪的错误。

顶点着色器:

#version 450

out float someFloat;

void main() {
someFloat = 1.0;
// some code ...
}

片段着色器:

#version 450

in float someFloat;

void main() {

// some code using someFloat ...
}

这行不通并且总是通过零,而这行得通:

顶点着色器:

 #version 450

 layout (location = 0) out float someFloat;

 void main() {

    someFloat = 1.0;

    // some code ...
 }

片段着色器:

#version 450

layout (location = 0) in float someFloat;

void main() {

// Some code using someFloat ...
}

但是我怎样才能在不使用位置的情况下做到这一点呢?

【问题讨论】:

  • 着色器是链接到同一个程序中还是通过管道对象使用多个程序?
  • 我正在使用 Vulkans 的图形管道。我还有一个 vec3 数组,可以毫无问题地传入和传出。
  • "我正在使用 Vulkans 的图形管道" 那么你需要这么说,因为这对你的代码为什么不起作用非常重要。

标签: glsl vulkan


【解决方案1】:

根据KHR_vulkan_glsl,它负责将 GLSL 编译为 Vulkan 的 SPIR-V:

在生成 SPIR-V 时,所有 inout 合格的用户声明(非内置)变量和块(或其所有成员)必须具有着色器指定的 location强>。否则会产生编译时错误。

添加了重点。 GLSL 在 OpenGL 和 Vulkan 之间并不完全相同。

这当然是因为 SPIR-V 不允许 GLSL 在阶段之间按名称进行资源匹配(因为 SPIR-V 变量不必具有名称)。它只按位置进行。而不是要求编译器生成与其他阶段中名称指定的位置匹配的位置,它只需要用户直接在着色器中拼出位置。

你应该从你的 GLSL 编译器中得到一个错误。

【讨论】:

  • 不知道 OpenGL 和 Vulkan GLSL 是不同的,感谢您的澄清和帮助
【解决方案2】:

您需要使用可变变量。

顶点着色器:

varying float someFloat;

void main() {
  someFloat = 1.0;
  // some code ...
}

片段着色器:

varying float someFloat;

void main() {
  // some code using someFloat ...
}

【讨论】:

  • 自 GLSL 4.20 起,Varyings 已被弃用,因此,如果您正在使用 Vulkan(和现代 GLSL),您应该远离它们,并使用 Nical Bolas 指出的带有位置的输入/输出限定符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多