LWJGL Forum

Programming => OpenGL => Topic started by: isaacwaller on April 02, 2012, 20:47:34

Title: Slow vertex shader (skeletal animation)
Post by: isaacwaller on April 02, 2012, 20:47:34
Hi,

I'm having issues with my skeletal animation vertex shader. When animating about 32 models at once I can only get 60 fps, and on low end computers I get even less. Vertex shader below:


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;
 
}


Parameters are bound like:

    int boneMatrixesName = ARBShaderObjects.glGetUniformLocationARB(mProgramShader, "boneMatrixes");

    // matrixFloatBuffer is a FloatBuffer of size 128 * 16
    ARBShaderObjects.glUniformMatrix4ARB(boneMatrixesName, false, matrixFloatBuffer);


Commenting out the a = boneMatrixes[int(gl_Normal.x)] * gl_Vertex; line increases performance by about 500%. How can I increase performance for this vertex shader? It looks as simple and fast as possible. Any help would be much appreciated!
Title: Re: Slow vertex shader (skeletal animation)
Post by: CodeBunny on April 03, 2012, 12:13:14
How complex are the models? Is that a limiting factor?
Title: Re: Slow vertex shader (skeletal animation)
Post by: isaacwaller on April 03, 2012, 16:21:44
Using a less complex model slightly increases FPS but not by very much, I think the issue is more with the shader and not with the amount of geometry passing through it.
Title: Re: Slow vertex shader (skeletal animation)
Post by: spasi on April 03, 2012, 16:46:52
Try using a custom attribute for the bone index, instead of gl_Normal.x. It should be declared as an integer in the shader, but you may use the short type in your VBO.
Title: Re: Slow vertex shader (skeletal animation)
Post by: isaacwaller on April 03, 2012, 17:50:24
Thanks for the suggestion. I changed the code to use a custom vertex attribute, but I don't see any performance increase.
Title: Re: Slow vertex shader (skeletal animation)
Post by: isaacwaller on April 03, 2012, 17:56:52
I have changed the code so only the required amount of bones are transferred to the vertex shader. This means on static models with only 1 bone there is only 1 matrix being transferred, example:

ARBShaderObjects.glUniformMatrix4ARB(boneMatrixesName, false, (FLOATBUFFER OF LENGTH / SIZE 16));

However, performance is still terrible! Even though I am only transferring a single matrix in a floatbuffer, I only get around 200 fps. Commenting out the line in the vertex shader increases performance to over 5000FPS / second (this is with the small, static model with about 20 vertexes.) This is very strange! Does anyone have any ideas on what could be causing the slowdown?
Title: Re: Slow vertex shader (skeletal animation)
Post by: isaacwaller on April 03, 2012, 18:25:42
I have found that using a constant as the array index while accessing boneMatrixes brings performance up to the same level that I get when the whole line is commented out. Is the problem that I should not be using a vertex attribute as an array index? I can't think of any other way to do it.