我遇到了我的骨骼动画顶点着色器问题。当一次动画大约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中,我使用的OpenGL LWJGL结合:)
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%。我该如何提高这个顶点着色器的性能?它看起来尽可能简单和快速。
“注释出”......“行可将性能提高约500%。”为什么这让你感到惊讶?着色器由两个矩阵相乘和一个副本组成。如果拿走它的一半工作量,顶点着色器运行得更快并不奇怪。另外,编译器可以优化'boneMatrixes',所以它不必上传矩阵数据。你需要做的是更好地定位实际问题的根源。另外,停止使用'ARBShaderObjects'。使用核心GLSL功能。 – 2012-04-02 21:12:15
@NicolBolas:我发现如果我在boneMatrixes参考(如boneMatrixes [0]或boneMatrixes [1]等等)中使用常量,它会加速到与刚刚注释掉代码相同的级别。你知道它为什么这样做吗? – 2012-04-03 21:43:00