2012-07-08 27 views
14

Mam system renderowania, w którym rysuję do pliku FBO z multisamplingiem bufora renderowania, a następnie przesiewam go do innego pliku FBO z teksturą, aby rozdzielić próbki w celu odczytania tekstury w celu wykonania cieniowania po przetworzeniu podczas rysowania do backbuffer (indeks FBO 0).Kiedy wywołać funkcję glEnable (GL_FRAMEBUFFER_SRGB)?

Teraz chciałbym uzyskać poprawne wyjście sRGB ... Problem polega na tym, że zachowanie programu jest dość niespójne, gdy uruchamiam go w systemie OS X i Windows, co również zmienia się w zależności od komputera: W systemie Windows z Intelem HD 3000 nie zastosuje nieliniowości sRGB, ale na mojej drugiej maszynie z Nvidią GTX 670 to robi. Na Intel HD 3000 w OS X również go zastosuje.

To prawdopodobnie oznacza, że ​​nie ustawiam stanu aktywacji GL_FRAMEBUFFER_SRGB we właściwych punktach programu. Jednak nie mogę znaleźć żadnych tutoriali, które powiedzą mi, kiedy powinienem to włączyć, wspominają tylko, że jest to łatwe i nie ma żadnych kosztów wydajności.

Obecnie nie ładuję się w żadnych teksturach, więc nie miałem potrzeby zajmowania się linearyzacją ich kolorów.

Aby wymusić na programie nie tylko wypluwanie liniowych wartości kolorów, starałem się po prostu skomentować moją linię glDisable(GL_FRAMEBUFFER_SRGB), co oznacza, że ​​to ustawienie jest włączone dla całego rurociągu, a ja w istocie redundantnie zmuszam go do powrotu na każdej ramie.

Nie wiem, czy to prawda, czy nie. Z pewnością stosuje nielinearyzację kolorów, ale nie mogę stwierdzić, czy zostanie zastosowany dwukrotnie (co byłoby złe). Mogłaby zastosować gammę podczas renderowania do mojego pierwszego FBO. Mógłby to zrobić, kiedy zabrudzę pierwszego FBO do drugiego FBO. Dlaczego nie?

mam tak daleko, jak do podjęcia zrzuty ekranu z mojego ostatniego kadru i porównać wartości kolorów pikseli surowego do kolorów ustawić je w programie:

ustawić kolor wejściowy RGB (1, 2,3), a wyjście to RGB (13,22,28).

Wydaje się, że dość dużo kompresji kolorów na najniższym końcu i prowadzi mnie do pytania, czy gamma jest stosowany wielokrotnie.

Właśnie przeszedłem równanie sRGB i mogę sprawdzić, czy konwersja wydaje się być zastosowana tylko raz jako liniowa 1/255, 2/255, a 3/255 rzeczywiście odwzorować na sRGB 13/255, 22/255 i 28/255 przy użyciu równania 1.055*C^(1/2.4)+0.055. Biorąc pod uwagę, że rozszerzenie jest tak duże dla tych niskich wartości kolorów, powinno to być oczywiste, jeśli transformacja koloru sRGB zostanie zastosowana więcej niż raz.

Wciąż nie ustaliłem, co należy zrobić. czy glEnable(GL_FRAMEBUFFER_SRGB) ma zastosowanie tylko do końcowych wartości bufora ramki, w którym to przypadku mogę ustawić to podczas mojej procedury GL GLIN i zapomnieć o tym później?

Odpowiedz

17

Po włączeniu GL_FRAMEBUFFER_SRGB, wszystkie zapisy do obrazu z an sRGB image format przyjmą, że kolory wejściowe (zapisywane kolory) są w liniowej przestrzeni kolorów. Dlatego przekształci je w przestrzeń kolorów sRGB.

Nie należy zmieniać żadnych zapisów na obrazy o numerach , a nie w formacie sRGB. Więc jeśli piszesz do obrazu zmiennoprzecinkowego, nic nie powinno się wydarzyć. Dlatego powinieneś móc go po prostu włączyć i pozostawić w ten sposób; OpenGL będzie wiedział, kiedy renderujesz do bufora ramki sRGB.

Ogólnie rzecz biorąc, chcesz pracować w liniowej przestrzeni kolorów tak długo, jak to możliwe.Tylko końcowe renderowanie po przetworzeniu powinno obejmować przestrzeń kolorów sRGB. Tak więc twój wielościeżkowy framebuffer powinien prawdopodobnie pozostać liniowy (chociaż powinieneś nadać mu wyższą rozdzielczość dla swoich kolorów, aby zachować dokładność.) Użyj w końcu ostatecznej metody: GL_RGB10_A2, GL_R11F_G11F_B10F lub GL_RGBA16F.

chodzi o to:

W systemie Windows z Intel HD 3000 nie będzie stosować nieliniowości sRGB

czyli prawie na pewno z powodu Intel ssanie w pisaniu sterowników OpenGL. Jeśli nie robisz tego, co trzeba, gdy włączasz GL_FRAMEBUFFER_SRGB, dzieje się tak z powodu Intela, a nie twojego kodu.

Oczywiście może być tak, że sterowniki Intela nie dały Ci obrazu sRGB (jeśli renderujesz do domyślnego bufora ramki).

+1

Cóż, o to chodzi. Kiedy włączam 'GL_FRAMEBUFFER_SRGB' przy inicjalizacji i nie pstrykam go na zawsze, nawet w Intel HD 3000 w Windows zrobi on poprawną transformację. Wydaje się, że wymaga on włączenia większej ścieżki kodu niż w Nvidii. –

+0

To, co powiedziałeś, ma wiele sensu, że format buforów sRGB powinien określać, czy zapisywane są do nich wartości sRGB. Przetestuję to, aby sprawdzić, czy jest to prawidłowo zaimplementowane i zdecydowanie pozwoli mi uzyskać więcej kilometrów z 8 bitów na kanał. Mam nadzieję, że krok rozwiązywania wielopróbkowego to również poprawnie: Napotkałem niepoprawne wyniki rozstrzygania wielu próbek, ale mogłem pracować w niewłaściwym trybie w tym czasie. (zobacz ten temat http://www.opengl.org/discussion_boards/showthread.php/165081-Multisample-resolve-is-not-gamma-correct-wFBOs) –

+0

Czy Intel utrzymuje sterownik OpenGL dla swoich procesorów w Apple maszyny? Miałem wrażenie, że Apple napisał wszystko sam (co, moim zdaniem, wyjaśniłoby, dlaczego ich sterownik AMD jest tak zainfekowany). – Philip