Saya berlatih animasi menggunakan tulang / menguliti. Saya mencoba mengirim shader satu matriks per simpul. Saya bisa memikirkan dua pendekatan ini.
Metode 1
Saya punya satu pegangan seragam untuk setiap matriks tulang seperti ini
u_Bone0 = GLES20.glGetUniformLocation(mProgram, "u_Bone[0]");
u_Bone1 = GLES20.glGetUniformLocation(mProgram, "u_Bone[1]");
dan di onDraw
saya kirim masing-masing ke shader:
GLES20.glUniformMatrix4fv(u_Bone0, 1, false, matrix0, 0);
Ini jelas bukan pendekatan yang baik jika saya memiliki banyak matriks. Gagasan kedua saya yang belum saya coba karena ada banyak kode untuk refactor
Metode 2
Apakah menggunakan glUniformMatrix4fv
untuk mengirim semuanya sekaligus seperti (anggap saya memiliki 20 matriks)
GLES20.glUniformMatrix4fv(u_Bones, 20, false, matrices, 0);
di mana matrices
adalah float[16 * 20]
. Tetapi kemudian memodifikasi matriks untuk setiap tulang menjadi sedikit membosankan. Sebagai contoh, jika saya ingin mendapatkan matriks ke-3, saya perlu sesuatu di sepanjang baris
float[] _3rd = Arrays.copy(matrices, 3*16, 4*16);
dan menyimpan kembali nilainya dapat menjadi lebih menyebalkan.
Saya menggunakan Metode 1 sekarang, tetapi tidak terlihat sangat pintar ...
Apa cara terbaik untuk mengirim banyak matriks ke shader OpenGL ES 2?
LE: Saya menggunakan Android, jadi saya mencari solusi Java.
Jawaban:
Mengirim beberapa matriks ke shader sangat mudah:
Shader:
Program:
Memodifikasi matriks untuk setiap tulang tidak terkait dengan bagaimana Anda meneruskannya ke shader. Anda dapat membuat modifikasi lebih sederhana jika Anda bekerja dengan struktur bukan array angka.
sumber
Saya akan menyarankan menggunakan VBO. Isi VBO Anda dengan matriks, dan berikan mereka menggunakan atribut bukan seragam. Dengan begitu VBO akan mendistribusikan mat4 baru per vertex pass di shader.
Saat Anda mengikat VBO sebelum menggambar (atau membuat VAO untuk status ini):
Lihat bagaimana cara melewatkan mat4 sebagai atribut: /programming/17355051/using-a-matrix-as-vertex-attribute-in-opengl3-core-profile
Semoga ini membantu
sumber
metode 1 dapat diperluas untuk menggunakan array untuk abstrak jumlah matriks dalam kode: (dengan asumsi java)
dan kemudian ketika Anda mengatur matriks yang dapat Anda lakukan
sumber