Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GLSL变量未从顶点传递到片段着色器_Glsl_Vulkan - Fatal编程技术网

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

GLSL变量未从顶点传递到片段着色器,glsl,vulkan,Glsl,Vulkan,在尝试将浮点从顶点传递到片段着色器时,我遇到了一个奇怪的错误 顶点着色器: #version 450 out float someFloat; void main() { someFloat = 1.0; // some code ... } #version 450 layout (location = 0) out float someFloat; void main() { someFloat = 1.0; // some code ... } va

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

顶点着色器:

#version 450

out float someFloat;

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

 layout (location = 0) out float someFloat;

 void main() {

    someFloat = 1.0;

    // some code ...
 }
varying 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) in float someFloat;

void main() {

// Some code using someFloat ...
}
varying float someFloat;

void main() {
  // some code using someFloat ...
}
这将不起作用,并且始终通过零,而这起作用:

顶点着色器:

#version 450

out float someFloat;

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

 layout (location = 0) out float someFloat;

 void main() {

    someFloat = 1.0;

    // some code ...
 }
varying 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) in float someFloat;

void main() {

// Some code using someFloat ...
}
varying float someFloat;

void main() {
  // some code using someFloat ...
}
但是,我如何在不使用位置的情况下做到这一点呢?

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

生成SPIR-V时,所有
in
out
合格用户声明(非内置)变量和块(或其所有成员)必须指定一个着色器
位置
。否则,将生成编译时错误

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

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

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

根据,它控制将GLSL编译为Vulkan的SPIR-V:

生成SPIR-V时,所有
in
out
合格用户声明(非内置)变量和块(或其所有成员)必须指定一个着色器
位置
。否则,将生成编译时错误

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

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


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

您需要使用一个可变变量

顶点着色器:

#version 450

out float someFloat;

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

 layout (location = 0) out float someFloat;

 void main() {

    someFloat = 1.0;

    // some code ...
 }
varying 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) in float someFloat;

void main() {

// Some code using someFloat ...
}
varying float someFloat;

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

您需要使用可变变量

顶点着色器:

#version 450

out float someFloat;

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

 layout (location = 0) out float someFloat;

 void main() {

    someFloat = 1.0;

    // some code ...
 }
varying 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) in float someFloat;

void main() {

// Some code using someFloat ...
}
varying float someFloat;

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

着色器是链接到同一个程序中,还是通过管道对象使用多个程序?我使用Vulkans的图形管道。我还有一个vec3数组,可以毫无问题地通过输入和输出。“我在使用Vulkans的图形管道”,然后你需要说,这对于你的代码无法工作非常重要。着色器是链接到同一个程序中,还是通过管道对象使用多个程序?我在使用Vulkans的图形管道。我还有一个vec3数组,可以毫无问题地通过输入和输出。“我在使用Vulkan的图形管道”,然后你需要说,因为这对你的代码不工作非常重要。我不知道OpenGL和Vulkan GLSL是不同的,感谢你的澄清和帮助我不知道OpenGL和Vulkan GLSL是不同的,感谢您的澄清和帮助,自GLSL 4.20起,Varyings已被弃用,因此,如果您正在使用Vulkan(和现代GLSL),您应该远离它们,并使用带有位置的in/out限定符,正如Nical Bolas指出的。自GLSL 4.20起,Varyings已被弃用,因此如果您正在使用Vulkan(和现代GLSL)你应该远离他们,按照Bolas所指出的位置使用入/出限定符。