Khi nào nên sử dụng mảng đỉnh và khi nào nên sử dụng VBO?


14

Tôi đang cố gắng tìm hiểu về mảng đỉnhcác đối tượng bộ đệm đỉnh , nhưng tôi không hiểu sự khác biệt về:

  • trường hợp sử dụng (hình học tĩnh như địa hình, hình học thay đổi mọi khung hình như hệ thống hạt, v.v.)
  • hiệu suất
  • tính di động (card đồ họa cũ, bảng điều khiển, thiết bị như Android hoặc iPhone, v.v.)

Một số làm rõ?


3
Đối với bất kỳ ai khác đến đây, hãy xem câu trả lời được bình chọn nhiều nhất ở đây .... stackoverflow.com/questions/430555/iêu
afuzzyllama

Câu trả lời:


14

Đây là một bài viết hay về VBO.

Hiệu suất

Dưới đây là một tổng quan tốt về ngữ nghĩa gọi.

Đây là một tổng quan tốt về các vấn đề hiệu suất; trong đó chúng ta thấy rằng các VBO có hiệu suất cao hơn các mảng.

Lý do chúng tôi thích VBO là dữ liệu được tải vào thẻ và vì vậy bạn không phải chuyển dữ liệu mỗi khung. Tùy thuộc vào loại VBO được tạo, bạn có thể đưa ra gợi ý cho trình điều khiển đồ họa về cách sử dụng (viết nhiều, đọc nhiều so với viết nhiều, không bao giờ đọc, v.v.).

Sử dụng

VBO thực sự tốt cho hình học tĩnh như địa hình mà bạn không muốn thay đổi hoặc cho hình học không ổn định.

Mảng Vertex tốt cho dữ liệu thay đổi thường xuyên nhưng cũng được máy chủ đọc - do đó, để hiển thị trực tiếp dữ liệu đang bị thao túng (ví dụ, bộ đệm dữ liệu của máy đo khoảng cách laser là nơi tôi đã sử dụng chúng) thường xuyên. Nếu bạn có thể thoát khỏi việc không bao giờ đọc dữ liệu trên thiết bị chủ (vì vậy, chỉ cần đẩy nó ra trên thẻ), VBO ở chế độ chỉ ghi là một lựa chọn tốt.

Tính di động

Mảng Vertex phía khách hàng Chúng có sẵn trong OpenGL trước 3.0, không dùng nữa trong 3.0 và đi trong 3.1+. OpenGL ES hỗ trợ chúng (OpenGL ES 2 thì không).

VBO Chúng có sẵn sau OpenGL 1.5. Đây là cách duy nhất để lưu trữ dữ liệu hình học trong OpenGL ES 2 (và do đó, WebGL).


2
Trong PerformanceTuning.pdf, nó nói rằng VBO "Có thể làm tổn thương hiệu suất trong các trường hợp không tối ưu" ... nhưng nó không được xây dựng. Bất cứ ý tưởng những trường hợp đó là gì? Tôi có một trường hợp tôi cần cập nhật hình học mỗi khung hình, vì vậy tôi tự hỏi liệu một mảng đỉnh sẽ tốt hơn hay xấu hơn VBO trong trường hợp đó. Cám ơn.
sidinderguy

1
đọc opengl.org/sdk/docs/man/xhtml/glDrawElements.xmlopengl.org/wiki/GlDrawElements - Vertex Arrays AREN'T không được chấp nhận hoặc loại bỏ, chúng vẫn được hỗ trợ như OpenGL 4.x; nói thẳng sự thật đi, bạn đời, bởi vì những gì bạn lan truyền chỉ là thông tin sai lệch

1
@vaxquis Mảng đỉnh phía khách hàng không được dùng nữa. Mảng đỉnh máy chủ thì không. VAO là những thứ khác nhau và có nghĩa là để tiết kiệm nhà nước. Không có gì sai trong bài viết, mặc dù có thể chính xác hơn nếu nó nêu phía khách hàng. Nhưng tôi đoán đó là ngầm.
Concept3d

1
"Mảng đỉnh phía máy khách không được dùng nữa. Mảng đỉnh phía máy chủ thì không." "Mảng Vertex Chúng có sẵn trong OpenGL trước 3.0, không dùng nữa trong 3.0 và đi trong 3.1+." "bạn có thể định trước các mảng đỉnh riêng biệt (...) và sử dụng chúng để xây dựng một chuỗi các nguyên thủy với một lệnh gọi đến glDrawElements. Core trong phiên bản 4.4" - Tôi thấy sự mâu thuẫn trong các tuyên bố này.

2
Ngoài ra, trước khi nói điều gì đó "không được chấp nhận", hãy xác định nguồn gốc của tuyên bố đó, tốt nhất là trong tài liệu chính thức. Việc chỉ ra từ StackExchange đến StackOverflow như một bằng chứng KHÔNG phải là cách khoa học hoạt động và bảo vệ bằng "Tôi đoán đó là ẩn ý" không phải là một đối số. Không ai hỏi về mảng máy khách / máy chủ, câu hỏi là về mảng đỉnh theo nghĩa rộng nhất, so với VBO. Btw, tôi chưa nói gì về VAO, ý tưởng đó đến từ đâu?

11

(Tôi thêm điều này vào đây do thực tế là câu trả lời của ChrisE rất mơ hồ, điều không may là do sự mơ hồ của câu hỏi ban đầu. Tuy nhiên, tôi sẽ cho rằng câu hỏi của OP nên có tiêu đề "khi nào nên sử dụng VAO và khi nào nên sử dụng VBO ".)

V ertex B uffer O bjects (mà thực sự không phải là khác nhau từ các loại B uffer O bjects, ví dụ U niform B uffer O bjects) cung cấp một phương tiện cho các dữ liệu tải lên đỉnh đến phần cứng đồ họa.

V ertex Một bject O rray được sử dụng cùng với VBO để cải thiện hiệu suất phía máy khách (phía CPU), bằng cách giảm số lượng cuộc gọi cần thiết để khởi động lại bộ đệm đỉnh riêng lẻ và đặt lại các thuộc tính đỉnh mỗi lần bạn muốn thay đổi để kết xuất theo một cách nhất định. Thay vì thực hiện tất cả các công việc đó trên mọi khung hình, bạn thực hiện một lần (lúc khởi tạo), sau đó chỉ cần khởi động lại VAO thích hợp cho mỗi (bộ) cuộc gọi rút ra sử dụng các thuộc tính đỉnh được liên kết.

Mặc dù vậy, việc sử dụng VAO không giải phóng bạn khỏi trách nhiệm bổ sung là phải thực hiện glBindBuffer+ glBufferDatađối với bất kỳ dữ liệu nào thay đổi từng khung, ví dụ, vị trí thực thể của trò chơi / xoay / ma trận biến đổi. Chỉ khi bạn có dữ liệu tĩnh hoàn toàn mà bạn chỉ cần làm glBindVertexArray(&vao) -> glDraw*(...) -> glBindVertexArray(0)để hiển thị.


+1 VAO là một cái tên khủng khiếp và khó hiểu, và nó luôn nhắc nhở tôi về những gì một OpenGL lộn xộn đã trở thành.
Concept3d

1
Tôi cũng nhớ đi cùng với một cuộc thảo luận liên quan đến câu hỏi này (hầu hết đã bị xóa). Một lần nữa vấn đề là với thuật ngữ khủng khiếp của OpenGL. Tôi cũng chỉnh sửa câu trả lời của Chris để chính xác hơn.
Concept3d
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.