骨架动画顶点着色器的性能问题

时间:2012-04-02 20:54:17

标签: opengl glsl lwjgl

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

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绑定:)

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%。如何提高此顶点着色器的性能?它看起来尽可能简单快捷。

1 个答案:

答案 0 :(得分:2)

根据GPU供应商和型号的不同,这些128个4x4矩阵可能会使用多达512个统一组件。这是非常多的,而且浪费了很多空间,因为实际有用的部分是3x4。您可能需要查看四元数作为将外观信息上传到GPU并将其转换为着色器中的矩阵的方法。