Android OpenGL ES 3.0矩阵阵列仅使用第一个矩阵

Android OpenGL ES 3.0矩阵阵列仅使用第一个矩阵,android,opengl-es,glsl,glsles,Android,Opengl Es,Glsl,Glsles,我正在我的顶点着色器中进行GPU蒙皮,该着色器在PC上运行良好,我正在将其移植到Android。我的顶点着色器如下所示,问题是MattTransform矩阵的创建似乎只使用boneMatrices中的第一个矩阵: #version 300 es precision highp float; precision highp int; //Uniform count: projectionMatrix(16) + modelViewMatrix(16) + MVPMatrix(16) + tex

我正在我的顶点着色器中进行GPU蒙皮,该着色器在PC上运行良好,我正在将其移植到Android。我的顶点着色器如下所示,问题是MattTransform矩阵的创建似乎只使用boneMatrices中的第一个矩阵:

#version 300 es

precision highp float;
precision highp int;

//Uniform count: projectionMatrix(16) + modelViewMatrix(16) + MVPMatrix(16) + textureMatrix(16) + normalMatrix(9) + lightMVPMatrices(16*5) + nShadowLights(1) + boneMatrices(16*boneMax)  = 73 + 1 + 16*shadowLightMax + 16*boneMax = (out of ~1024 components)
//GLSL ES (vectors): projectionMatrix(4) + modelViewMatrix(4) + MVPMatrix(4) + textureMatrix(4) + normalMatrix(3) + lightMVPMatrices(4*5) + nShadowLights(1) + boneMatrices(4*boneMax) = 19 + 4*shadowLightMax + 4*boneMax = 239 out of 256 vectors on Nexus 5 (shadowLightMax = 5, boneMax = 50, 17 vec4s remain, or 4 matrices and 1 vec4)
//Matrices
//uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix;
uniform mat4 MVPMatrix;
uniform mat4 textureMatrix;
uniform mat3 normalMatrix;
uniform mat4 lightMVPMatrices[5];
uniform int nShadowLights;

//Bones
uniform mat4 boneMatrices[50];

//Vertex information
in vec3 position;
in vec4 colour;
in vec2 texCoord;
in vec3 normal;
in vec3 boneWeights;
in vec4 boneIndices;

out vec4 _colour;
out vec2 _texCoord;
out vec3 _normal;
out vec3 _eyePos;
out vec4 _lightPos[5];

void main(void)
{
    vec4 positionSkinned;
    vec4 normalSkinned;

    mat4 matTransform = boneMatrices[int(boneIndices[0])] * boneWeights[0];
    matTransform += boneMatrices[int(boneIndices[1])] * boneWeights[1];
    matTransform += boneMatrices[int(boneIndices[2])] * boneWeights[2];
    float finalWeight = 1.0 - (boneWeights[0] + boneWeights[1] + boneWeights[2]);
    matTransform += boneMatrices[int(boneIndices[3])] * finalWeight;

    positionSkinned = matTransform * vec4(position, 1.0);
    //positionSkinned.w = 1.0;
    normalSkinned = matTransform * vec4(normal, 0.0);

    gl_Position = MVPMatrix * positionSkinned;
    _colour = colour;
    _texCoord = (textureMatrix * vec4(texCoord, 0.0, 1.0)).xy;
    _normal = normalize(normalMatrix * normalize(normalSkinned.xyz));
    _eyePos = (modelViewMatrix * positionSkinned).xyz;
    for(int i = 0; i < nShadowLights; i++)
        _lightPos[i] = lightMVPMatrices[i] * positionSkinned;
}
在片段着色器中执行以下操作:

gl_FragColor = _colour
在PC和Android上使用相同的颜色

3) 执行与上述相同的操作,但将_color设置为:

_colour = vec4(boneWeights[0], boneWeights[1], boneWeights[2], finalWeight);
我不知道还有什么可以尝试的,而且似乎只使用了第一个矩阵,出于某种原因,int(boneIndices[x])对任何x的结果都是0。这是一个带有OpenGL ES 3.0的Nexus5。救命啊


编辑:采纳Andon的建议,在boneIndices中使用ivec4而不是vec4不幸地导致了相同的结果,但至少这澄清了这不是float的铸造问题。现在我觉得自己像一个没有任何线索的警察://p>最终这似乎是Adreno驱动程序的一个限制,它不支持索引一个没有常量整数的统一矩阵数组,这与OpenGL ES规范中的强制要求相反。不过,一个解决方法是只使用一个统一的VEC4数组,因为它似乎支持使用变量对这些索引进行索引(就像在SDK中所做的那样)。

您使用浮点向量存储索引有什么特别的原因吗<代码>ivec4会更有意义。可以使用
glVertexAttribIPointer(…)
向整数顶点属性提供数据。在这个GLSL程序中,统一的位置可能也快用完了,一个由50个mat4组成的数组本身使用200个统一的位置,而GL ES 3.0只需要为您提供256个。如果这是一个片段着色器,你已经超过了224的限制。我记不清了,但我确实记得我刚才做这件事时有某种原因(我想是读到的)。我将尝试将其更改为使用整数,看看是否有效。同样是的,在注释中对着色器顶部的GL ES进行了统一空间计算:)我做了这些更改,不幸地得到了相同的结果。我还通过再次以color
\u color=vec4(float(boneIndices.x)、float(boneIndices.y)、float(boneIndices.z)、float(boneIndices.w)的形式输出ivec4 boneIndices来验证更改是否正确。是它在Windows上显示所有使用的骨骼矩阵的图像,是Android的屏幕截图,仅显示第一次使用的骨骼(使用颜色的骨骼索引)。如果您可以分享如何将50矩阵数组发送到顶点着色器,那将非常好。我正在努力解决这个问题。我将它们作为vec4数组而不是矩阵发送,因为Adreno SDK就是这样做的:
glUniform4fv(boneUniformLocation,bones.size()*16,(GLfloat*)和bones[0].value[0])其中bones是一个具有16个浮点的矩阵数组。
_colour = vec4(boneWeights[0], boneWeights[1], boneWeights[2], finalWeight);