Jaka jest koncepcja i różnice między Framebuffer i Renderbuffer w OpenGL?

139

Jestem zdezorientowany koncepcją Framebuffer i Renderbuffer. Wiem, że są wymagane do renderowania, ale przed użyciem chcę je zrozumieć.

Wiem, że do przechowywania tymczasowego wyniku rysowania wymagany jest bufor bitmapy. Bufor tylny. Drugi bufor musi być widoczny na ekranie, gdy te rysunki są w toku. Bufor przedni. I odwróć je i narysuj ponownie. Znam tę koncepcję, ale ciężko jest powiązać te obiekty z tą koncepcją.

Jaka jest ich koncepcja i jaka jest między nimi różnica?

eonil
źródło
7
Renderbuffer to komponenty podobne do kanałów (kolor, szablon, głębia i etcs) Framebuffer. Zobacz: developer.apple.com/iphone/library/documentation/3DDrawing/ ...
eonil
2
Łącze jest specyficzne dla iPhone'a, ale bufory ramki są dobrze wyjaśnione.
j00hi

Odpowiedzi:

62

Ta strona zawiera pewne szczegóły, które moim zdaniem całkiem ładnie wyjaśniają różnicę. Po pierwsze:

Ostateczne miejsce docelowe renderowania potoku OpenGL nazywa się [the] framebuffer .

Natomiast:

Obiekt Renderbuffer
Dodatkowo, obiekt renderbuffer został niedawno wprowadzony do renderowania poza ekranem. Pozwala na renderowanie sceny bezpośrednio do obiektu renderowania, zamiast renderowania do obiektu tekstury. Renderbuffer to po prostu obiekt do przechowywania danych zawierający pojedynczy obraz renderowalnego formatu wewnętrznego. Służy do przechowywania buforów logicznych OpenGL, które nie mają odpowiedniego formatu tekstur, takich jak szablon lub bufor głębokości.

ChrisF
źródło
199

Obiekt Framebuffer nie jest w rzeczywistości buforem, ale obiektem agregatora, który zawiera jeden lub więcej załączników, które z kolei są rzeczywistymi buforami. Możesz zrozumieć Framebuffer jako strukturę C, w której każdy element członkowski jest wskaźnikiem do bufora. Bez żadnego załącznika obiekt Framebuffer zajmuje bardzo mało miejsca.

Teraz każdy bufor dołączony do bufora ramki może być buforem renderowania lub teksturą .

Renderbuffer jest rzeczywisty bufor (tablica bajtów lub liczb całkowitych, lub pikseli). W Renderbuffer przechowuje wartości pikseli w formacie natywnym, więc jest zoptymalizowany do niewidocznej renderowania. Innymi słowy, rysowanie do Renderbuffera może być znacznie szybsze niż rysowanie do tekstury. Wadą jest to, że piksele używają natywnego formatu zależnego od implementacji, więc odczyt z Renderbuffera jest znacznie trudniejszy niż odczyt z tekstury. Niemniej jednak, po namalowaniu Renderbuffera , można skopiować jego zawartość bezpośrednio na ekran (lub , jak sądzę, do innego Renderbuffera ), bardzo szybko za pomocą operacji transferu pikseli. Oznacza to, że Renderbuffer można użyć do wydajnego zaimplementowania wspomnianego wzorca podwójnego bufora.

Renderbuffery to stosunkowo nowa koncepcja. Wcześniej do renderowania tekstury używano bufora ramki , co może być wolniejsze, ponieważ tekstura używa standardowego formatu. Nadal można renderować teksturę i jest to bardzo przydatne, gdy trzeba wykonać wiele przejść nad każdym pikselem, aby zbudować scenę lub narysować scenę na powierzchni innej sceny!

Wiki OpenGL ma tę stronę, która pokazuje więcej szczegółów i łączy.

fernacolo
źródło
14
Dzięki! Wyjaśnienie tego jako czegoś w rodzaju podobnych struktur i wskaźników ma dla mnie znacznie więcej sensu.
DouglasHeriot
2
To wciąż jest dla mnie trochę zagmatwane. Jeśli renderbuffer pozwala tylko na szybkie kopiowanie do innego bufora renderującego, to prawie nie ma z niego pożytku! Jeśli muszę wykonać etap przetwarzania końcowego (taki jak SSAO), czy nie jest łatwiej renderować go do domyślnego bufora ramki przy użyciu wcześniej renderowanego do Textures niż renderowanie go do RenderBuffer, a następnie kopiowanie z powrotem na ekran?
CoffeDeveloper
4
Bufory renderowania nie są przeznaczone do niestandardowego przetwarzania końcowego. Mogą być używane do przechowywania informacji o głębokości i szablonie dla procedury rysowania. Jest to możliwe, ponieważ tylko sama implementacja GPL musi czytać dane z bufora renderowania i zwykle jest szybsza niż tekstury, ponieważ używa formatu natywnego. Jeśli potrzebujesz przetwarzania końcowego, użyj tekstur.
fernacolo