Я займаюся анімацією, використовуючи кістки / шкіру. Я намагаюся надсилати шейдер по одній матриці на вершину. Я можу придумати ці два підходи.
Спосіб 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.