1

我正在尝试通过统一数组将光和浅色信息传递给我的着色器。我在我的着色器中声明了这些:

     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。

难道我做错了什么?还是在这种情况下我应该使用属性?

4

3 回答 3

1

您的着色器看起来是正确的(有关非常相似的声明,请参见“ESSL 规范”的第 4.1.9 节),您的 API 代码也是如此。

我最好的猜测是,当您查询统一位置时出现问题,并且一个或多个位置返回为 -1。如果返回 -1,请在每次调用 glGetUniformLocation 后尝试检查。

(在您发布的绘图代码中调用 glGetUniformLocation 时使用的名称与您问题中的着色器代码不匹配。这可能是您要查找的错误。)

于 2013-06-11T21:20:45.277 回答
0

好吧我解决了。

我在一个类中创建了我的数组,然后通过构造函数将其传递给我的 Lights 类。我的灯光类将此数组分配给私有 float* 灯光位置。这是错误值的来源,因为我认为(如果有人能说清楚的话)我正在传递数组的地址。当我创建一个普通数组(float test[8])时,传递给着色器的值是正确的。

于 2013-06-16T09:14:14.540 回答
-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) 
};
于 2013-06-11T16:30:21.920 回答