Ćwiczę animacje przy użyciu kości / skórowania. Próbuję wysłać moduł cieniujący jedną macierz na wierzchołek. Mogę wymyślić te dwa podejścia.
Metoda 1
Mam jeden jednolity uchwyt dla każdej takiej matrycy kostnej
u_Bone0 = GLES20.glGetUniformLocation(mProgram, "u_Bone[0]");
u_Bone1 = GLES20.glGetUniformLocation(mProgram, "u_Bone[1]");
a następnie onDraw
wysyłam każdego z nich do modułu cieniującego:
GLES20.glUniformMatrix4fv(u_Bone0, 1, false, matrix0, 0);
To oczywiście nie jest dobre podejście, jeśli mam dużą liczbę matryc. Mój drugi pomysł, którego jeszcze nie wypróbowałem, ponieważ jest dużo kodu do refaktoryzacji
Metoda 2
Jest użyć, glUniformMatrix4fv
aby wysłać je wszystkie jednocześnie (zakładając, że mam 20 macierzy)
GLES20.glUniformMatrix4fv(u_Bones, 20, false, matrices, 0);
gdzie matrices
jest float[16 * 20]
. Ale modyfikowanie matryc dla każdej kości staje się nieco nudne. Na przykład, jeśli chcę uzyskać trzecią macierz, potrzebuję czegoś podobnego do
float[] _3rd = Arrays.copy(matrices, 3*16, 4*16);
a zapisanie wartości może stać się jeszcze bardziej irytujące.
Używam teraz Metody 1, ale nie wygląda to zbyt mądrze ...
Jaki jest najlepszy sposób wysyłania wielu macierzy do modułu cieniującego OpenGL ES 2?
LE: Używam Androida, więc szukam rozwiązania Java.