![](/img/trans.png)
[英]glGetUniformLocation() returning -1 even though used in vertex shader
[英]glsl vertex shader glGetUniformLocation fails
我想在我的顶点着色器中设置一个统一的Vector。
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);
}
有人知道我在做什么错吗?
不幸的是,您误解了glGetUniformLocation (...)
和统一位置分配在一般情况下的工作方式。
仅在编译和链接了着色器之后才分配位置。 这是一个两阶段操作,可有效地仅识别GLSL程序的所有阶段(顶点,片段,几何,细分)之间使用的输入和输出。 由于LightPos
未在您的顶点着色器(或其他任何地方)中使用,因此在链接程序时未为其分配位置。 它根本不存在。
这是主动制服一词的来历。 glGetUniformLocation (...)
仅返回活动制服的位置。
名称
glGetUniformLocation
—返回统一变量的位置[...]
描述
glGetUniformLocation返回一个整数,该整数表示程序对象中特定统一变量的位置。 名称必须是不包含空格的以空终止的字符串。 名称必须是程序中的活动统一变量名称,该名称不是结构,结构数组或向量或矩阵的子组件。 如果名称不对应于程序中的活动统一变量,或者名称以保留前缀“ gl_”开头,或者名称与原子计数器或命名统一块关联,则此函数返回-1。
您实际上并没有在着色器中使用 LightPos,因此优化程序没有为其分配任何寄存器
编译器可以自由地优化制服并在不使用制服的情况下进行归因
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.