我的骨骼动画顶点着色器遇到问题。当同时制作大约 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;
}
参数是这样绑定(bind)的(请注意,这是Java,我使用的是LWJGL OpenGL绑定(bind):)
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 并在着色器中将其转换为矩阵的方法。
关于opengl - 骨骼动画顶点着色器的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9983679/