Jaki jest najlepszy sposób obsługi FBO w OpenGL?

Zastanawiam się od dawna, jaki byłby najlepszy sposób obsługi obiektów OpenGL FrameBuffer (FBO). Przełączanie FBO może być kosztowne, ale definiowanie nowych załączników też.

Jak to zrobić szybko ?

Waham się między tymi 3:

  • 1 FBO do wszystkiego, Zmień załącznik, ale nie przełączaj się między FBO

  • 1 FBO dla każdego celu renderowania (rozmiar + format) w ścieżce renderowania. Oznacza to, że użyję ponownie tego samego FBO dla podobnego renderowania cele. Ale w ten sposób niestandardowe rozmycie kosztowałoby 4 + FBO.

  • 1 FBO dla każdego celu renderowania, Ustaw załączniki tylko raz, a następnie przełącz się między FBO

Również, czy powinienem zminimalizować liczbę przełączników FBO (jak zminimalizować liczbę wiązań tekstur) ?

Author: ponce, 2010-02-04

2 answers

Zaktualizowane referencje:


NVIDIA 2005 (prawdopodobnie przestarzały ): Ostatnia oficjalna rekomendacja firmy NVIDIA, którą znam, ma prawie pięć lat. W swojej prezentacji GDC , Simon Green zaleca następujące (slajd 29):

W kolejności zwiększania wydajności:

  1. Wiele FBO
    • Utwórz osobne FBO dla każdej tekstury, do której chcesz renderować
    • switch using BindFramebuffer()
    • może być 2x szybszy niż wglMakeCurrent() w wersji beta sterowników NVIDIA
  2. pojedyncze FBO, wiele załączników tekstur
    • tekstury powinny mieć ten sam format i wymiary
    • Użyj FramebufferTexture(), aby przełączać się między teksturami
  3. pojedyncze FBO, wiele załączników tekstur
    • dołączanie tekstur do różnych kolorowych załączników
    • Użyj glDrawBuffer(), aby przełączyć renderowanie na inny kolor załączników
Z mojego doświadczenia wynika, że drugi przypadek jest naprawdę szybszy niż pierwszy (ATI Radeon HD4850, Geforce 8800GT). Nie próbowałem trzeciego przypadku, ponieważ skomplikowałoby to mój kod.
 14
Author: Malte Clasen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-16 19:35:49

W filozofii modyfikowanie stanu obiektu wymaga jego ponownej walidacji. Zamiast tego, po prostu zmiana powiązania z obiektami (które jest już poprawne z poprzedniej ramki) powinna być szybsza dla Sterownika [1].

Więc jako pierwsza implementacja, wybrałbym 1 FBO dla każdego celu renderującego (lub dokładniej, render target set. Zwykle renderuje się do wielu buforów naraz).

To powiedziawszy, nic nie przebije porównywania aplikacji z wieloma wdrożenia.

[1] wspominam o sterowniku, ponieważ zmiana FBO może wymusić flush GPU, w zależności od architektury. W większości przypadków wprowadzi pęcherzyki. Jest to więc zdecydowanie coś, czego nie chcesz robić często. Jest to ważniejsze niż optymalizacja wiązań tekstur, np.

 4
Author: Bahbar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-04 12:09:14