OpenGL ES 2.0着色器统一变量表现出意外

时间:2014-10-24 21:43:34

标签: android opengl-es libgdx shader

我正在使用libGDX进行Android开发,主要在桌面上进行测试。我有一个完全按预期工作的着色器,但在Android上,一些统一变量看起来不正确且不一致。一些断言表明它们被正确地发送到着色器,而有些断言则表明它们不是。

片段着色器的部分:

uniform int L;
uniform vec2 center[10];

[...]

for (int i = 0; i != L; i++)
{
    if (i == 0 && center[0].x > 2.0)
    {
        color.b = 1.0;
    }
    if (center[i].x > 2.0)
    {
        color.g = 1.0;
    }
    [...]
}
[...]

程序输入第一个if语句而不是第二个,将屏幕变为蓝色。 (在我的桌面上,它正确渲染青色。)更重要的是,如果我使用Home按钮离开应用程序然后恢复它,它会将屏幕呈现为RED,即使我从未设置过真实渲染代码的结果(未显示)看起来好像center数组中的所有坐标都是(0; 0)处的未初始化位置。

并且L行为也有点奇怪 - 当循环条件为i < L而不是i != L时,手机似乎在循环中采用了太多次迭代。 (i < 3导致3次迭代,但i < L L == 3没有。)

为了发送数组,这些是我尝试过的方法:

shader.setUniform2fv("center[0]", new float[]{10, 9, 8, 7, 6, 5, 4, 3}, 0, 8);
shader.setUniformf("center[0]", 7, 8);
shader.setUniform2fv("center", new float[]{10, 9, 8, 7, 6, 5, 4, 3}, 0, 8);
shader.setUniform2fv(shader.fetchUniformLocation("center[0]", true), new float[]{10, 9, 8, 7, 6, 5, 4, 3}, 0, 8);
shader.setUniformf(shader.fetchUniformLocation("center[0]", true), 7, 8);
shader.setUniform2fv(shader.fetchUniformLocation("center", true), new float[]{10, 9, 8, 7, 6, 5, 4, 3}, 0, 8);

我单独尝试了每一个,结果总是一样的。 (我甚至无法通过uniformf调用单独推送单个Vector2 - 此处为第2行和第5行。)

完整,主要是最小的例子

在减少代码的同时,它也开始在桌面上表现得很奇怪。缩小的片段着色器(顶点着色器是默认值):

varying vec4 v_color;
varying vec2 v_texCoords;
varying vec4 pos;

uniform sampler2D u_texture;
uniform mat4 u_projTrans;

uniform vec2 center[4];

void main() {
    vec2 worldCoord = vec2(0);
    vec3 color = vec3(0);
    for (int i = 0; i < 4; i++)
    {
        if (i == 0 && center[0].x > 2.0)
        {
            color.b = 1.0;
        }
        if (center[i].x > 2.0)
        {
            color.g = 1.0;
        }
        color.r = 0.0001 * distance(worldCoord, center[i]);
        color += vec3(distance(worldCoord, center[i]),0,0);
    }
    gl_FragColor = vec4(color, 1.0) * texture2D(u_texture, v_texCoords);
}

从Java代码发送数组:

shader.setUniform2fv(shader.fetchUniformLocation("center[0]", true), new float[]{10, 9, 8, 7, 6, 5, 4, 3}, 0, 8);

桌面行为:

  • 当我在屏幕上渲染白色矩形时,就可以了 黄色 - 没有第一个输入第二个if子句。
  • 如果我删除了两条“红色修改”行中的任何一条(或两条),第一条就是 同样输入(屏幕青色/白色)。
  • 在删除其他统一参数之前,worldCoord是游戏单元中片段的坐标(根据世界大小,视口大小和片段位置计算每个参数)。 if子句的行为相同,但整个屏幕的红色通道为0 - 显然距离函数返回0.(屏幕绿色)

0 个答案:

没有答案