Tôi có nên xử lý các nguyên hàm gỡ lỗi để kết xuất trong OpenGL hiện đại không?


7

Gần đây tôi đã bắt đầu chuyển một số bản demo kết xuất cũ mà tôi đã làm sang OpenGL hiện đại. Tôi đã có một lớp vẽ gỡ lỗi trong mã cũ của mình, sử dụng chế độ ngay lập tức glBegin (), glEnd (), v.v. để hiển thị các đối tượng gỡ lỗi như hình tam giác, hình khối và hình cầu, v.v.

Ban đầu tôi đã thay thế mã trong các hàm này bằng mã để tạo VAO và VBO (cho vị trí và màu sắc), liên kết chúng, gán dữ liệu đỉnh, kết xuất, sau đó vô hiệu hóa và xóa VBO và VAO. Có gì không ổn với điều này?

Tôi đã suy nghĩ về việc sửa đổi lớp để mỗi khi nó nhận được một cuộc gọi nguyên thủy, nó sẽ tạo ra VAO và VBO và gán dữ liệu đỉnh nhưng thực tế không thực hiện kết xuất cho đến khi hoàn thành việc kết xuất khác. Sau đó, nó kết xuất lại tất cả các prims gỡ lỗi đã được lưu trữ cùng một lúc.

Tôi không chắc về lợi ích của một trong hai cách làm này và chỉ tự hỏi mọi người nghĩ gì.

Câu trả lời:


7

Nếu bạn đang thực hiện vẽ gỡ lỗi, thì hiệu suất thực sự không phải là mối quan tâm cao nhất của bạn. Làm cho nó hoạt động là quan trọng hơn nhiều. Rốt cuộc, bạn sẽ không sử dụng công cụ này trong các bản dựng phát hành, vậy vấn đề là gì?

Tuy nhiên, nếu bạn quan tâm đến một cách để làm điều đó, trang này trên luồng đối tượng bộ đệm gợi ý các cách để cải thiện hiệu suất cho dữ liệu đỉnh được tạo thủ công. Đặc biệt chú ý đến phương pháp "Cập nhật bộ đệm".


1

Cho dù bạn muốn sử dụng chế độ ngay lập tức hoặc VBO, nó phụ thuộc vào độ phức tạp của cảnh. Tôi đã thấy một số ví dụ trong đó các đường tiếp tuyến / bình thường được vẽ bằng chế độ ngay lập tức.

Không có gì sai khi sử dụng VBO để gỡ lỗi. Tuy nhiên, hãy nhớ rằng, nói chung, việc tạo khối sẽ mang lại cho bạn lợi ích về hiệu suất cho dù bạn sử dụng phương pháp nào, vì vậy hãy luôn tìm cách sử dụng nó bất cứ khi nào có thể. Bạn vẫn có thể hưởng lợi rất nhiều từ việc tạo khối trong chế độ ngay lập tức (thậm chí có thể nhiều hơn), vì nó sẽ làm giảm đáng kể số lượng thay đổi trạng thái. Nếu được sắp xếp đúng cách, bạn sẽ chỉ cần một GlBegin () và GlEnd () và tất cả dữ liệu tương tự được nhóm chặt chẽ với nhau. Sự khác biệt duy nhất là bạn sẽ thực hiện các cuộc gọi trạng thái theo đợt thay vì dữ liệu đỉnh.


3
Tôi không muốn sử dụng chế độ ngay lập tức vì nó không được dùng nữa. Vào lúc tôi đã thay thế chế độ ngay lập tức để trong một cuộc gọi để nói DrawDebugCube (), nó tạo ra các bộ đệm đỉnh, điền dữ liệu vào chúng, kết xuất chúng và sau đó xóa chúng. Những gì tôi nghĩ làm là có DrawDebugCube () chỉ cần tạo bộ đệm và điền vào chúng. Sau đó, tất cả các prims gỡ lỗi đã được đệm sẽ được kết xuất cùng một lúc sau đó.
dùng10329
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.