Проблемы производительности с вершинным шейдером скелетной анимации - PullRequest
2 голосов
/ 03 апреля 2012

У меня проблемы с вершинным шейдером скелетной анимации.При анимации около 32 моделей одновременно я могу получить только 60 кадров в секунду, а на младших компьютерах - даже меньше.Вершинный шейдер ниже:

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%.Как повысить производительность этого вершинного шейдера?Это выглядит максимально просто и быстро.

1 Ответ

2 голосов
/ 03 апреля 2012

В зависимости от поставщика и модели графического процессора эти 128 матриц 4x4 могут использовать до 512 однородных компонентов.Это ужасно много, а также много этого места потрачено впустую, поскольку фактически полезная часть - 3х4.Вы можете использовать кватернионы как метод загрузки информации о скинах в графический процессор и преобразования их в матрицы в шейдере.

...