Tôi đang tạo một trình kết xuất bằng OpenGL hiện đại (3.1 trở lên) và bây giờ tôi đang cố gắng tạo ra một cách xử lý đồng phục hiệu quả nhưng linh hoạt. Tôi đã đọc về các đối tượng bộ đệm thống nhất và cách tiếp cận 'phổ biến' là sử dụng chúng (điều không may sau này không mang lại cho tôi nhiều kết quả như tôi mong đợi).
Để giảm các cuộc gọi API OpenGL và lưu trữ dữ liệu trong bộ nhớ liền kề, tôi đang xem xét việc tạo nhiều bộ đệm lớn cho mỗi cấu trúc dữ liệu sẽ được tải lên GPU. Mỗi bộ đệm có kích thước tối đa 16kb (vì theo những gì tôi hiểu thì phần lớn này được đảm bảo có sẵn cho một UBO). Khi một đối tượng muốn có thể tải đồng phục lên GPU, nó sẽ tìm bộ đệm đầu tiên của loại được tải lên chưa đầy đủ và nhận được chỉ mục có sẵn tiếp theo trong bộ đệm đó. Khi đối tượng được vẽ, nó liên kết UBO (nếu chưa bị ràng buộc) và tải lên chỉ mục phần tử của UBO.
Điều này dẫn đến một cái gì đó như thế này:
layout(std140) uniform ModelData {
mat4 model_matrix[kNumInstancesPerModelUbo];
}
uniform int u_ModelDataIndex;
layout(std140) uniform SkeletonData {
mat4 bone_transforms[kNumInstancesPerSkeletonUbo][kMaxBones];
}
uniform int u_SkeletonDataIndex;
Tuy nhiên tôi cũng đang xem xét những điều sau:
layout(std140) uniform MeshData {
mat4 model_matrix[kNumInstancesPerMeshUbo];
mat4 bone_transforms[kNumInstancesPerMeshUbo][kMaxBones];
}
uniform int u_MeshDataIndex;
Trong một số cách, điều này cảm thấy sạch hơn rất nhiều ở chỗ nó cần một chỉ mục duy nhất để truy cập tất cả dữ liệu liên quan đến lưới sẽ được tải lên. Mặt khác, điều này có thể vượt quá tầm kiểm soát (kích thước bộ đệm lớn hơn 16kb, xử lý các dữ liệu không liên quan (ví dụ: lưới không có khung xương) hoặc thậm chí các vấn đề đồng bộ hóa khi bạn không được phép truy cập để nói các xương trong khi tải lên ma trận mô hình) và tôi cũng không chắc điều này sẽ ảnh hưởng đến bố cục bộ nhớ trên GPU như thế nào.
Thành thật mà nói, tôi cảm thấy như bị mắc kẹt ở đây và tôi không thể tìm thấy một ví dụ cụ thể nào về cách bạn xử lý nhanh và linh hoạt của UBO.
Bạn có lời khuyên hay nguồn lực nào cho tôi có thể giúp tôi ở đây không?