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.
Réponses:
L'envoi de plusieurs matrices au shader est simple:
Shader:
Programme:
La modification des matrices pour chaque os n'est cependant pas liée à la façon dont vous les passez au shader. Vous pouvez simplifier les modifications si vous travaillez avec des structures au lieu d'un tableau de nombres.
la source
Je suggère d'utiliser un VBO. Remplissez votre VBO avec les matrices et passez-les en utilisant un attribut au lieu d'un uniforme. De cette façon, le VBO distribuera un nouveau mat4 par passe de sommet dans le shader.
Lorsque vous liez le VBO avant de dessiner (ou créez un VAO pour ces états):
Découvrez comment passer un mat4 en tant qu'attribut: /programming/17355051/using-a-matrix-as-vertex-attribute-in-opengl3-core-profile
J'espère que cela t'aides
la source
la méthode 1 peut être développée pour utiliser des tableaux pour extraire le nombre de matrices dans le code: (en supposant java)
puis lorsque vous définissez les matrices, vous pouvez le faire
la source