骨格アニメーションの頂点シェーダに問題があります。一度に約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%。この頂点シェーダのパフォーマンスをどのように高めることができますか?できるだけシンプルで速く見えます。
"' ... '行をコメントアウトすると、パフォーマンスが約500%向上します。なぜこれはあなたを驚かせるのですか?シェーダは、2つの行列の乗算とコピーで構成されています。作業の半分を取り除くと、頂点シェーダが速く実行されることは驚くことではありません。さらに、コンパイラは 'boneMatrixes'を最適化できるので、あなたの行列データをアップロードする必要はありません。あなたがしなければならないことは、実際の問題の原因をより正確に特定することです。また、 'ARBShaderObjects'を使用して停止してください。コアGLSL機能を使用します。 –
@NicolBolas:boneMatrixesリファレンス(すなわちboneMatrixes [0]やboneMatrixes [1]など)で定数を使用すると、コードをコメントアウトした場合と同じレベルまでスピードアップすることが分かりました。それがなぜそれを知っていますか? –