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) ?
2 answers
Zaktualizowane referencje:
- NVIDIA 2016 (?) : Użyj wielu FBO
- intel 2016 : Użyj wielu FBO
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):
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.W kolejności zwiększania wydajności:
- 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- 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- 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
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.
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