2012-04-02 6 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; 

} 

매개 변수가 (이 자바 있음을 유의하시기 바랍니다 같이 묶여있다 , 내가 바인딩 :

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; 라인을 주석 LWJGL는 OpenGL을 사용하고 약하여 성능을 향상 500 %. 이 버텍스 쉐이더의 성능을 높이려면 어떻게해야합니까? 가능한 간단하고 신속하게 보입니다.

+2

"'... '행을 주석 처리하면 성능이 약 500 % 향상됩니다." 왜 당신을 놀라게합니까? 셰이더는 두 행렬 곱셈과 복사본으로 구성됩니다. 작업의 절반을 제거하면 버텍스 쉐이더가 더 빠르게 실행된다는 것은 놀랄 일이 아닙니다. 또한, 컴파일러는'boneMatrixes'를 최적화 할 수 있으므로 매트릭스 데이터를 업로드 할 필요가 없습니다. 당신이해야 할 일은 실제 문제의 원인을 더 잘 현지화하는 것입니다. 또한,'ARBShaderObjects'를 사용하지 마세요. 핵심 GLSL 기능을 사용하십시오. –

+0

@NicolBolas : boneMatrixes 참조 (예 : boneMatrixes [0] 또는 boneMatrixes [1] 등 ...)에서 상수를 사용하면 코드를 주석 처리 한 것과 같은 수준으로 속도가 빨라진다는 것을 발견했습니다. 왜 그렇게하는지 아십니까? –

답변

2

GPU 공급 업체 및 모델에 따라이 128 개의 4x4 매트릭스는 512 개의 균일 한 구성 요소를 사용할 수 있습니다. 실제로는 유용한 부분이 3x4이므로 많은 양의 공간이 낭비됩니다. 스키닝 정보를 GPU에 업로드하고이를 셰이더의 행렬로 변환하는 방법으로 쿼터니언을 체크 아웃 할 수 있습니다.

+0

뼈 매트릭스를 유니폼으로 일반적으로 완료된 것으로 보내거나 두 번째 버텍스 스트림으로이를 수행하는 방법이 있습니까? 나는 이것에 대해 어딘가에 대해 읽은 것 같지만, 나는 세부 사항을 잊었다. :-(. – Robinson

관련 문제