glsl顶点着色器glGetUniformLocation失败

glsl vertex shader glGetUniformLocation fails

本文关键字:glGetUniformLocation 失败 顶点 glsl      更新时间:2023-10-16

我想在"顶点着色器"中设置一个统一的矢量。

int loc = glGetUniformLocation(shader, "LightPos");
if (loc != -1)
{
//do Stuff
}

问题是loc一直是-1。我用Fragment Shader中的一个变量进行了尝试,结果确实有效。顶点着色器:

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);
}

有人知道我做错了什么吗?

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

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

这就是术语activeuniform的由来。并且glGetUniformLocation (...)只返回活动制服的位置。


名称

glGetUniformLocation--返回统一变量的位置

[…]

描述

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

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

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

相关文章:
  • 没有找到相关文章