스켈 레탈 애니메이션 버텍스 쉐이더에 문제가 있습니다. 한 번에 약 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 %. 이 버텍스 쉐이더의 성능을 높이려면 어떻게해야합니까? 가능한 간단하고 신속하게 보입니다.
"'... '행을 주석 처리하면 성능이 약 500 % 향상됩니다." 왜 당신을 놀라게합니까? 셰이더는 두 행렬 곱셈과 복사본으로 구성됩니다. 작업의 절반을 제거하면 버텍스 쉐이더가 더 빠르게 실행된다는 것은 놀랄 일이 아닙니다. 또한, 컴파일러는'boneMatrixes'를 최적화 할 수 있으므로 매트릭스 데이터를 업로드 할 필요가 없습니다. 당신이해야 할 일은 실제 문제의 원인을 더 잘 현지화하는 것입니다. 또한,'ARBShaderObjects'를 사용하지 마세요. 핵심 GLSL 기능을 사용하십시오. –
@NicolBolas : boneMatrixes 참조 (예 : boneMatrixes [0] 또는 boneMatrixes [1] 등 ...)에서 상수를 사용하면 코드를 주석 처리 한 것과 같은 수준으로 속도가 빨라진다는 것을 발견했습니다. 왜 그렇게하는지 아십니까? –