C++ glsl顶点着色器glGetUniformLocation失败

C++ glsl顶点着色器glGetUniformLocation失败,c++,opengl,glsl,vertex-shader,uniform,C++,Opengl,Glsl,Vertex Shader,Uniform,我想在顶点着色器中设置统一向量 int loc = glGetUniformLocation(shader, "LightPos"); if (loc != -1) { //do Stuff } 问题是loc始终为-1。我用片段着色器中的一个变量进行了尝试,这确实有效。顶点着色器: uniform vec3 LightPos; varying vec2 UVCoord; varying float LightIntensity; void main() {

我想在顶点着色器中设置统一向量

int loc = glGetUniformLocation(shader, "LightPos");
if (loc != -1)
{
    //do Stuff
}
问题是loc始终为-1。我用片段着色器中的一个变量进行了尝试,这确实有效。顶点着色器:

uniform vec3 LightPos;
varying vec2 UVCoord;
varying float LightIntensity;

void main()
{           
    UVCoord = gl_MultiTexCoord0.st;
    gl_Position = ftransform();
    vec3 Normal = normalize(gl_NormalMatrix * gl_Normal);
    LightIntensity = max(dot(normalize(vec3(0, -10, 0)), Normal), 0.0);
}
片段着色器:

uniform sampler2D tex1;
varying vec2 UVCoord;
varying float LightIntensity;

void main()
{
    vec3 Color = vec3(texture2D(tex1, UVCoord));
    gl_FragColor = vec4(Color * LightIntensity, 1.0);
}
有人知道我做错了什么吗?

您实际上没有在着色器中使用LightPos,因此优化程序没有为其分配任何寄存器

如果不使用统一和属性,编译器可以自由优化它们

您实际上没有在着色器中使用LightPos,因此优化程序没有为其分配任何寄存器


如果不使用统一和属性,编译器可以自由优化它们

不幸的是,您误解了
glGetUniformLocation(…)
和统一位置分配在一般情况下的工作方式

仅在编译和链接着色器后才指定位置。这是一个两阶段操作,有效识别GLSL程序所有阶段(顶点、碎片、几何体、镶嵌)之间使用的输入和输出。由于
LightPos
未在顶点着色器中使用(或在其他任何地方使用),因此在链接程序时不会为其指定位置。它根本就不存在了

这就是术语活动制服的来源。和
glGetUniformLocation(…)
仅返回活动制服的位置


名称

-返回统一变量的位置

[……]

说明

glGetUniformLocation返回一个整数,该整数表示程序对象中特定统一变量的位置。名称必须是以null结尾且不包含空格的字符串。名称必须是程序中的活动统一变量名,该变量名不是结构、结构数组或向量或矩阵的子组件。如果名称与程序中的活动统一变量不对应,如果名称以保留前缀“gl_”开头,或者如果名称与原子计数器或命名统一块关联,则此函数返回-1


不幸的是,您误解了通用工程中的
glGetUniformLocation(…)
和统一位置分配

仅在编译和链接着色器后才指定位置。这是一个两阶段操作,有效识别GLSL程序所有阶段(顶点、碎片、几何体、镶嵌)之间使用的输入和输出。由于
LightPos
未在顶点着色器中使用(或在其他任何地方使用),因此在链接程序时不会为其指定位置。它根本就不存在了

这就是术语活动制服的来源。和
glGetUniformLocation(…)
仅返回活动制服的位置


名称

-返回统一变量的位置

[……]

说明

glGetUniformLocation返回一个整数,该整数表示程序对象中特定统一变量的位置。名称必须是以null结尾且不包含空格的字符串。名称必须是程序中的活动统一变量名,该变量名不是结构、结构数组或向量或矩阵的子组件。如果名称与程序中的活动统一变量不对应,如果名称以保留前缀“gl_”开头,或者如果名称与原子计数器或命名统一块关联,则此函数返回-1


标题很抱歉,忘了更改标题,忘了更改itvec3(0,-10,0)应该表示LightPos,在这里发布了错误的代码。@user3075425:嗯,另一个问题是,您不从着色器查询统一位置,因为问题中的第一行代码表明您正在尝试执行此操作—您从链接的程序对象中查询它们。vec3(0,-10,0)应该表示LightPos,在此处张贴错误的代码。@user3075425:好的,另一个问题是,您没有从着色器查询统一位置,因为问题中的第一行代码表明您正在尝试这样做-您从链接的程序对象查询它们。