OpenGL着色器中奇怪的动态迭代错误

OpenGL着色器中奇怪的动态迭代错误,opengl,libgdx,glsl,shader,Opengl,Libgdx,Glsl,Shader,我正在尝试将浮点数组转换为vector2数组,因为浮点数组是我可以从Java代码传递到着色器的唯一数组。例如,我将float 3.8转换为vec23,8。但这是非常不相关的。真正的问题是,在for循环中添加某一行时,着色器停止工作。这是我的密码: attribute vec4 a_color; attribute vec3 a_position; attribute vec2 a_texCoord0; uniform float a_tileCoords[144]; uniform mat4

我正在尝试将浮点数组转换为vector2数组,因为浮点数组是我可以从Java代码传递到着色器的唯一数组。例如,我将float 3.8转换为vec23,8。但这是非常不相关的。真正的问题是,在for循环中添加某一行时,着色器停止工作。这是我的密码:

attribute vec4 a_color;
attribute  vec3 a_position;
attribute vec2 a_texCoord0;

uniform float a_tileCoords[144];
uniform mat4 u_projTrans;

varying vec4 v_color;
varying vec2 v_texCoord0;
varying vec2 v_tileCoords[144];

int length = 144;

void main(){
    v_color = a_color;
    v_texCoord0 = a_texCoord0;
    for(int i = 0; i < length; i++){
       int x = int(a_tileCoords[i]);
       int y = int((a_tileCoords[i] - int(a_tileCoords[i])) * 10);
       v_tileCoords[i] = vec2(x,y);
    }
    gl_Position = u_projTrans * vec4(a_position + vec3(0, 1, 0), 1.);
}

当我从for循环中删除该线时,着色器将再次工作,纹理将被绘制。但我当然希望这条线能起作用。因此,您的问题是:我可能做错了什么,或者这可能是我想要实现的吗?

可变向量的最大数量可以由您可以传递到下一个着色器阶段的向量数量决定并限制其数量。 我很肯定你超过了限制

另见以下问题:


变化向量的最大数量可由确定,并限制可传递到下一着色器阶段的向量数量。 我很肯定你超过了限制

另见以下问题:


我觉得你的设计不对。我想把我传递给着色器的浮点数组变成vector2数组。我正在尝试为照明编程着色器。tileCoords用于着色器了解光线无法通过的位置。着色器应用于窗口大小的透明覆盖。它还需要为光源的位置获取多个坐标。它将使像素离光源越近越透明,如果它们位于瓷砖内,则将使其不透明。也许你知道一种更好的方法,而不是将数据传递到着色器并仅使用一个窗口大小的纹理?我不太明白你在做什么,但解决方案可能是分两次传递。将遮挡数据绘制到帧缓冲区纹理。在第二个着色器中,从该texture.btw读取。错误不在线条本身,bespoken线条只是使着色器优化器无法完全优化循环和变化。我认为您的设计144个变化的Vec2不正确。我希望传递给着色器的浮点数组转换为vector2数组。我正在尝试为照明编程着色器。tileCoords用于着色器了解光线无法通过的位置。着色器应用于窗口大小的透明覆盖。它还需要为光源的位置获取多个坐标。它将使像素离光源越近越透明,如果它们位于瓷砖内,则将使其不透明。也许你知道一种更好的方法,而不是将数据传递到着色器并仅使用一个窗口大小的纹理?我不太明白你在做什么,但解决方案可能是分两次传递。将遮挡数据绘制到帧缓冲区纹理。在第二个着色器中,从该texture.btw读取。错误不在线条本身,bespoken线条只是使着色器优化器没有完全优化掉循环和变化。
v_tileCoords[i] = vec2(x,y);