我想在我的顶点着色器中设置一个统一的矢量。
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);
}
有人知道我做错了吗?
答案 0 :(得分:5)
不幸的是,您误解了glGetUniformLocation (...)
和统一的位置分配在一般情况下是如何运作的。
仅在编译和链接着色器后指定位置。这是一个两阶段操作,只能有效识别GLSL程序所有阶段(顶点,片段,几何,曲面细分)之间的 使用的 输入和输出。由于您的顶点着色器(或其他任何地方)未使用LightPos
,因此在链接程序时不会为其分配位置。它根本不存在。
这是术语 活动 制服的来源。并且glGetUniformLocation (...)
仅返回活动制服的位置。
命名强>
glGetUniformLocation
- 返回统一变量的位置[...]
<强>描述强>
glGetUniformLocation 返回一个整数,表示程序对象中特定统一变量的位置。 name必须是不包含空格的空终止字符串。 name必须是程序中的 活动统一 变量名,该变量名不是结构,结构数组或向量或矩阵的子组件。如果name与程序中的活动统一变量不对应,如果name以保留前缀&#34; gl _&#34;开头,或者name与原子计数器或命名统一块相关联,则此函数返回-1。 / p>
答案 1 :(得分:0)
你实际上并没有在着色器中使用 LightPos,所以优化器没有为它分配任何寄存器
编译器可以自由地优化制服,并在不使用时将其归属