Mọi người liên tục bảo tôi sử dụng ít nhất Vertex Arrays. Nhưng tôi nghĩ rằng nó không phải là một ý tưởng tốt vì tôi đang sử dụng glPushMatrix()
với glTranslatef/glRotatef
để định vị một đối tượng trong thế giới 3D. Vì vậy, tôi có nên ngừng sử dụng glPushMatrix()
và tính toán vị trí đỉnh xoay/di chuyển trên thế giới "theo cách thủ công" và sau đó đẩy dữ liệu đỉnh của chúng vào một mảng đỉnh và sau đó kết xuất tất cả cùng một lúc không? Không.OpenGL: Làm thế nào để thiết kế hệ thống dựng hình hiệu quả bằng cách sử dụng mảng đỉnh với phân loại chiều sâu?
Nhưng, tất cả điều này sẽ trở nên rối rắm hơn khi tôi sử dụng các bề mặt kết cấu khác nhau cho tất cả các đối tượng trên màn hình cũng được sắp xếp theo chiều sâu.
Vì vậy:
- tôi sẽ phải để lưu trữ từng đối tượng với ID bề mặt kết cấu là tốt.
- Tôi sẽ sắp xếp tất cả các đối tượng hiển thị theo vị trí Z của chúng (trò chơi chỉ được xem từ trên xuống và tất cả các đối tượng đều bằng phẳng).
- tôi sẽ đi qua mảng được sắp xếp này:
- Tạo bộ đệm mới và sao chép chỉ đỉnh/texcoord/màu/bình thường vào bộ đệm này:
- Mỗi lần ID bề mặt kết cấu đã thay đổi từ ID trước, tôi sẽ ràng buộc với ID kết cấu chính xác:
- Tải lên dữ liệu đỉnh tôi đã thu thập được.
- Giải phóng bộ đệm được sử dụng cho mảng đỉnh tạm thời.
- Lặp lại các bước 4-7 cho đến khi tôi đã trải qua tất cả dữ liệu tôi đã sắp xếp ở vị trí đầu tiên.
- Miễn phí dữ liệu mảng đã sắp xếp của tôi và lặp lại các bước 1-9.
Tôi có làm đúng không?
Ngoài ra, tôi nên thiết kế cấu trúc dữ liệu cho các đối tượng mà tôi sắp xếp như thế nào? Ví dụ: sử dụng std::vector
để lưu trữ dữ liệu đỉnh cho từng đối tượng có tốt không? Hoặc là có lựa chọn tốt hơn? Tôi đã suy nghĩ rằng std::vector
để lưu trữ tất cả các dữ liệu này sẽ như thế nào:
struct GameObject {
int TexID;
float z; // we will sort by this
vector<VTCNStruct> VertexData; // store each point of the object here (including color/normal/texcoord points).
};
vector<GameObject> GameObjectBuffer; // push all sortable objects here
Ngoài ra, ở bước 4: là nó có thể sử dụng std::vector
đã tồn tại trong trường hợp này? Tôi đã có ý tưởng rằng tôi phải sử dụng mảng thô, chẳng hạn như new float[100]
để gửi mảng đỉnh tới GPU của mình hoặc bằng cách nào đó tôi đã sử dụng sắp xếp std::vector
ở đây bằng cách nào đó (hiệu quả) mà không tạo bộ đệm mới mỗi khi ID kết cấu thay đổi ?
"Bạn nên giữ một mảng đỉnh mỗi đối tượng" - là thông minh này ở tất cả? vì hầu hết các đối tượng của tôi chỉ là quad, và không sử dụng băng thông nhiều hơn bây giờ khi tôi không gửi nhiều dữ liệu hơn tới GPU (có nghĩa là mảng màu/mảng bình thường), nhưng tôi cũng cần gửi các lệnh tải lên mảng đỉnh giữa mọi đối tượng . – Newbie
Làm cách nào để tôi thu gọn các biến đổi của tôi thành một ma trận? Ngoài ra, bạn không có nghĩa là từ trở lại phía trước? Vì vậy, về cơ bản bạn đề nghị tôi sẽ giữ 'glPushMatrix()' nhưng thay vì 'glBegin/glEnd' tôi sẽ sử dụng mảng đỉnh? NẾU tôi muốn sử dụng VBO thay vào đó, tôi nên giữ cùng một cách tiếp cận bạn đề nghị? – Newbie
Newbie-Tôi không phải là lập trình viên OpenGL, nhưng tôi tin Josh có nghĩa là bạn nên vẽ các đối tượng phía trước (ví dụ: tủ quần áo để màn hình) trước tiên, xa nhất cuối cùng. EDIT - Bằng cách sụp đổ biến đổi thành một ma trận, tôi tin rằng bạn có thể sử dụng một số thủ thuật toán học để có được một biến đổi cho cả hai di chuyển/xoay/etc. Đã rơi vào một cuộc đột kích. – ZachS