我正在尝试通过统一数组将light和lightcolor信息传递给我的着色器。 我在我的着色器中声明了这些:
uniform vec2 lightpositions[4];
uniform vec4 lightcolors[4];
在我的代码(C ++)中:
float lightpositions[8] = {
150, 150,
(float) screenWidth - 150, 150,
(float) screenWidth - 150, (float) screenHeight - 150,
150, (float) screenHeight - 150
};
float lightcolors[16] = {
1.0, 0.0, 0.0, 1.0,
1.0, 1.0, 0.0, 1.0,
1.0, 0.0, 1.0, 1.0,
0.0, 1.0, 1.0, 1.0
};
glUniform2fv(lightposHandle, amount, lightpositions);
checkGlError("lightPositions");
glUniform4fv(lightcolorHandle, amount, lightcolors);
checkGlError("lightColors");
在这种情况下,金额为4。
当我检查我的OpenGL ES调试器(PerfHud ES)时,我发现数组中的值几乎是随机的,如1.4e + 02。
我做错了吗?或者我应该在这种情况下使用属性吗?
答案 0 :(得分:1)
您的着色器看起来是正确的(请参阅"ESSL specification"的第4.1.9节以获取非常类似的声明),您的API代码也是如此。
我最好的猜测是,当您查询统一位置时出现问题,并且一个或多个位置返回为-1。如果返回-1,请在每次调用glGetUniformLocation后尝试检查。
(您发布的绘图代码中对glGetUniformLocation的调用中使用的名称与您问题中的着色器代码不匹配。这可能是您正在寻找的错误。)
答案 1 :(得分:0)
好吧,我解决了。
我在一个类中创建了我的数组,然后通过构造函数传递给我的Lights类。 我的light类将此数组分配给私有float * lightpositions。这是错误值的来源,因为我认为(如果有人能说清楚的话)我正在传递数组的地址。当我创建一个普通数组(float test [8])时,传递给着色器的值是正确的。
答案 2 :(得分:-1)
您不能在OpenGL ES 2.0着色器代码中使用这样的数组表示法。这是一个3.0功能。
另外,我会在另一个具有不同OpenGL ES驱动程序的平台上尝试它。您可能还需要精度说明符,如下所示:
uniform highp vec2 lightpositions[4];
uniform highp vec4 lightcolors[4];
对于OpenGL ES 3.0,您需要将数组构造为vec3数组,如下所示:
vec3 lightcolors[6] =
{
vec3(1.0f, 0.0f, 0.0f), vec3(0.0f, 1.0f, 0.0f), vec3(0.0f, 0.0f, 1.0f),
vec3(1.0f, 1.0f, 0.0f), vec3(1.0f, 0.0f, 1.0f), vec3(0.0f, 1.0f, 1.0f)
};