我正在使用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);
桌面行为: