2012-11-22 44 views
6

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.

Trả lời

3
  • chuyển đến đối tượng cụ thể của địa điểm/xoay

Đó chỉ đơn giản có nghĩa là bạn tải một ma trận 4x4 cho một biến thống nhất.

Việc xử lý các phép biến đổi như thế này cho mỗi cập nhật khung có ảnh hưởng đáng kể đến hiệu suất không?

Việc chuyển đổi sẽ được thực hiện trong trình đổ bóng đỉnh của bạn, bằng cách nhân ma trận nói trên và theo tọa độ đỉnh, song song với nhiều đỉnh.

một phương pháp khác mà ai đó đang đề cập là dán tất cả dữ liệu vị trí cho mỗi đỉnh trong một VBO đơn rồi hiển thị nó bằng một cuộc gọi. Trong phương pháp này, tôi là giả định 'tạo' một đối tượng tôi cần xử lý dữ liệu vị trí của mỗi đỉnh thông qua một hàm sẽ lấy toạ độ 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?

Điều đó dường như không phải là một ý tưởng hay, bởi vì bạn sẽ phải tải lên dữ liệu trên mọi khung hình (hoặc ít nhất là khi vị trí đối tượng/định hướng chages).

Phương pháp thứ ba dường như giống như người đầu tiên, duy nhất tại OGL3 + điều khoản, wheras dường như lần đầu tiên như thế nào trong điều kiện 2.x OGL :)

Cuối cùng, tôi đã nhìn thấy một số người đề nghị có một VBO cho mỗi đối tượng và gọi drawarray cho từng trường hợp.

Có lẽ bạn đã hiểu lầm và có nghĩa là VAO chứ không phải VBO? Với một VAO, bạn tải lên các thuộc tính đỉnh (trong VBO), liên kết VAO, liên kết mỗi VBO với vị trí thuộc tính thích hợp và chỉ thực hiện điều này một lần ngay từ đầu. Trên mỗi khung bạn chỉ cần làm:

// Bind the VAO 
glBindVertexArray(vao) 

// Draw the object 
glDrawArrays/glDrawArraysInstanced/etc. 

// CLear VAO binding 
glBindVertexArray(0) 

Lưu ý rằng bạn vẫn có thể có đỉnh thuộc tính cho nhiều đối tượng khác nhau trong cùng một VBO, nhớ glDrawArrays và những người khác có một tham số, trong đó xác định từ nơi trong mảng để bắt đầu vẽ.

+1

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

+1

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? –

+1

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

Các vấn đề liên quan