2012-04-02 145 views
2

我遇到了我的骨骼动画顶点着色器问题。当一次动画大约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%。我该如何提高这个顶点着色器的性能?它看起来尽可能简单和快速。

+2

“注释出”......“行可将性能提高约500%。”为什么这让你感到惊讶?着色器由两个矩阵相乘和一个副本组成。如果拿走它的一半工作量,顶点着色器运行得更快并不奇怪。另外,编译器可以优化'boneMatrixes',所以它不必上传矩阵数据。你需要做的是更好地定位实际问题的根源。另外,停止使用'ARBShaderObjects'。使用核心GLSL功能。 – 2012-04-02 21:12:15

+0

@NicolBolas:我发现如果我在boneMatrixes参考(如boneMatrixes [0]或boneMatrixes [1]等等)中使用常量,它会加速到与刚刚注释掉代码相同的级别。你知道它为什么这样做吗? – 2012-04-03 21:43:00

回答

2

根据GPU供应商和型号,这128个4x4矩阵可能会使用多达512个统一组件。这是非常可怕的,同时也浪费了很多空间,因为实际上有用的部分是3x4。您可能希望查看四元数作为向GPU上传蒙皮信息并将其转换为着色器中的矩阵的方法。

+0

出于兴趣,将骨骼矩阵作为制服发送通常做的事情,还是有办法用第二个顶点流来做呢?我想我在某个地方读过这篇文章,但我忘记了细节。:-(。 – Robinson 2012-04-02 21:57:27