Estoy practicando animaciones usando huesos / desollado. Estoy tratando de enviar al sombreador una matriz por vértice. Puedo pensar en estos dos enfoques.
Método 1
Tengo un mango uniforme para cada matriz ósea como este
u_Bone0 = GLES20.glGetUniformLocation(mProgram, "u_Bone[0]");
u_Bone1 = GLES20.glGetUniformLocation(mProgram, "u_Bone[1]");
y en el onDraw
envío cada uno de ellos al sombreador:
GLES20.glUniformMatrix4fv(u_Bone0, 1, false, matrix0, 0);
Obviamente, este no es un buen enfoque si tengo una gran cantidad de matrices. Mi segunda idea, que aún no he probado, ya que hay mucho código para refactorizar
Método 2
Es usar el glUniformMatrix4fv
para enviarlos todos a la vez como (supongo que tengo 20 matrices)
GLES20.glUniformMatrix4fv(u_Bones, 20, false, matrices, 0);
donde matrices
está float[16 * 20]
. Pero luego modificar las matrices para cada hueso se vuelve un poco tedioso. Por ejemplo, si quiero obtener la tercera matriz, necesito algo en la línea de
float[] _3rd = Arrays.copy(matrices, 3*16, 4*16);
y volver a guardar los valores puede ser aún más molesto.
Estoy usando el Método 1 ahora, pero no parece muy inteligente ...
¿Cuál es la mejor manera de enviar múltiples matrices a un sombreador OpenGL ES 2?
LE: Estoy usando Android, así que estoy buscando una solución Java.
Respuestas:
Enviar múltiples matrices al sombreador es sencillo:
Shader:
Programa:
Sin embargo, modificar las matrices para cada hueso no está relacionado con la forma en que las pasa al sombreador. Puede simplificar las modificaciones si trabaja con estructuras en lugar de una matriz de números.
fuente
Sugeriría usar un VBO. Llena tu VBO con las matrices y pásalas usando un atributo en lugar de un uniforme. De esa manera, el VBO distribuirá un nuevo mat4 por cada paso de vértice en el sombreador.
Cuando vincula el VBO antes de dibujar (o crea un VAO para estos estados):
Eche un vistazo a cómo pasar un mat4 como atributo: /programming/17355051/using-a-matrix-as-vertex-attribute-in-opengl3-core-profile
Espero que esto ayude
fuente
El método 1 se puede ampliar para usar matrices para abstraer el número de matrices en el código: (suponiendo que Java)
y luego cuando configuras las matrices puedes hacer
fuente