我阅读了很多关于将 vector 和矩阵等值从顶点着色器阶段传递到片段着色器的文章和帖子。但我仍然不确定这一点: 如果您在顶点着色器中有一些输出变量(我称他为 vtxs),在片段着色器(frgs)中有一些变量,OpenGl 如何关联它们以便它们引用相同的值(我忽略了值传递的事实到 frgs 被插值)?我必须按某种顺序写下来吗?如果我这样写,OpenGl 如何解释这些变量:
vtxs:
out float x;
out vec4 mvp;
frgs:
in vec4 mvp;
in float x;
in double newvar;
注意:我打乱了 var 类型,frgs 中的 var 和 vtxs 中的 out var 多了 1 个。
我看到布局列表中的位置规范是分配...地址的一种方式? ... 到一个变量,但我有一个古老的上网本不支持这样的变量装饰器。
作为提示:您知道某种调试着色器吗?我的意思是,在 cpu 程序中你可以添加一些 printfs 但我没有在 glsl 中看到这样的函数......
所以,总结一下,这是我的问题:
你到底用 layout(location=...) 指定了什么关于着色器的结果?
各个着色器阶段之间的值匹配/关联如何工作?有和没有那个“位置=”?
调试 glsl 着色器
最佳答案
默认情况下,输入和输出在接口(interface)之间按名称匹配。对于顶点着色器输入,索引的默认“自动”分配是 arbitrary ,从某种意义上说,它可能因实现而异。
layout
限定符允许明确指定输入\输出的存储类型和位置。由于顶点输入的自动分配是任意的,您应该使用 GLSL 中的 layout
位置或函数 glBindAttribLocation
来保证苹果是苹果,橙子是橙子。
所以 layout
规范在顶点着色器中很常见。但它可以在任何接口(interface)之间使用。例如,如果您没有为 vec4
和 float
使用相同的名称,您就可以使用
vtxs:
layout(location = 0) out float x;
layout(location = 1) out vec4 mvp;
frgs:
layout(location = 0) in float y;
layout(location = 1) in vec4 pvm;
现在界面中不存在的任何输入都会破坏管道。如果你使用一个新的变量
in double newvar;
那么 glLinkProgram
就会失败。
调试:
调试的第一步是检查状态着色器编译和链接。失败时,您可以使用 glGetShaderInfoLog
检索错误。
//compilation
glCompileShader(shader);
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if(!success)
{
GLchar infoLog[512];
glGetShaderInfoLog(shader, 512, NULL, infoLog);
}
//program
glLinkProgram(shaderProgram);
GLint success;
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if(!success)
{
GLchar infoLog[512];
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
}
你也可以
关于c - OpenGL 着色器变量传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35414760/