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

问题描述:

当我尝试从我的顶点传递一个浮点到片段着色器时出现奇怪的错误。GLSL变量不从顶点传递到片段着色器

顶点着色器:

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

片段沙der:

#version 450 

layout (location = 0) in float someFloat; 

void main() { 

// Some code using someFloat ... 
} 

但是我怎样才能做到这一点,而不必使用位置?

+0

连在了一起到同一个程序的着色器或者是你通过一个管道对象使用多个程序? –

+0

使用Vulkans的图形管道。我也有一个vec3数组,可以传入和传出,没有问题。 – Shedex

+1

“*使用Vulkans的图形管道*”然后你需要说,因为这对你的代码不工作非常重要。 –

根据KHR_vulkan_glsl,其支配GLSL的汇编成SPIR-V为福尔康:

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

强调增加。 OpenGL和Vulkan之间的GLSL并不完全相同。

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

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

+0

不知道OpenGL和Vulkan GLSL是不同的,谢谢澄清和帮助 – Shedex

您需要使用变量。

顶点着色器:

varying float someFloat; 

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

片段着色器:

varying float someFloat; 

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

从GLSL 4.20开始已经不推荐使用变体,所以如果你在做Vulkan(和现代GLSL),你应该远离它们并且随意进出Nical Bolas指出,地点限定符。 –

+0

对不起,我太老派了。 感谢您的任命。 –