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); |
注释掉
生产线提高了大约 500% 的性能。如何提高此顶点着色器的性能?它看起来尽可能简单和快速。
根据 GPU vendor和型号,这 128 个 4x4 矩阵可能使用多达 512 个统一组件。这太可怕了,而且也浪费了很多空间,因为真正有用的部分是 3x4。您可能希望将四元数作为一种将蒙皮信息上传到 GPU 并将它们转换为着色器中的矩阵的方法。