Ć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.
Odpowiedzi:
Wysyłanie wielu macierzy do modułu cieniującego jest proste:
Shader:
Program:
Modyfikacja macierzy dla każdej kości nie ma jednak związku z tym, jak przekazujesz je do modułu cieniującego. Możesz uprościć modyfikacje, jeśli pracujesz ze strukturami zamiast z tablicą liczb.
źródło
Sugerowałbym użycie VBO. Wypełnij VBO macierzami i przekaż je za pomocą atrybutu zamiast munduru. W ten sposób VBO rozdzieli nowy moduł mat4 na przebieg wierzchołka w module cieniującym.
Gdy powiążesz VBO przed rysowaniem (lub utworzysz VAO dla tych stanów):
Zobacz, jak przekazać mat4 jako atrybut: /programming/17355051/using-a-matrix-as-vertex-attribute-in-opengl3-core-profile
Mam nadzieję że to pomoże
źródło
metodę 1 można rozszerzyć o użycie tablic do wyodrębnienia liczby macierzy w kodzie: (przy założeniu java)
a po ustawieniu macierzy możesz to zrobić
źródło