Bộ đệm đỉnh lớn so với nhiều cuộc gọi rút thăm


14

Tôi mới bắt đầu với OpenGL và tôi đang cố gắng sử dụng nó để tạo trò chơi 2D. Trong trò chơi này, tôi có một lưới hình lục giác được tạo thành từ rất nhiều hình lục giác có màu khác nhau. Là một lập trình viên OpenGL mới, tôi thấy hai cách vẽ lưới này:

  1. Sử dụng bộ đệm đỉnh với dữ liệu cho một hình lục giác đơn, sau đó sử dụng giá trị bù đồng nhất và lặp lại trên CPU để vẽ cùng một chương trình nhiều lần cho đến khi tôi có lưới.
  2. Tạo một bộ đệm đỉnh được tính toán trước rất lớn, thu hút tất cả các hình lục giác trong một cuộc gọi.

Phương pháp hiệu quả nhất là gì? Có cách nào tốt hơn để làm điều này?


Bộ đệm đỉnh được tính toán trước của bạn chỉ cần kéo dài qua màn hình bằng một hình lục giác, sau đó bạn có thể giả mạo nó bằng cách cuộn trơn tru cho đến khi bạn đi một hình lục giác đầy đủ và sau đó "cong" lại, như đối với các màu trong kịch bản đó, bạn có thể giữ Kết cấu 2D trên GPU, đọc nó trong shader đỉnh và phẳng nội suy nó vào shader mảnh.
MickLH

Pass thường đề cập đến một tình huống trong đó một hoạt động kết xuất phụ thuộc vào kết quả của hoạt động trước đó. Những gì bạn đang hỏi về câu hỏi này thực sự có liên quan đến việc giảm số lượng cuộc gọi rút thăm trong một lượt. Tôi biết nó nghe có vẻ khoa trương, nhưng điều rất quan trọng là phải hiểu sự khác biệt nếu không các thuật toán nhiều đường chuyền sẽ không có nhiều ý nghĩa;)
Andon M. Coleman

@ AndonM.Coleman Hmm, cảm ơn, tôi rõ ràng không quen thuộc với thuật ngữ đồ họa. Vì vậy, trong trường hợp này, tôi sẽ mô tả nó như thế nào? Nhiều cuộc gọi shader / chương trình?
Alexis King

Bạn có thể ngay lập tức nói rằng đây là một thuật toán vượt qua đơn vì không có sự phụ thuộc thứ tự; bạn có thể vẽ các hình lục giác này theo bất kỳ thứ tự nào mà vẫn nhận được kết quả tương tự. Bạn có thể thực hiện nhiều lệnh gọi rút thăm để cung cấp cho OpenGL dữ liệu cần thiết để hiển thị chúng, nhưng OpenGL hoàn toàn miễn phí để có thể rút tất cả chúng song song vì không có phụ thuộc. Nếu nó là nhiều đường chuyền , thì hình lục giác B có thể yêu cầu kết quả của hình lục giác A trước khi nó có thể được vẽ hoặc bạn có thể cần phải vẽ cùng một hình lục giác nhiều lần và kết hợp kết quả.
Andon M. Coleman

Câu trả lời:


9

Thực sự có một vài cách để tạo ra một lưới như vậy.

Cách hiệu quả nhất sẽ là inst instaging. Bằng cách này, bạn tạo hình lục giác của mình chỉ một lần trong VBO và hiển thị số này một trăm, một nghìn hoặc một triệu lần. Bạn có thể thực hiện thủ công bằng cách sử dụng trình tạo bóng với đồng phục như bạn đã nói ở điểm 1, nhưng cũng có chức năng OpenGL tích hợp cho nó. Đối với điều đó, hãy xem glDrawElementsInstified .

Lưu ý rằng instaging chỉ nhanh hơn các phương thức khác nếu bạn vẽ nhiều hơn một lượng đối tượng nhất định. Ví dụ, vẽ 300 có thể nhanh hơn khi sử dụng 1 VBO lớn, nhưng vẽ 2 triệu có thể nhanh hơn nếu bạn sử dụng kết xuất đồ họa.

Nếu bạn sử dụng kết xuất theo bản năng, bạn có thể gửi dữ liệu theo từng đối tượng bằng cách sử dụng Số chia thuộc tính . Trong trường hợp của bạn, bạn sẽ muốn gửi vị trí và màu sắc.

Một hướng dẫn tốt về kết xuất theo bản năng: nhấp vào

Cách thực sự tốt nhất là thử cả hai phương pháp và kiểm tra lượng mili giây cần thiết để vẽ 1 khung hình. Bằng cách này bạn cũng học được cả hai cách, luôn luôn tốt.

Cũng lưu ý rằng kết xuất theo bản năng là một chức năng OpenGL hiện đại và bạn sẽ phải sử dụng các trình đổ bóng để sử dụng nó. Nhưng tốt nhất là học nó ngay từ đầu.


2
Sơ đồ không nhất thiết là hiệu quả nhất; trong nhiều triển khai tôi đã thấy hồ sơ, hỗ trợ khởi động đã được giải quyết cho phù hợp nhưng chậm hơn so với việc vẽ riêng nhiều đối tượng (thực sự, đó có thể chỉ là một vòng lặp được triển khai kém trong trình điều khiển làm điều đó). Đó là một lựa chọn và là một lựa chọn tốt, nhưng người ta nên cẩn thận để lập hồ sơ và kiểm tra trên hệ điều hành / phần cứng đích trước khi đưa ra bất kỳ giả định nào về "hiệu quả nhất".
Sean Middleditch

Đã đồng ý. Tôi đã thấy các hiệu suất khác nhau trên Windows / Linux và Ati / nVidia chẳng hạn. Cảm ơn đã bổ sung.
Basaa

1
Trong thực tế. Nếu bạn vẽ nhiều lưới kết hợp trong một vbo (chia sẻ cùng một không gian). Không có cách nào có thể nhanh hơn. Vấn đề với sự thay đổi là: các đỉnh không được tính toán song song. Nó chỉ loại bỏ gpu / cpu / gpu sync / drawcall. Vì vậy, sẽ nhanh hơn khi vẽ một bộ đệm đỉnh chứa 1000 hình cầu so với vẽ 1000 hình cầu với phần cứng. (không có tối ưu hóa chi tiết khoảng cách / loại bỏ đối tượng liên quan)
Jeroen van Langen

3

Phương pháp 1 đơn giản hơn để viết mã và sẽ ổn miễn là bạn không có quá nhiều hình lục giác trong cùng một lúc. Bạn có thể muốn gắn bó với điều này vì bạn chưa quen với OpenGL, để tránh đặt quá nhiều sự phức tạp vào đĩa của bạn cùng một lúc.

Nếu có một số lượng lớn các hình lục giác (như vài trăm hoặc hơn một nghìn) cùng một lúc, một phương pháp có chi phí thấp hơn sẽ là cần thiết để tránh tình trạng quá tải CPU khi thực hiện quá nhiều lần rút riêng lẻ. Phương pháp 2 sẽ làm việc cho điều này, hoặc thậm chí tốt hơn, sử dụng inst instaging. Tôi mong muốn việc chạy nhanh hơn phương pháp 2, hoặc chắc chắn không tệ hơn, vì bạn chỉ phải cập nhật bộ đệm dữ liệu theo trường hợp chứ không phải là bộ đệm dữ liệu đỉnh (lớn hơn nhiều) cho tất cả các trường hợp.

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.