Jeśli chodzi o matematykę shaderów, dlaczego liniowy RGB powinien utrzymywać gamę sRGB?

13

sRGB często kontrastuje z „liniowym RGB”.

  • Obrazy są przechowywane na dysku i przekazywane do wyświetlaczy w sRGB, który ma w przybliżeniu jednorodnie percepcyjnie intensywność.
  • Matematyka modułu cieniującego odbywa się w liniowym RGB, który ma fizycznie jednorodną intensywność.
  • Można zastosować korekcję gamma w celu konwersji między nimi.

Teraz sRGB ma standard, który kolorymetrycznie określa gamę, mówiąc dokładnie, gdzie leży czysta czerwień, zieleń, błękit i biel. Ale nie ma odpowiedniego standardu dla „liniowego RGB”. Każdy trójkąt na schemacie chromatyczności można nazwać liniowym i rzeczywiście istnieje kilka dobrze znanych gam do wyboru:

Gamy RGB

W praktyce, gdy mówimy „liniowy RGB”, mamy na myśli „sRGB bez korekcji gamma”. (Jest to domyślnie to, co robimy, gdy zastosujemy korekcję gamma sRGB jako końcowy etap przetwarzania końcowego, ale zignorujemy przestrzenie kolorów dla pozostałej części potoku renderowania.)

Ale dlaczego jest to RGB gama poprawny używaną do obliczeń interpolacji i oświetlenia? To wydaje się arbitralne. Jeśli cokolwiek, czy nie chcielibyśmy użyć największej możliwej gamy do wewnętrznych obliczeń, a następnie przyciąć lub skalować kolory do gamy urządzenia wyjściowego na samym końcu?

Czy oświetlenie RGB ma być przybliżone bez względu na wszystko, więc nie ma znaczenia, którą gamę wybieramy i równie dobrze możemy wybrać tę najbliższą temu, co natywnie obsługuje wyświetlacz? Czy to tylko zaniedbanie? Czy może obliczenia w tych różnych gamach faktycznie dają dokładnie takie same wyniki?

Maks
źródło

Odpowiedzi:

13

Mówiąc o liniowym RGB, należy unikać, ponieważ nie mówi ono nic o wewnętrznych elementach przestrzeni kolorów RGB, tj. Funkcjach Primary, Whitepoint i Color Component. Kilka lat temu, zakładając, że był to sRGB, był średni, ale obecnie, gdy DCI-P3 i BT.2020 są bardzo powszechne, należy to wykluczyć.

Idealną gamą do renderowania jest ta, która zminimalizuje błędy w odniesieniu do realnych odniesień lub, wygodniej, do renderowania spektralnego z prawdą podstawową. Pierwsze zdanie z tego zdania jest takie, że różne przestrzenie kolorów RGB nie są równoważne i nie dają podobnych wyników.

Można by pomyśleć, że wykonanie dwóch renderów z tymi samymi kolorami podstawowymi, ale jednym, w którym są one zakodowane za pomocą sRGB / BT.709, a drugim, w którym są one zakodowane za pomocą DCI-P3, a następnie przekonwertowanie dwóch powstałych obrazów na przykład na ACES2065-1 dają te same obrazy, ale tak nie jest. Niektóre operacje matematyczne ze względu na naturę algebry liniowej i macierzy zależą od danych podstawowych przestrzeni kolorów RGB, tj. Na podstawie przestrzeni kolorów. Te same operacje wykonywane w różnych przestrzeniach kolorów RGB przyniosą różne wartości trójbodźca po konwersji z powrotem do przestrzeni kolorów CIE XYZ. Na przykład operacje mnożenia, dzielenia i zasilania są zależne od pierwotnych przestrzeni kolorów RGB, podczas gdy dodawanie i odejmowanie nie są.

Przestrzenie barw RGB i potęgowanie

Ten obraz ilustruje efekt mnożenia różnych kolorów przez siebie do różnych przestrzeni kolorów RGB: kolory wynikowe są różne. Różne próbki są generowane w następujący sposób: 3 losowe wartości przestrzeni kolorów sRGB są wybierane i konwertowane do trzech badanych przestrzeni kolorów RGB, są one wykładniczo przekształcane z powrotem do przestrzeni kolorów sRGB, wykreślane na schemacie chromatyczności CIE 1931 po lewej stronie i wyświetlane jako próbki na dobrze.

Testy i badania przeprowadzone przez Warda i Eydelberga-Vileshina (2002) , Langlandsa i Mansencala (2014) i Mansencala (2014) wykazały, że gamuty z pierwszorzędowymi najbliższymi locus widmowemu , tj. Widmowo ostrymi pierwotnymi, mają tendencję do minimalizowania błędów w porównaniu z ziemią spektralną prawda czyni.

Oto zdjęcie, które niedawno wykonałem z Mitsubą w celu ponownej weryfikacji naszych ustaleń z Anders:

Renderowanie przestrzeni kolorów

Są to rendery tej samej sceny przy użyciu pierwotnych BT.709 (pierwszy rząd), 47 przedziałów widmowych (drugi rząd), pierwotnych BT.2020 (trzeci rząd), widmowe minus BT.709 pierwotne renderuje reszty (czwarty rząd), spektralny minus BT .2020 pierwotne renderuje resztki (piąty rząd). Ostatni wiersz przedstawia złożone obrazy złożone z trzema pionowymi paskami odpowiednio renderów podstawowych BT.709, renderów pierwotnych spektralnych i BT.2020. Bezpośrednie oświetlenie zwykle pasuje do renderów. Obszary, które wykazują efekt wielokrotnego odbicia światła, tj. Sufit, w renderach pierwotnych BT.709 i BT.2020 wykazują tendencję do zwiększonego nasycenia, szczególnie w renderowaniu pierwotnych BT.709 lub niewielkiej utracie energii, szczególnie w BT Renderowanie .2020. Wyłączając wartości odstające, np. Źródło światła widzialnego, RMSE z renderowaniem widmowym wynoszą 0,0083i 0,0116 odpowiednio dla renderów podstawowych BT.2020 i podstawowych BT.709.

Teraz nie oznacza to, że zawsze będą działać lepiej, i można być w stanie stworzyć przykłady, które wykażą tendencję do BT.709 / sRGB. Główną zaletą jest to, że rendery RGB nie mogą dopasować się do renderów widmowych, a ostre szerokie gamy wydają się lepiej. Jeśli chodzi o wybór renderowanej przestrzeni kolorów, wybrałbym taką z szeroką gamą kolorów, która obejmuje gamę Pointera, a DCI-P3, BT.2020 lub ACEScg są do tego znakomitymi kandydatami.

Kel Solaar
źródło
5

W praktyce, gdy mówimy „liniowy RGB”, mamy na myśli „sRGB bez korekcji gamma”.

Bardziej słuszne byłoby stwierdzenie, że istnieje „przestrzeń kolorów sRGB” i „linearyzowana przestrzeń kolorów sRGB”, z definicją specyfikacji sRGB konwersją z jednej na drugą.

Tak, istnieje nieskończenie wiele przestrzeni kolorów „liniowych RGB”. Jednak wspólną cechą wszystkich tych „liniowych przestrzeni kolorów RGB” jest ich liniowość . Oznacza to, że podwojenie wartości dowolnego komponentu powoduje podwojenie intensywności światła reprezentowanego przez ten komponent. Zasadniczo to oznacza „liniowość”: istnieje liniowe odwzorowanie między wartościami kolorów a wynikową intensywnością tego koloru światła.

Jest to ważne, ponieważ równania oświetlenia nie działają, jeśli wartości kolorów nie są mapowane liniowo na natężenia światła. Ale równania nie dbają o to, której liniowej przestrzeni kolorów używasz; musisz tylko wybrać jeden.

Zatem zlinearyzowana przestrzeń kolorów sRGB nie jest bardziej poprawna niż zlinearyzowana przestrzeń kolorów Adobe RGB lub zlinearyzowana przestrzeń kolorów SWOP CMYK. Liczy się dokładnie dwie rzeczy:

  1. Przestrzeń kolorów reprezentuje liniowe odwzorowanie wartości na natężenia światła.
  2. Wybrana przestrzeń kolorów jest konsekwentnie wykorzystywana w równaniu oświetlenia. Oznacza to, że wszystkie kolory użyte w równaniu oświetlenia pochodzą z tej samej (liniowej) przestrzeni kolorów.

Czy oświetlenie RGB ma być przybliżone bez względu na wszystko, więc nie ma znaczenia, którą gamę wybieramy i równie dobrze możemy wybrać tę najbliższą temu, co natywnie obsługuje wyświetlacz?

To i fakt, że konwersja sRGB jest obecnie wbudowana w sprzęt, podczas gdy inna konwersja przestrzeni kolorów często nie jest. Jeśli więc chcesz użyć zlinearyzowanej przestrzeni kolorów Adobe RGB, musisz dużo pracy w swoich modułach cieniujących, aby zlinearyzować wartości tekstu i poprawnie wykonać na nich interpolację dwuliniową / trójliniową (co należy zrobić po linearyzacji), zanim będzie można zastosować je do równania oświetlenia. Następnie musisz wykonać konwersję z linearyzowanego Adobe RGB do zlinearyzowanego sRGB, abyś mógł zapisać obraz bufora ramki sRGB do wyświetlenia.

Lub możesz po prostu użyć zlinearyzowanego sRGB wszędzie i uzyskać wydajność. Ta ostatnia ma tendencję do wygrywania.

Nicol Bolas
źródło
Co sądzisz o tym piśmie? Jeśli czytam to prawo, to pokazuje, że obliczenia w różnych przestrzeniach liniowych kolorowych zrobić prowadzić do różnych wyników.
Maks.
@ Maxpm: To interesujące. Przeczytałem ten artykuł, że problem sprowadza się do tego, że światło w rzeczywistości nie pasuje do naszego modelu przestrzeni kolorów RGB. Powoduje to rozbieżne efekty wizualne w tym, co matematycznie powinno być tym samym. Tam wydaje się, że jedynym rozwiązaniem jest zaprzestanie korzystania z RGB i rozpoczęcie renderowania spektralnego.
Nicol Bolas,
@Maxpm, ale oczywiście robią to, gdy wszystkie inne spacje są różne. Ale wtedy RGB nie jest kolorem, więc jest. Ale jest pytanie, czy chcesz być poprawny. Zyski stają się coraz mniejsze,
joojaa 18.10.18
0

Istnieją dwie strony, dlaczego szczególnie sRGB. W przypadku wejściowych obrazów innych niż HDR twierdzi się, że należy przyjąć, że są one skompresowane do sRGB (to, czy to twierdzenie jest dokładne, to inna historia). Dlatego zanim będziesz mógł wykonać na nich liniową operację matematyczną, musisz zdekompresować je z sRGB. Możliwe jest również, że obraz został przechwycony i skompresowany do innej reprezentacji, która nie jest sRGB, w takim przypadku musisz zdekompresować tę konkretną reprezentację. W każdym razie kodowanie sugeruje pewną gamę, że obraz wejściowy nigdy nie ucieknie (ponieważ obrazy przechowywane w sRGB są zwykle skracane do 8 bitów na kanał), ale matematyka modułu cieniującego nie musi pozostać w tej gamie po wejściu obraz jest dekompresowany. Ale w końcu musisz wziąć pod uwagę wyświetlacz.

Jeśli masz obraz i nadszedł czas, aby go wyświetlić, zakoduj go w reprezentacji wymaganej przez urządzenie wyświetlające. CRT wybrały sRGB, a następnie emulowały je LCD, więc kompresja sRGB do wyświetlania na monitorze była powszechnym wyborem w ostatnich dziesięcioleciach, i to ograniczyło moc wyjściową do utrzymania się w gamie sRGB, w przeciwnym razie nastąpi przycięcie. Wyświetlacze o szerszym zasięgu nie muszą trzymać się dokładnie tej gamy.

(Myślę, że podstawą twierdzenia, że ​​obrazy stworzone przez człowieka są zakodowane w sRGB, jest to, że zakłada się, że obrazy te zostały stworzone na wyświetlaczach sRGB)

Więc teraz prawdopodobnie lepiej zrozumiesz, dlaczego w szczególności sRGB był obsługiwany sprzętowo do wprowadzania matematycznego modułu cieniującego i wyświetlania obrazu. To częsty przypadek. Ponadto ma dobre zalety w zakresie zmniejszania artefaktów postrzegania pasm kolorów, więc jest to dobry sposób na kompresowanie kolorów w 8 bitach i utrzymanie ich wiarygodności dla ludzi.

wbahnassi
źródło
0

Jeśli dopuścisz wartości spoza zakresu 0..1, to nawet przy dość ograniczonych podstawach sRGB nadal możesz zająć się całą gamą wizualną człowieka. Tak więc do przechowywania zmiennoprzecinkowych wartości koloru światła nie powinno mieć większego znaczenia, jakich podstawowych kolorów używasz. Jednak wykonywanie dowolnego rodzaju multiplikatywnej matematyki staje się nieco dziwne, ponieważ dowolne współrzędne liczb podstawowych działają jak „oś obrotu”. Zasadniczo sRGB są zwykle używane, ponieważ tradycyjnie dane wejściowe są zakodowane w sRGB, a wyjściowy wyświetlacz to sRGB lub rec709 ... W przypadku rec2020 połowa się zmieniła, ale na razie większość danych wejściowych jest prawdopodobnie zakodowana w sRGB, więc używając te same funkcje podstawowe, co pamięć, to tylko najłatwiejsza opcja.

Hodgman
źródło