Я практикую анимацию с использованием костей / скинов. Я пытаюсь отправить шейдеру одну матрицу на вершину. Я могу думать об этих двух подходах.
Способ 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.
Ответы:
Посылка нескольких матриц в шейдер проста:
Shader:
Программа:
Однако изменение матриц для каждой кости не связано с тем, как вы передаете их шейдеру. Вы можете упростить изменения, если будете работать со структурами, а не с массивом чисел.
источник
Я бы предложил использовать VBO. Заполните VBO матрицами и передайте их, используя атрибут вместо униформы. Таким образом, VBO будет распределять новый mat4 за проход вершины в шейдере.
Когда вы связываете VBO перед рисованием (или создаете VAO для этих состояний):
Посмотрите, как передать mat4 как атрибут: /programming/17355051/using-a-matrix-as-vertex-attribute-in-opengl3-core-profile
Надеюсь это поможет
источник
Метод 1 может быть расширен за счет использования массивов для абстрагирования количества матриц в коде: (при условии, что Java)
а затем, когда вы устанавливаете матрицы, вы можете сделать
источник