glsl顶点着色器glGetUniformLocation失败
glsl vertex shader glGetUniformLocation fails
我想在"顶点着色器"中设置一个统一的矢量。
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
相关文章:
- 没有找到相关文章