Je pratique des animations utilisant des os / skinning. J'essaie d'envoyer au shader une matrice par sommet. Je peux penser à ces deux approches.
Méthode 1
J'ai une poignée uniforme pour chaque matrice osseuse comme celle-ci
u_Bone0 = GLES20.glGetUniformLocation(mProgram, "u_Bone[0]");
u_Bone1 = GLES20.glGetUniformLocation(mProgram, "u_Bone[1]");
et dans le onDraw
je les envoie chacun au shader:
GLES20.glUniformMatrix4fv(u_Bone0, 1, false, matrix0, 0);
Ce n'est évidemment pas une bonne approche si j'ai un grand nombre de matrices. Ma deuxième idée que je n'ai pas encore essayée car il y a beaucoup de code à refactoriser
Méthode 2
Est d'utiliser le glUniformMatrix4fv
pour les envoyer tous en même temps (supposons que j'ai 20 matrices)
GLES20.glUniformMatrix4fv(u_Bones, 20, false, matrices, 0);
où matrices
est float[16 * 20]
. Mais alors, modifier les matrices pour chaque os devient un peu fastidieux. Par exemple, si je veux obtenir la 3e matrice, j'ai besoin de quelque chose comme
float[] _3rd = Arrays.copy(matrices, 3*16, 4*16);
et sauvegarder les valeurs peut devenir encore plus ennuyeux.
J'utilise la méthode 1 maintenant, mais ça n'a pas l'air très intelligent ...
Quelle est la meilleure façon d'envoyer plusieurs matrices vers un shader OpenGL ES 2?
LE: J'utilise Android, donc je cherche une solution Java.