2012-01-23 6 views
5

Aby wyjaśnić, kiedy mówię "domyślny buforek ramki" mam na myśli ten dostarczony przez system okienkowy i co kończy się na twoim monitorze.Łączenie FBO z domyślnym buforem ramki

Aby poprawić szybkość renderowania w aplikacji CAD, udało mi się oddzielić elementy 3D od 2D z obsługą Qt, a teraz każdy z nich renderuje do własnego FBO. Kiedy nadejdzie czas, aby je przenieść na ekran, wybijam 3D FBO na domyślny FB, a potem chcę połączyć moje 2D FBO na wierzchu.

Dostałem się do części blednej w porządku, ale nie widzę, jak połączyć moje 2D FBO na to? Obie transakcje FBO są identyczne pod względem rozmiaru i formatu i są takie same jak domyślne FB.

Jestem pewien, że to prosta operacja, ale nie mogę znaleźć niczego w sieci - prawdopodobnie brakuje mi właściwego terminu na to, co próbuję zrobić. Chociaż używam Qt, mogę używać rodzimych poleceń OpenGL bez problemu.

Odpowiedz

7

Operacja blit to operacja kopiowania pikseli. Jeśli chcesz umieścić jeden obraz na drugim, nie możesz go zbrukać. Zamiast tego musisz renderować pełnoekranowy quad jako teksturę i użyć funkcji proper blending parameters do operacji mieszania.

+0

To tylko wydaje się strasznie nieskuteczny chociaż mam dwie tablice wartości pikseli (bufory) równej wielkości, w końcu wszystko, co musisz zrobić, to zastosować operację matematyczną scalić element jednego z nich odpowiedni element drugiego. Czy OpenGL naprawdę traktuje FBO tylko jako tekstury? – cmannett85

+0

@ cbamber85 rendering do tekstury nie byłby tak nieefektywny –

+1

@ cbamber85: "Czy OpenGL naprawdę traktuje FBO tylko jako tekstury?" FBO to tylko pojemniki na obrazy. Dołączasz obrazy do sprzedawców, ale FBO sama ich nie ma. Obrazy pochodzą z innych obiektów: tekstur i buforów renderowania. I choć "nieefektywne" może się wydawać, renderowanie jednego obrazu na drugim jest niezwykle szybkie. Bez transformacji wierzchołków. Nic więcej niż próbkowanie tekstur w module cieniującym fragment. Dodatkowo interfejs API nie daje innego sposobu na zrobienie tego, więc jest tak wydajny, jak to tylko możliwe. –

1

Możesz użyć GL_EXT_framebuffer_blit do blit zawartość obiektu framebuffer do framebuffera aplikacji (lub do dowolnego innego). Chociaż, jak podaje specyfikacja, nie można użyć mieszania:

Kopiowanie w pikselach pomija układ fragmentów. Jedynymi operacjami, które wpływają na blit, są test własności pikseli i test nożycowy.

Tak więc dowolne mieszanie oznacza użycie cieniowania fragmentów zgodnie z sugestią. Jeden fullscreen pass z mieszaniem powinien być dość tani, uważam, że nie ma się czym martwić.

Powiązane problemy