Tôi gặp một chút khó khăn khi hiểu cách xử lý/hiển thị nhiều đối tượng bằng OpenGL. Tôi đã nhìn xung quanh và tìm thấy câu trả lời trong google và cuốn sách đỏ OpenGL mà loại nhảy xung quanh những gì tôi đang cố gắng tìm ra, nhưng tôi cần phải xem nếu tôi có ý tưởng xuống bên phải.OpenGL xử lý nhiều đối tượng
Suy nghĩ đầu tiên của tôi là tôi nên xử lý dữ liệu vị trí với bản dịch và biến quay tương ứng cho X, Y và Z. Lưu trữ một lưới duy nhất trong một VBO tĩnh cho lớp đó, sau đó cho mỗi trường hợp tôi muốn làm cho làm một vòng lặp cho-bên cạnh
- sắc tải
- chuyển đến đối tượng cụ thể của địa điểm/xoay
- sử dụng drawarrays để render lưới tại địa điểm đó
- vòng lặp để đối tượng kế tiếp và lặp lại ở trên cho mọi đối tượng
Liệu xử lý các biến đổi như thế này cho mỗi tác động cập nhật khung hiệu suất s đáng ngạc nhiên?
một phương pháp khác mà ai đó đang đề cập đến là dán tất cả dữ liệu vị trí cho mọi đỉnh trong một VBO đơn lẻ rồi hiển thị nó bằng một cuộc gọi. Trong phương thức này, tôi giả định 'tạo' một đối tượng, tôi sẽ cần xử lý dữ liệu vị trí của mỗi đỉnh thông qua một hàm sẽ lấy tọa độ cục bộ của nó (thông qua mảng tĩnh) và thêm dữ liệu vị trí của đối tượng cụ thể vào đỉnh, sau đó lưu trữ nó trong VBO? Nếu đó là trường hợp, làm thế nào tôi sẽ xử lý luân chuyển là tốt? Tư tưởng thứ ba tôi có là lưu trữ ma trận 4x4 trong mọi trường hợp của đối tượng sẽ giữ thông tin dịch/xoay, sau đó khi tôi kết xuất, tôi sẽ tải ma trận của đối tượng đó, vẽ lưới từ duy nhất VBO, sau đó tải ma trận của đối tượng tiếp theo, vẽ từ cùng một VBO, vv ....
Cuối cùng, tôi đã thấy một số người đề nghị có một VBO cho mỗi đối tượng duy nhất và gọi drawarray cho mỗi trường hợp duy nhất. Bằng cách này có vẻ rất không hiệu quả với tôi, và làm cho tôi tự hỏi những gì điểm có VBO sẽ là nếu bạn đang gọi nó cho mỗi lưới. Nó có vẻ như chế độ ngay lập tức (tôi hiểu nó được khấu hao) sẽ nhanh hơn chỉ vì bạn không có chi phí của việc tạo ra và ràng buộc VBO cho mỗi đối tượng duy nhất.
Có bất kỳ/tất cả các phương pháp xử lý/hiển thị nhiều đối tượng này hợp lệ không? Nếu vậy, lợi thế và bất lợi của mỗi phương pháp là gì?
Các phương pháp có ý nghĩa nhất là các phương thức có VBO đơn trên mỗi lưới, sau đó chuyển đổi mỗi bản cập nhật hoặc tải ma trận của mỗi đối tượng trên bản cập nhật và hiển thị theo cách đó. Tôi khá mới để OpenGL và đồ họa rendering, vì vậy tôi đang cố gắng để hiểu đầy đủ cách tối ưu để xử lý các thông tin cần thiết để render nhiều đối tượng.
Nếu một tập hợp các vị trí của đối tượng là tĩnh, tức là không thay đổi động, sau đó đặt tất cả chúng vào một VBO đơn, với phép biến đổi chung và vẽ tất cả chỉ bằng một lệnh gọi glDrawElements * trên các đối tượng, vẽ từng đối tượng theo đối tượng. Nhưng chỉ cho hình học và vị trí tĩnh. – datenwolf
nó chắc chắn là của VBO và không phải của VAO. Vì vậy, câu hỏi của tôi là điều này: tôi bằng cách nào đó sẽ lưu trữ các ma trận của từng đối tượng vào một VBO sau đó và vượt qua nó qua để đổ bóng thông qua một VAO bị ràng buộc? –
Nếu bạn đang thực hiện các bản vẽ được lập tức - vâng. Ví dụ, bạn có thể làm cho ma trận mô hình xem một thuộc tính instanced (với 'glVertexAttribDivisor'). Hoặc bạn có thể đặt ma trận làm mảng đồng nhất và lập chỉ mục mảng này bằng 'gl_InstanceID'. Đối với bản vẽ không có bản năng, tôi không biết một cách hợp lý để biết trong bóng đổ mà ma trận để sử dụng. – chill