关于opengl:骨骼动画顶点着色器的性能问题

Performance issues with skeletal animation vertex shader

我的骨骼动画顶点着色器出现问题。当一次为大约 32 个模型制作动画时,我只能获得 60 fps,而在低端计算机上我获得的甚至更少。下面的顶点着色器:

1
2
3
4
5
6
7
8
9
10
11
12
13
uniform mat4 boneMatrixes[128];

void main(){

  vec4 a = gl_Vertex;

  // Apply bone transformation
  a = boneMatrixes[int(gl_Normal.x)] * gl_Vertex;

  gl_Position = gl_ModelViewProjectionMatrix * a;
  gl_TexCoord[0] = gl_MultiTexCoord0;

}

参数是这样绑定的(请注意这是Java,我使用的是LWJGL OpenGL绑定:)

1
2
3
4
int boneMatrixesName = ARBShaderObjects.glGetUniformLocationARB(mProgramShader,"boneMatrixes");

// matrixFloatBuffer is a FloatBuffer of size 128 * 16
ARBShaderObjects.glUniformMatrix4ARB(boneMatrixesName, false, matrixFloatBuffer);

注释掉 a = boneMatrixes[int(gl_Normal.x)] * gl_Vertex;
生产线提高了大约 500% 的性能。如何提高此顶点着色器的性能?它看起来尽可能简单和快速。


根据 GPU vendor和型号,这 128 个 4x4 矩阵可能使用多达 512 个统一组件。这太可怕了,而且也浪费了很多空间,因为真正有用的部分是 3x4。您可能希望将四元数作为一种将蒙皮信息上传到 GPU 并将它们转换为着色器中的矩阵的方法。