Tôi đang thực hành hoạt hình bằng cách sử dụng xương / lột da. Tôi đang cố gắng gửi shader một ma trận trên mỗi đỉnh. Tôi có thể nghĩ về hai cách tiếp cận này.
Phương pháp 1
Tôi có một tay cầm thống nhất cho mỗi ma trận xương như thế này
u_Bone0 = GLES20.glGetUniformLocation(mProgram, "u_Bone[0]");
u_Bone1 = GLES20.glGetUniformLocation(mProgram, "u_Bone[1]");
và trong onDraw
tôi gửi từng cái cho shader:
GLES20.glUniformMatrix4fv(u_Bone0, 1, false, matrix0, 0);
Đây rõ ràng không phải là một cách tiếp cận tốt nếu tôi có một số lượng lớn ma trận. Ý tưởng thứ hai của tôi mà tôi chưa thử vì có rất nhiều mã để cấu trúc lại
Cách 2
Là sử dụng glUniformMatrix4fv
để gửi tất cả chúng cùng một lúc (giả sử tôi có 20 ma trận)
GLES20.glUniformMatrix4fv(u_Bones, 20, false, matrices, 0);
nơi matrices
là float[16 * 20]
. Nhưng sau đó sửa đổi ma trận cho mỗi xương trở nên hơi tẻ nhạt. Ví dụ: nếu tôi muốn lấy ma trận thứ 3, tôi cần một cái gì đó dọc theo dòng
float[] _3rd = Arrays.copy(matrices, 3*16, 4*16);
và lưu lại các giá trị có thể trở nên khó chịu hơn.
Hiện tôi đang sử dụng Phương pháp 1, nhưng có vẻ không thông minh lắm ...
Cách tốt nhất để gửi nhiều ma trận đến trình tạo bóng OpenGL ES 2 là gì?
LE: Tôi đang sử dụng Android, vì vậy tôi đang tìm kiếm một giải pháp Java.