Ich übe Animationen mit Knochen / Häuten. Ich versuche, dem Shader eine Matrix pro Scheitelpunkt zu senden. Ich kann mir diese beiden Ansätze vorstellen.
Methode 1
Ich habe einen einheitlichen Griff für jede Knochenmatrix wie diese
u_Bone0 = GLES20.glGetUniformLocation(mProgram, "u_Bone[0]");
u_Bone1 = GLES20.glGetUniformLocation(mProgram, "u_Bone[1]");
und in der onDraw
sende ich jeden von ihnen an den Shader:
GLES20.glUniformMatrix4fv(u_Bone0, 1, false, matrix0, 0);
Dies ist offensichtlich kein guter Ansatz, wenn ich eine große Anzahl von Matrizen habe. Meine zweite Idee, die ich noch nicht ausprobiert habe, da es viel Code zum Refactor gibt
Methode 2
Ist das zu verwenden glUniformMatrix4fv
, um sie alle auf einmal zu senden (nehme an, ich habe 20 Matrizen)
GLES20.glUniformMatrix4fv(u_Bones, 20, false, matrices, 0);
wo matrices
ist float[16 * 20]
. Aber dann wird das Ändern der Matrizen für jeden Knochen etwas mühsam. Wenn ich zum Beispiel die 3. Matrix erhalten möchte, brauche ich etwas in der Art von
float[] _3rd = Arrays.copy(matrices, 3*16, 4*16);
und das Zurückspeichern der Werte kann noch ärgerlicher werden.
Ich benutze jetzt Methode 1, aber es sieht nicht sehr klug aus ...
Was ist der beste Weg, um mehrere Matrizen an einen OpenGL ES 2-Shader zu senden?
LE: Ich benutze Android und suche nach einer Java-Lösung.
Antworten:
Das Senden mehrerer Matrizen an den Shader ist unkompliziert:
Shader:
Programm:
Das Ändern der Matrizen für jeden Knochen hängt jedoch nicht davon ab, wie Sie sie an den Shader übergeben. Sie können Änderungen vereinfachen, wenn Sie mit Strukturen anstelle von Zahlenreihen arbeiten.
quelle
Ich würde vorschlagen, einen VBO zu verwenden. Füllen Sie Ihren VBO mit den Matrizen und übergeben Sie sie mit einem Attribut anstelle einer Uniform. Auf diese Weise verteilt der VBO eine neue mat4 pro Vertex-Pass im Shader.
Wenn Sie den VBO vor dem Zeichnen binden (oder einen VAO für diese Zustände erstellen):
Sehen Sie sich an, wie Sie eine mat4 als Attribut übergeben: /programming/17355051/using-a-matrix-as-vertex-attribute-in-opengl3-core-profile
Hoffe das hilft
quelle
Methode 1 kann erweitert werden, um mithilfe von Arrays die Anzahl der Matrizen im Code zu abstrahieren: (unter der Annahme von Java)
und dann, wenn Sie die Matrizen einstellen, können Sie tun
quelle