Làm cách nào tôi có thể thực hiện chuyển đổi từ chế độ ngay lập tức sang VBO?


7

Tôi đã sử dụng OpenGL trong một thời gian ngắn bây giờ - và tôi muốn làm rõ trên VBO . Theo tôi hiểu, VBO là một đối tượng được lưu trữ trên VRAM. Trong chế độ ngay lập tức, để áp dụng một kết cấu, chúng ta chỉ cần liên kết nó và chỉ định tọa độ kết cấu trước tọa độ đỉnh, tuy nhiên dường như không phải như vậy với VBO.

Câu hỏi 1: Tôi có thể chỉ định dữ liệu kết cấu trong VBO không? Phần nào của dữ liệu?

Thông thường khi tôi tạo một trò chơi trong 2d, tôi sẽ lưu trữ tất cả các đối tượng của mình trong các trường hợp của các lớp khác nhau, sau đó khi thói quen vẽ của tôi xuất hiện - chỉ cần vẽ các đối tượng trên màn hình. Với môi trường 3D, sẽ khó khăn hơn một chút khi chỉ vẽ các đối tượng trên màn hình nhưng với một số phép toán tôi chắc chắn điều đó là có thể.

Câu hỏi 2: Một khi chúng ta tìm ra những đối tượng nào cần được kết xuất, việc gửi các đối tượng tương ứng đó có yêu cầu "áp dụng" nhanh không và có thể tự áp dụng không? đây có phải là cách tốt hơn không?

Câu hỏi 3: Nếu tôi có một bản đồ hoàn toàn động, nhưng với các đối tượng sẽ không thay đổi thường xuyên, có hướng dẫn nào về sự khác biệt về hiệu suất giữa GL_STATIC_DRAWGL_DYNAMIC_DRAWkhông?

Câu hỏi cuối cùng: Tôi thậm chí có nên xem xét sử dụng danh sách đỉnh không? Hay VBO chỉ là một lựa chọn tốt hơn?


Về chủ đề của câu hỏi 2 ... Tôi không chắc liệu bạn có nghĩa cụ thể là có các đối tượng kết xuất cấp cao tự vẽ hay không, hoặc vẫn đang nói cụ thể về máy móc VBO cấp thấp hơn. Nhưng trong trường hợp trước đây, bạn có thể muốn xem câu hỏi này .

Tôi có muốn gọi glDrawElementstrong từng đối tượng - hay tôi nên lưu trữ mọi thứ dưới dạng hình tam giác và chỉ có một đối tượng glDrawElements? Là một trong những cách khả thi?
ultifinitus

Câu trả lời:


6

Trả lời 1:

Tất nhiên bạn có thể, mà không có kết cấu khả năng bộ đệm đỉnh sẽ là bên cạnh vô dụng. VBO chỉ là một đoạn dữ liệu nhị phân với định dạng bạn chỉ định (kênh vị trí, kênh thông thường, kênh texcoord, v.v.) được giải thích bởi một shader. Khi vẽ một đối tượng, bạn đang yêu cầu GPU tìm nạp lô dữ liệu đó và áp dụng các thao tác được chỉ định trong trình đổ bóng (biến đổi đỉnh, tính toán ánh sáng, tìm nạp kết cấu, v.v.).

Vì vậy, lấy ví dụ bạn có một VBO với một bộ tứ được lưu trữ trong đó. VBO lưu trữ thông tin tọa độ vị trí và kết cấu của bốn đỉnh. Bây giờ, điều duy nhất bạn phải làm là liên kết VBO, liên kết IBO để chỉ định các hình tam giác hợp thành hình tứ giác của bạn, nói với shader của bạn sử dụng kết cấu bạn chọn và vẽ toàn bộ. Và bây giờ khi bạn có VBO và IBO hoạt động, bạn chỉ cần sửa đổi tham số kết cấu của trình đổ bóng và gọi lại hàm vẽ để sử dụng lại quad của bạn vào một đối tượng khác.

Trả lời 2:

Như được chỉ định trong câu trả lời 1, khi bạn đã tạo và lưu trữ VBO trong VRAM, bạn chỉ phải cập nhật các biến shader của mình và gọi glDrawElementslại để vẽ lại đối tượng.

Trả lời 3:

Chà, bạn có thể áp dụng GL_DYNAMIC_DRAWcho toàn bộ bản đồ, nếu đó là điều bạn muốn. Sự khác biệt giữa hai tùy chọn này là trình điều khiển chọn lưu trữ bộ đệm động trong phần VRAM nhanh nhất mà nó có thể tìm thấy, vì vậy nếu bạn sử dụng nó cho các đối tượng không thay đổi hình học của chúng, bạn sẽ lãng phí nó. Tham chiếu OpenGL cho glBufferData cung cấp cho bạn một gợi ý về cách sử dụng tốt nhất cho bộ đệm của bạn.

Câu trả lời cuối cùng:

glDrawArrayschỉ là phiên bản nguyên thủy của VBO, trong đó dữ liệu được chia theo các kênh nhưng được tải lại lên GPU trong mỗi cuộc gọi. Chỉ cần gắn bó với VBO nếu bạn muốn hiệu suất tốt nhất.


1

Mặc dù tôi hoàn toàn hài lòng với câu trả lời của r2d2rigo, tôi muốn giải thích cách tôi sẽ hình dung về VBO: D

Đầu tiên, Mặc dù VBO có nghĩa là Đối tượng đệm của Vertex, điều đó không có nghĩa là nó chỉ giữ tọa độ vextex.

    A Vertex will have attributes such as coordinates,texture 
    coordinates,normals,color.The whole thing makes a well defined vertex. 

Vì vậy, ở đây bạn cần hiểu một VBO như - "Nó có thể lưu trữ toàn bộ các thuộc tính đỉnh". Về cơ bản, VBO là một "bộ đệm" mà bạn có thể liên kết với bất kỳ thông tin đỉnh nào.

Trả lời 1: Có (Kiểm tra mô tả ở trên)

Trả lời 2: Các VBO thường "nhanh hơn" so với danh sách đỉnh thông thường, vì không cần phải đẩy thông tin đỉnh mỗi khung hình (nếu dữ liệu là tĩnh). Ngay cả khi kiến ​​trúc cơ bản là kiến ​​trúc bộ nhớ hợp nhất, nó sẽ có lợi ích vì không có "ghi đè" dữ liệu một cách không cần thiết.

Trả lời Kiến trúc bộ nhớ (nơi GPU sẽ chia sẻ RAM chính), tôi nghĩ nó sẽ không tạo ra sự khác biệt đáng kể nào.

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.