Я практикую анимацию с использованием костей / скинов. Я пытаюсь отправить шейдеру одну матрицу на вершину. Я могу думать об этих двух подходах.
Способ 1
У меня есть одна единая ручка для каждой костной матрицы, как это
u_Bone0 = GLES20.glGetUniformLocation(mProgram, "u_Bone[0]");
u_Bone1 = GLES20.glGetUniformLocation(mProgram, "u_Bone[1]");
и onDraw
я отправляю каждого из них в шейдер:
GLES20.glUniformMatrix4fv(u_Bone0, 1, false, matrix0, 0);
Это, очевидно, не очень хороший подход, если у меня есть большое количество матриц. Моя вторая идея, которую я еще не попробовал, так как есть много кода для рефакторинга
Способ 2
Это использовать, glUniformMatrix4fv
чтобы отправить их все сразу, как (предположим, у меня есть 20 матриц)
GLES20.glUniformMatrix4fv(u_Bones, 20, false, matrices, 0);
где matrices
находится float[16 * 20]
. Но тогда изменение матриц для каждой кости становится немного утомительным. Например, если я хочу получить 3-ю матрицу, мне нужно что-то вроде
float[] _3rd = Arrays.copy(matrices, 3*16, 4*16);
и сохранение значений может стать еще более раздражающим.
Я использую метод 1 сейчас, но он не выглядит очень умным ...
Каков наилучший способ отправки нескольких матриц в шейдер OpenGL ES 2?
LE: Я использую Android, поэтому я ищу решение Java.