Sử dụng bộ đệm đồng nhất (nghĩa là bộ đệm không đổi trong biệt ngữ D3D).
Miễn là tất cả các shader của bạn đồng ý về bố cục và điểm ràng buộc của từng bộ đệm như vậy thì việc cập nhật sẽ trở nên dễ dàng. Người mẫu không cần biết gì về shader cả. Họ chỉ cần cập nhật ma trận khung nhìn mô hình trong bộ đệm liên tục của họ và đường ống kết xuất sẽ tự động sử dụng nó.
Tối thiểu tôi sẽ tranh luận bạn nên có hai bộ đệm như vậy. Đầu tiên nên lưu trữ ma trận chiếu, ma trận camera, ma trận chiếu camera được nối, thông tin khung nhìn, chi tiết bực bội và nghịch đảo ma trận. Bạn chỉ cần cập nhật bộ đệm này một lần cho mỗi cảnh.
Sau đó cung cấp cho mỗi mô hình một bộ đệm khác để lưu trữ ma trận xem mô hình, ma trận bình thường, nghịch đảo và các thuộc tính vật liệu. Điều này được cập nhật một lần cho mỗi mô hình và có thể được thực hiện trong một lần cập nhật khác nhau (nếu / khi thích hợp). Thông tin vật liệu có thể / nên được chuyển đến bộ đệm dành riêng cho vật liệu thứ ba nếu bạn có khả năng chia sẻ vật liệu giữa nhiều đối tượng.
Trong thiết lập chiếu sáng phía trước, sẽ rất hợp lý khi đặt tất cả các đèn vào một bộ đệm khác và trong bóng mờ bị trì hoãn, nó cũng có ý nghĩa khi sử dụng bộ đệm cho ánh sáng cho đèn đi qua (thay cho bộ đệm mô hình / vật liệu được sử dụng trong vượt qua hình học).
Lưu ý rằng bạn cần một phiên bản GL cập nhật vừa phải để sử dụng bộ đệm đồng nhất (3.1 hoặc tiện ích mở rộng; đủ phổ biến hiện nay ngoại trừ một số máy tính xách tay cũ nhưng vẫn còn hoạt động) và bạn cần có phiên bản khá gần đây có thể liên kết bộ đệm thống nhất với các vị trí liên kết cụ thể từ bên trong mã shader (4.2; vẫn không phổ biến nhưng sẽ tốt hơn) nếu không bạn phải thực hiện nhiều công việc hơn trong mã phía CPU của mình để thiết lập mọi thứ (mã CPU của bạn cần biết ràng buộc đúng dù sao đi nữa, do đó, nó có mùi API hơn là một vấn đề nghiêm trọng). Thật không may, OpenGL | ES đã không thêm bộ đệm thống nhất cho đến 3.0, vẫn không được hỗ trợ trên hầu hết các nền tảng di động phổ biến.
Nếu bộ đệm không phải là một tùy chọn thì bạn sẽ cần một số vị trí toàn cầu để lưu trữ các vị trí chỉ mục cho trình đổ bóng hoạt động. Bạn có thể sử dụng glGetUniformLocation
sau khi tải shader của mình để tìm các chỉ mục cho các tên nổi tiếng (thích ModelViewMatrix
hoặc tương tự) sau đó lưu trữ các chỉ mục này. Kết xuất của bạn có thể ánh xạ các giá trị enum như MODEL_VIEW
được chuyển đến một SetUniform
hàm bao bọc để xem xét trình đổ bóng bị ràng buộc, tìm chỉ mục và gọi glUniform
đúng. Đây không phải là một thay đổi lớn trong việc sử dụng mã máy khách từ các bộ đệm ngoài việc cần thiết lập từng bộ đồng phục nếu bạn có được tất cả các gói độc đáo.
Xem Khối Inteface GLSL và Đối tượng bộ đệm thống nhất .