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?
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. –
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) –
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