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



我的骨骼动画顶点着色器有问题。当一次制作大约32个模型的动画时,我只能获得60帧/秒的速度,而在低端电脑上,我的速度甚至更低。下面的顶点着色器:

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

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

最新更新