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

She*_*dex 0 glsl vulkan

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

顶点着色器:

#version 450

out float someFloat;

void main() {
someFloat = 1.0;
// some code ...
}
Run Code Online (Sandbox Code Playgroud)

片段着色器:

#version 450

in float someFloat;

void main() {

// some code using someFloat ...
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,总是传递零,而这是有效的:

顶点着色器:

 #version 450

 layout (location = 0) out float someFloat;

 void main() {

    someFloat = 1.0;

    // some code ...
 }
Run Code Online (Sandbox Code Playgroud)

片段着色器:

#version 450

layout (location = 0) in float someFloat;

void main() {

// Some code using someFloat ...
}
Run Code Online (Sandbox Code Playgroud)

但是,如何在不使用位置的情况下完成此操作?

Nic*_*las 5

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

当生成SPIR-V,所有inout合格用户声明的(非内置)变量和块(或所有它们的成员)必须有一个着色器指定location.否则,将生成编译时错误.

强调补充说.OpenGL和Vulkan之间的GLSL并不相同.

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

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