2010-02-04 53 views
15

Tôi tự hỏi kể từ một thời gian dài những gì sẽ là cách tốt nhất để xử lý OpenGL FrameBuffer Objects (FBO). Chuyển đổi FBO có thể tốn kém nhưng xác định tệp đính kèm mới.Cách tốt nhất để xử lý FBO trong OpenGL là gì?

Bạn làm như thế nào nhanh?

Tôi ngần ngại giữa những 3:

  • 1 FBO cho tất cả mọi thứ, tập tin đính kèm thay đổi nhưng không chuyển qua lại giữa FBOs

  • 1 FBO cho mỗi kết xuất mục tiêu (kích thước + định dạng) trong render con đường. Điều đó có nghĩa là tôi sẽ tái sử dụng cùng một FBO cho các mục tiêu render tương tự. Nhưng theo cách này, việc làm mờ tùy chỉnh sẽ làm tăng 4 FBO.

  • 1 FBO cho mỗi kết xuất mục tiêu, thiết lập file đính kèm chỉ một lần và sau đó chuyển qua lại giữa FBOs

Ngoài ra, tôi nên giảm thiểu số lượng FBO công tắc (như tôi giảm thiểu số lượng các ràng buộc kết cấu)?

+0

trước ... FBO là gì? Nếu bạn sử dụng một từ viết tắt nhiều lần, bạn nên sử dụng nó lần đầu tiên. – fortran

+4

FBO = Framebuffer Object – ponce

+0

Câu hỏi hay. Tuy nhiên, phần đầu tiên của câu trả lời được đưa ra dưới đây mâu thuẫn với những gì được nói trong cuốn sách "OpenGL Insights". nhiều tệp đính kèm cho cùng một FBO. –

Trả lời

14

tài liệu tham khảo Cập nhật:


NVIDIA 2005 (lẽ đã lỗi thời): Khuyến cáo hiệu suất cuối cùng chính thức bởi NVIDIA tôi biết là gần năm tuổi.Trong GDC presentation của mình, Simon Xanh khuyến cáo như sau (trượt 29):

Để thực hiện tăng:

  1. Nhiều FBOs
    • tạo ra một FBO riêng cho từng chất liệu như bạn muốn render đến
    • chuyển đổi bằng cách sử dụng BindFramebuffer()
    • có thể nhanh hơn 2x2 lần wglMakeCurrent() trong bản beta Trình điều khiển NVIDIA
  2. Độc FBO, nhiều file đính kèm kết cấu
    • kết cấu nên có cùng định dạng và kích thước
    • sử dụng FramebufferTexture() để chuyển đổi giữa các kết cấu
  3. Độc FBO, nhiều file đính kèm kết cấu
    • đính kèm họa tiết vào các tệp đính kèm màu khác nhau
    • sử dụng glDrawBuffer() chuyển render để đính kèm màu sắc khác nhau

Theo kinh nghiệm của tôi, trường hợp thứ hai thực sự là nhanh hơn so với người đầu tiên (ATI Radeon HD4850, Geforce 8800GT). Tôi đã không thử trường hợp thứ ba, vì nó sẽ phức tạp mã của tôi.

+0

[Bản trình bày GDC tại đây] (https://developer.nvidia.com/sites/default/files/akamai/gamedev/docs/Porting%20Source%20to%20Linux.pdf) đề cập đến việc không chuyển tệp đính kèm vì dường như dẫn đến phần trình bày tệ. Vì vậy, nó mâu thuẫn với thứ tự hiệu suất này. – Deathicon

+0

Xin lưu ý rằng bài thuyết trình tôi đã đề cập là từ năm 2005 và kết quả của tôi là từ năm 2009. Tôi sẽ không ngạc nhiên nếu thứ tự hiệu suất thay đổi trong thập kỷ qua. –

+0

Tôi cũng sẽ thêm [link] này (https://software.intel.com/en-us/articles/opengl-performance-tips-swap-frame-buffer-objects-fbo-instead-of-surfaces-using- a-single), đề cập đến hiệu suất tốt hơn để chuyển đổi FBO (# 1) thay vì chuyển đổi tệp đính kèm (# 2 và # 3). Bạn nên cập nhật câu trả lời cho câu hỏi này. – Deathicon

4

Như một vấn đề về triết học, việc sửa đổi trạng thái đối tượng yêu cầu phải được xác thực lại. Thay vào đó, chỉ cần thay đổi ràng buộc đối tượng (đã được hợp lệ từ khung trước) nên nhanh hơn cho trình điều khiển [1]. Vì vậy, như là một triển khai đầu tiên, tôi muốn cho 1 FBO cho mỗi mục tiêu render (hoặc chính xác hơn, render mục tiêu thiết lập. Bạn thường hiển thị cho nhiều bộ đệm cùng một lúc).

Điều đó nói rằng, không có gì đánh bại ứng dụng của bạn so với nhiều triển khai.

[1] Tôi đề cập đến trình điều khiển, bởi vì thay đổi FBO có thể buộc GPU bị tuôn ra, tùy thuộc vào kiến ​​trúc. Nó sẽ giới thiệu bong bóng trong hầu hết các trường hợp. Vì vậy, nó chắc chắn là một cái gì đó mà bạn không muốn làm thường xuyên. Điều quan trọng hơn là tối ưu hóa các kết cấu kết cấu, ví dụ:

Các vấn đề liên quan