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

时间:2017-06-20 15:56:29

标签: glsl vulkan

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

顶点着色器:

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

但是如何在不使用位置的情况下执行此操作?

2 个答案:

答案 0 :(得分:5)

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

  

生成SPIR-V时,所有inout限定的用户声明(非内置)变量和块(或其所有成员)必须具有着色器指定的{ {1}} 即可。否则,将生成编译时错误。

重点补充。 OpenGL和Vulkan之间的GLSL并不相同。

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

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

答案 1 :(得分:0)

您需要使用变量变量。

顶点着色器:

varying float someFloat;

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

片段着色器:

varying float someFloat;

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