GLSL统一数组的值不正确

时间:2013-06-11 12:39:57

标签: android android-ndk opengl-es-2.0 glsl

我正在尝试通过统一数组将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。

我做错了吗?或者我应该在这种情况下使用属性吗?

3 个答案:

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