我的骨骼动画顶点着色器有问题。当一次制作大约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并将其转换为着色器中的矩阵的方法。