2012-04-02 12 views
2

骨格アニメーションの頂点シェーダに問題があります。一度に約32個のモデルをアニメーション化すると60fpsしか得られません。ローエンドのコンピュータではさらに少なくなります。下の頂点シェーダ:骨格アニメーションの頂点シェーダのパフォーマンスに関する問題

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%。この頂点シェーダのパフォーマンスをどのように高めることができますか?できるだけシンプルで速く見えます。

+2

"' ... '行をコメントアウトすると、パフォーマンスが約500%向上します。なぜこれはあなたを驚かせるのですか?シェーダは、2つの行列の乗算とコピーで構成されています。作業の半分を取り除くと、頂点シェーダが速く実行されることは驚くことではありません。さらに、コンパイラは 'boneMatrixes'を最適化できるので、あなたの行列データをアップロードする必要はありません。あなたがしなければならないことは、実際の問題の原因をより正確に特定することです。また、 'ARBShaderObjects'を使用して停止してください。コアGLSL機能を使用します。 –

+0

@NicolBolas:boneMatrixesリファレンス(すなわちboneMatrixes [0]やboneMatrixes [1]など)で定数を使用すると、コードをコメントアウトした場合と同じレベルまでスピードアップすることが分かりました。それがなぜそれを知っていますか? –

答えて

2

これらの128個の4x4マトリックスは、GPUのベンダーとモデルに応じて512個のユニフォームコンポーネントを使用できます。実際に役に立つ部分は3x4なので、それはひどいことですが、そのスペースの多くは無駄になります。スキン情報をGPUにアップロードし、それらをシェーダのマトリックスに変換する方法として、四元数をチェックアウトすることができます。

+0

興味の対象外ですが、ボーン行列をユニフォームとして一般的に行われているものを送信していますか、または2番目の頂点ストリームでそれを行う方法はありますか?私はこれについてどこかに読んだと思うが、詳細を忘れてしまった。:-(。 – Robinson

関連する問題