GLSL变量不从顶点传递到片段着色器

GLSL variable not passing from vertex to fragment shader

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

顶点着色器:

#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 ...
}

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

根据 KHR_vulkan_glsl,它管理将 GLSL 编译到 SPIR-V for Vulkan:

When generating SPIR-V, all in and out qualified user-declared (non built-in) variables and blocks (or all their members) must have a shader-specified location. Otherwise, a compile-time error is generated.

添加了重点。 OpenGL 和 Vulkan 之间的 GLSL 不相同。

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

您的 GLSL 编译器应该会出错。

您需要使用可变变量。

顶点着色器:

varying float someFloat;

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

片段着色器:

varying float someFloat;

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