我的骨架动画顶点着色器出现问题。当一次动画大约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%。如何提高此顶点着色器的性能?它看起来尽可能简单快捷。
答案 0 :(得分:2)
根据GPU供应商和型号的不同,这些128个4x4矩阵可能会使用多达512个统一组件。这是非常多的,而且浪费了很多空间,因为实际有用的部分是3x4。您可能需要查看四元数作为将外观信息上传到GPU并将其转换为着色器中的矩阵的方法。