Gamma / Linear Light Pipeline Michał Drobot Technical Art Director Reality Pump
Problem gammy oraz wyświetlaniaProblem gammy oraz wyświetlania RozwiązanieRozwiązanie ZastosowanieZastosowanie Plan wykładu
Problem zapisywania obrazów i ich wyświetlaniaProblem zapisywania obrazów i ich wyświetlania Czy urządzenie do zapisu obrazu, zapisuje poprawnie wartości oświetlenia?Czy urządzenie do zapisu obrazu, zapisuje poprawnie wartości oświetlenia? Czy dwa razy więcej fotonów padających na matryce powoduje zapisanie dwa razy większej wartościCzy dwa razy więcej fotonów padających na matryce powoduje zapisanie dwa razy większej wartości Czy renderer tworzy poprawne pod względem oświetlenia dane?Czy renderer tworzy poprawne pod względem oświetlenia dane? Czy wyświetlacz przedstawia poprawnie dane?Czy wyświetlacz przedstawia poprawnie dane? Czy dwa razy jaśniejszy pixel jest przedstawiony jako rzeczywiście dwa razy jaśniejszy?Czy dwa razy jaśniejszy pixel jest przedstawiony jako rzeczywiście dwa razy jaśniejszy? Gamma
OdpowiedźOdpowiedź NIENIE Większość urządzeń zapisy i wyświetlania nie używa skali liniowejWiększość urządzeń zapisy i wyświetlania nie używa skali liniowej Renderer zależy od nasRenderer zależy od nas Gamma
Funkcja liniowaFunkcja liniowa F(x + y) = F(x) + F(y)F(x + y) = F(x) + F(y) F(kx) = k * F(x)F(kx) = k * F(x) Liniowość
Monitory, aparaty i skanery nie działają liniowoMonitory, aparaty i skanery nie działają liniowo Krzywa gammaKrzywa gamma Przeciętne wartości 2.0 – 2.4Przeciętne wartości 2.0 – 2.4 Każdy monitor ma własną krzywa gammaKażdy monitor ma własną krzywa gamma F(x) = x^2.2F(x) = x^2.2 Przyjęte przez format JPGPrzyjęte przez format JPG Gamma
Gamma
Pixel o połowie intensywności będzie wyświetlany z ¼ intensywnościPixel o połowie intensywności będzie wyświetlany z ¼ intensywności Sqrt(0.5) = 0.25Sqrt(0.5) = 0.25 Obliczenia światła powinny być proporcjonalnie powiązane z wartościami fizycznymiObliczenia światła powinny być proporcjonalnie powiązane z wartościami fizycznymi 2x więcej fotonów = 2x jaśniejszy pixel2x więcej fotonów = 2x jaśniejszy pixel Gamma
KonsekwencjeKonsekwencje Jak to działa
KonsekwencjeKonsekwencje Jak to działa
KonsekwencjeKonsekwencje Jak to działa 128
KonsekwencjeKonsekwencje Jak to działa
Textury wejścioweTextury wejściowe Przyjęto, że przeciętny użytkownik ma monitor o gammie 2.2Przyjęto, że przeciętny użytkownik ma monitor o gammie 2.2 Pliki graficzne w formatach kompresji są zapisywane z korektą gamma pow(1.0/2.2)Pliki graficzne w formatach kompresji są zapisywane z korektą gamma pow(1.0/2.2) Dowolny renderer przyjmujący dane wejściowe jako liniowe nie może normalnie traktować texturDowolny renderer przyjmujący dane wejściowe jako liniowe nie może normalnie traktować textur Konsekwencje
Dlaczego pracujemy w gammie?Dlaczego pracujemy w gammie? Konsekwencje
GammaGamma Daje więcej odcieni szarości niż przestrzeń liniowa dla tej samej ilości bitów (8 BIT)Daje więcej odcieni szarości niż przestrzeń liniowa dla tej samej ilości bitów (8 BIT) Ludzkie oko jest dużo bardziej wrażliwe na skale szarości niż na jasne tonyLudzkie oko jest dużo bardziej wrażliwe na skale szarości niż na jasne tony Oszczędność pamięciOszczędność pamięci Konsekwencje
GammaGamma Liniowa dla 8-bit = BANDINGLiniowa dla 8-bit = BANDING Konsekwencje
Liniowy zapisLiniowy zapis Brak bandingu w jasnych tonach, kosztem olbrzymiego w ciemnychBrak bandingu w jasnych tonach, kosztem olbrzymiego w ciemnych NieopłacalneNieopłacalne Konsekwencje
Liniowy zapis (0-255) vs GammaLiniowy zapis (0-255) vs Gamma 0 = 00 = 0 1 = 201 = 20 2 = 282 = 28 3 = 333 = 33 Konsekwencje
KonsekwencjeKonsekwencje Generowanie mipmapGenerowanie mipmap Podstawowa metodaPodstawowa metoda Weź 4 pixele z poziomu N+1Weź 4 pixele z poziomu N+1 Pixel N = avg(pix1,pix2,pix3,pix4)Pixel N = avg(pix1,pix2,pix3,pix4) Jeśli pixele to (1,1,0,0)Jeśli pixele to (1,1,0,0) Oczekujemy pixela o intensywności 0.5Oczekujemy pixela o intensywności 0.5 Zapisanie avg(1,1,0,0) = 0.5Zapisanie avg(1,1,0,0) = da nam pixel ¼ jasności zamiast da nam pixel ¼ jasności zamiast 0.5 Migotanie jasności detali wraz ze zmianą odległościMigotanie jasności detali wraz ze zmianą odległości Konsekwencje
KonsekwencjeKonsekwencje Filtrowanie mipmap / texturFiltrowanie mipmap / textur Operacja sprzętowaOperacja sprzętowa Działa liniowoDziała liniowo Przy źle wygenerowanych mipmapach prowadzi do jeszcze większych błedówPrzy źle wygenerowanych mipmapach prowadzi do jeszcze większych błedów Niestabilność obrazu przy filtrowaniuNiestabilność obrazu przy filtrowaniu Konsekwencje
KonsekwencjeKonsekwencje OświetlenieOświetlenie Model lamberta dot(N,L)Model lamberta dot(N,L) Działa liniowoDziała liniowo Wymaga korekcji przed wyświetleniemWymaga korekcji przed wyświetleniem Konsekwencje
F(x) = x^(1.0/2.2)F(x) = x^(1.0/2.2) Pipeline
F(x) = x^2.2F(x) = x^2.2 Pipeline
Pipeline Kamera konsumencka Prawdziwe światło 1/
RozwiązanieRozwiązanie (x^1/2.2)^2.2 = x(x^1/2.2)^2.2 = x Graficy pracują w przestrzeni gammaGraficy pracują w przestrzeni gamma Textury powiązane z oświetleniem musza być korygowaneTextury powiązane z oświetleniem musza być korygowane Obliczenia światła powinny być w przestrzeni liniowejObliczenia światła powinny być w przestrzeni liniowej PoprawnośćPoprawność Wymagana korekta przed wyświetleniemWymagana korekta przed wyświetleniem Korekcja
Korekcja
Gamma
RozwiązanieRozwiązanie Na wejściu korygujemy texturyNa wejściu korygujemy textury Float4 Color = pow(tex2D(tex,UV),2.2)Float4 Color = pow(tex2D(tex,UV),2.2) Obliczmy oświetlenieObliczmy oświetlenie LiniowoLiniowo Korygujemy do wyświetleniaKorygujemy do wyświetlenia Final = pow(Color, 1/2.2)Final = pow(Color, 1/2.2) Korekcja
Spec = CalSpec(); Diff = tex2D( Sampler, UV ); Color = Diff * max( 0, dot( N, L ) ) + Spec; return Color; Korekcja
Spec = CalSpec(); Diff = pow( tex2D( Sampler, UV ), 2.2 ); Color = Diff * max( 0, dot( N, L ) ) + Spec; return pow( Color, 1/2.2); Korekcja
Sprzętowa korekcjaSprzętowa korekcja Odczyt texturOdczyt textur D3DSAMP_SRGBTEXTURED3DSAMP_SRGBTEXTURE Zapis do render targetuZapis do render targetu D3DRS_SRGBWRITEENABLED3DRS_SRGBWRITEENABLE Shader może zostać w wesji sprzed korekcjiShader może zostać w wesji sprzed korekcji Oszczędność POW-ówOszczędność POW-ów Korekcja
X360X360 Uwaga na krzywą gamma x360Uwaga na krzywą gamma x360 Jest to to liniowa aproksymacjaJest to to liniowa aproksymacja Stratna w zakresie szarościStratna w zakresie szarości Za jasna niskich wartościachZa jasna niskich wartościach Zbyt kontrastowaZbyt kontrastowa Wraz z krzywymi gamma telewizorów wymaga dużo uwagi, żeby uniknąć bandingu i uzyskać pożądany efektWraz z krzywymi gamma telewizorów wymaga dużo uwagi, żeby uniknąć bandingu i uzyskać pożądany efekt Korekcja
Gamma spaceGamma space DiffuseDiffuse LightmapsLightmaps EmmisiveEmmisive Inne mapy percepcyjneInne mapy percepcyjne Linear spaceLinear space Normal mapNormal map Specular mapSpecular map Inne mapy wartości fizycznych / matematycznychInne mapy wartości fizycznych / matematycznych Korekcja
Podsumowanie For more information contact me Slides will be available at Drobot.org
Questions ?