Thay đổi hình học trong OpenGL ES 2.0


12

Tôi đang lên kế hoạch thực hiện việc kích hoạt hình học trong OpenGL ES 2.0 Về cơ bản, tôi dự định kết xuất cùng một hình học (một cái ghế) có thể 1000 lần trong cảnh của tôi.

Cách tốt nhất để làm điều này trong OpenGL ES 2.0 là gì?

Tôi đang xem xét chuyển mô hình xem mat4 như một thuộc tính. Vì các thuộc tính là trên mỗi dữ liệu đỉnh nên tôi cần phải vượt qua cùng mat4 này, ba lần cho mỗi đỉnh của cùng một tam giác (vì modelview không đổi trên các đỉnh của tam giác).

Điều đó sẽ lên tới rất nhiều dữ liệu bổ sung được gửi tới GPU (2 đỉnh bổ sung * 16 phao * (Số lượng hình tam giác) của dữ liệu bổ sung).

Hoặc tôi chỉ nên gửi mat4 một lần cho mỗi tam giác? Nhưng làm thế nào có thể sử dụng các thuộc tính vì các thuộc tính được xác định là dữ liệu "trên mỗi đỉnh"?

Cách tốt nhất và hiệu quả để thực hiện việc kích hoạt trong OpenGL ES 2.0 là gì?


3
Tôi thực sự nhớ glVertexAttribDivisor:(
Will

Câu trả lời:


9

ES2 không có kết cấu glVertexAttribDivisor hay dấu phẩy động nên các tùy chọn của bạn khá hạn chế.

Chắc chắn đặt mô hình ghế của bạn vào VBO nếu bạn chưa làm như vậy. Từ đó, bạn ít nhiều bị hạn chế đối với các cuộc gọi rút thăm riêng lẻ - mỗi cuộc gọi một ghế - vì vậy, vấn đề là lấy ma trận biến đổi cho mỗi ghế sang GPU một cách hiệu quả nhất có thể.

Bạn có thể thực hiện điều này với các cuộc gọi glUniform thông thường hoặc bạn có thể lạm dụng một số vị trí attrib đỉnh bổ sung và thực hiện một số cuộc gọi glVertexAttrib (lưu ý: không phải glVertexAttribPulum) trước khi vẽ mỗi ghế, chỉ định ma trận sử dụng 4 vị trí như vậy và các giá trị này sẽ "dính" vào mỗi đỉnh tiếp theo trên ghế. Đó có thể là một con đường đủ nhanh trên một số phần cứng nhưng chậm hơn trên phần cứng khác vì vậy bạn sẽ phải thử nghiệm.

Nếu ghế của bạn không xoay một thứ khác, bạn có thể làm chỉ là gửi vị trí cho shader của bạn và xây dựng một ma trận biến đổi mới khi đang bay ở đó. Nghe có vẻ khủng khiếp nhưng nó thực sự cực kỳ nhanh (chỉ cần đặt 3 phao) và có thể thực hiện công việc.

Nhìn chung, và giả sử rằng bạn đang nhắm đến một nền tảng di động điển hình, tôi nghĩ rằng bất cứ điều gì bạn làm, rút ​​ra các cuộc gọi sẽ giết chết bạn.


6

Đặt cược tốt nhất của bạn là sử dụng một phương pháp tiếp cận khá giống với các mô hình da. Tạo một VBO sẽ chứa nhiều bản sao của ghế của bạn, tất cả chúng đều giống hệt nhau. Bây giờ, mỗi đỉnh phải có một thuộc tính byte sẽ giữ chỉ mục cho ma trận biến đổi mà nó sẽ được áp dụng cho nó. Gửi một loạt các ma trận cho shader của bạn và sử dụng chúng như là biến đổi thế giới của mỗi chiếc ghế của bạn. Bằng cách này, bạn có thể rút ra trong mỗi cuộc gọi nhiều ghế như kích thước tối đa của tham số mảng, mà không phải ghi lại bất kỳ dữ liệu nào trong VBO.


3

Wolfire Games có một bài viết tuyệt vời về blog đối tượng nhanh . Những gì họ làm là kết xuất mô hình một loạt các lần, nhưng gửi một ma trận khác nhau cho mỗi đối tượng đến một vị trí thống nhất.

Đây là một cách khá hiệu quả để ví dụ toàn bộ một loạt các đối tượng, bởi vì bạn chỉ phải gửi dữ liệu một lần (nút cổ chai lớn nhất khi kết xuất một loạt các đối tượng sẽ luôn là băng thông) và sau đó chuyển đổi mô hình trong một shader.


Dù sao, tôi vẫn không chắc chắn rằng việc tham chiếu văn bản Nvidia cũng có thể áp dụng cho chip PVR di động. Đặc biệt là về đề cập của họ về phần trình điều khiển . http.doad.nvidia.com/developer/SDK/Comrivate_Samples / DIOS / Đổi
Eonil

1

http://www.youtube.com/watch?v=rfQ8rKGTVlg

Đây là Google Talk trên WebGL, là OpenGL ES cho JavaScript, có nghĩa là cũng không có hình học. Nó có thể cho bạn một ý tưởng, mặc dù thật khó để nói vì tôi không biết liệu nút cổ chai của bạn nằm trên GPU hay CPU.

Mặc dù, bạn nên tìm hiểu về các biến thống nhất, hoàn toàn không cần gửi mat4 trong một thuộc tính, tất cả các đỉnh của ghế của bạn sẽ được chuyển đổi theo cùng một ma trận, bạn chỉ phải gửi một lần cho mỗi mô hình, không phải mỗi tam giác. Các biến thống nhất cho phép bạn làm điều đó, chúng là một loại biến đặc biệt mà bạn có thể đặt trong chính chương trình đổ bóng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.