24-bitowa Colordepth to za mało?


30

Zauważyłem, że przy bardzo miękkich gradientach 24-bitowa głębia kolorów nie wystarcza, ponieważ widać przejścia koloru. To pojawia się najbardziej w ciemnych scenach lub na nocnym niebie.

Dlaczego nikt nie zmienia głębokości kolorów na dwa bajty na kanał? Wiem, że byłoby to dużo pracy i trzeba by było naprawić wiele sprzętu, ale wydaje mi się to trochę denerwujące. Naprawdę nie sądzę, że technologia sprzętu nie jest wystarczająco dojrzała.

Dlaczego więc nikt tego nie robi?

Oto zdjęcie „The War Z”, gdzie możesz zobaczyć, co mam na myśli:

Przejścia kolorów w Wojnie Z


12
Twój obraz jest w formacie JPEG, który również może tworzyć artefakty. Czy możesz podać przykład w formacie bezstratnym?
Cesarz Orionii

Czy ty żartujesz? Narzekasz na głębię bitową, ale przesyłasz plik JPEG?
Tara

1
Dokładnie. Nie ma potrzeby stosowania bezstratnego formatu, gdy JPG doskonale pokazuje, co mam na myśli. BTW: To nie kompresja spowodowała ten efekt. Oszczędź swoje zasoby, człowieku ...
Liess Jemai

Odpowiedzi:


19

Mniej więcej sam to powiedziałeś: „Wiem, to byłoby dużo pracy i trzeba by wymienić sprzęt”. Podczas gdy sprzętowo-graficzny koniec rzeczy byłby stosunkowo prosty (jeśli byłby drogi - podwojenie rozmiaru wszystkich tekstur i buforów ramek nie jest trywialne), „ekosystem” dla obrazów o większej głębi kolorów po prostu nie jest odpowiedni dla w pewnym stopniu sprawia, że ​​jest to opłacalny wydatek w czyimkolwiek imieniu, ponieważ żaden producent LCD nie koncentruje się na próbach uzyskania do 16 bitów na piksel (choć przeprowadzono pewne eksperymenty przy 10BPP, które nadal wygodnie dopasowują sygnał RGB do 32- kanał bitowy).

Krótko mówiąc, jest to po prostu zbyt dużo pracy dla tego, co większość ludzi uważa za zbyt mały zysk. Może to być „trochę denerwujące”, ale ten poziom irytacji jest tak niewielki, że priorytetem stały się inne ulepszenia jakości obrazu.


1
Chociaż nie są one bezpośrednio dostępne dla użytkowników końcowych, niektóre wysokiej klasy monitory 27/30 "skierowane do profesjonalistów zajmujących się obrazem / wideo mają 14 bitów wewnętrznie / 10 zewnętrznie i wykorzystują dodatkowe 4 bity do przechowywania tabeli przeglądów, aby pomóc w kalibracji kolorów na wyświetlaczu.
Dan Neely,

@ DanNeely: Każdy „użytkownik końcowy” może mieć jeden za kilka tysięcy dolarów amerykańskich. Potrzebują również karty graficznej na poziomie profesjonalnym, takiej jak Quadro. Biorąc pod uwagę, co niektórzy ludzie płacą za telewizor i system dźwiękowy, nie jest to złe.
Zan Lynx,

@ZanLynx Użyłem wyrażenia skierowanego do profesjonalistów, a nie tylko do profesjonalistów. Każdy może kupić pełny stos; ale ceny są tak wysokie, a świadczenia tak rzadkie, że robi to niewiele osób. np. tylko 1,17% użytkowników Steam ma 2560 wyświetlaczy. A monitor jest jedyną częścią wymaganego stosu, który może się zdarzyć, że użytkownik zaawansowany dostanie się przypadkowo, ponieważ niektóre (wszystkie?) Markowe modele 2560 z roku modelowego 2011 od głównych dostawców zawierają 10/14-bitowy kolor; tańszy import z Korei nie był przez pewien czas szeroko dostępny. Karty Quadro / etc oferują graczom nic w porównaniu ze standardowymi.
Dan Neely,

1
Czy to możliwe, że takie pasmowanie jest w rzeczywistości optymalizacją tekstową w celu zmniejszenia ilości pracy renderującej niebo? Kiedy tworzę 24-bitowy gradient w GIMP, nie wygląda to tak. Zobacz static.inky.ws/image/4306/gradient.png, aby uzyskać gradient 24-bitowy.
ldrumm,

2
@ldrumm nie, nie bardzo, naprawdę skorzystałeś z najbardziej ekstremalnego zakresu i włączyłeś dithering w gimpie, spójrz na ten przykład z ditheringiem (widoczne niewielkie pasy) i tutaj bez ditheringu . Problem polega na tym, że nie można po prostu ogólnie przetworzyć ditheringu do tekstur, a większość tekstur nie jest tworzona za pomocą gradientów. Jeśli są ręcznie malowane i mają jakąś formę dużego obszaru z gradientem między 2 raczej podobnymi kolorami potem nastąpi
bandowanie

44

Tak, nie jesteś pierwszą osobą, która to zauważy . :) Przy dzisiejszych wysokich współczynnikach kontrastu 8 bitów na komponent nie wystarcza do uzyskania płynnego gradientu bez widocznych pasm - chyba że zastosowany zostanie dithering.

Używanie więcej niż 8 bitów na kanał na wyświetlaczu nazywa się „ głębokim kolorem ” przez producentów wyświetlaczy. Nie jest bardzo rozpowszechniony z powodu problemu z kurczakiem i jajkiem. Wyświetlacz z głębokimi kolorami jest bezużyteczny bez karty graficznej, która może generować głęboki kolor, oraz silnika gry obsługującego renderowanie do głębokich kolorów. Podobnie nie ma sensu silnik gry lub karta graficzna obsługująca głęboki kolor bez wyświetlacza. Dlatego producenci sprzętu i twórcy gier nie zachęcają do dodawania wsparcia dla tej technologii, ponieważ z obu stron nie ma rynku uzasadniającego koszty rozwoju.


Istnieją również inne sposoby naprawy pasmowania ze względu na ograniczoną 8-bitową precyzję. Jak wspomniałem wcześniej, silniki gier mogą używać ditheringu, aby ukryć pasmowanie.


(Zdjęcie kota z 256-kolorową paletą, bez ditheringu i z ditheringiem. Utworzony przez użytkownika Wikipedii Wapcaplet , wykorzystany na licencji CC-By-SA 3.0 .)

Dodanie lekkiego roztrząsania wynoszącego ± 0,5 / 255 przed zapisaniem wartości piksela w buforze ramki jest niezwykle skuteczne w ukrywaniu pasm na gładkich gradientach i zasadniczo niezauważalne. Jeśli pracujesz w silniku HDR, robisz to na etapie mapowania tonów.


Wreszcie, jak zauważyli inni, kompresja tekstur może być większym źródłem artefaktów pasmowych na obrazie niż 8-bitowa precyzja. To może być to, co dzieje się z niebem na tym zdjęciu, choć trudno to powiedzieć - ma tak dużą kompresję JPEG, że wszelkie artefakty spowodowane kompresją DXT są prawie zatłoczone.


+1 - doskonała odpowiedź, a ja całkowicie przegapiłem prawdopodobieństwo, że bandowanie miało inne przyczyny.
Steven Stadnicki,

1
+1 za zauważenie, że plik jest JPEG. Bezstratny przykład PO zapobiegłby złemu osądowi z powodu szumu w danych.
ldrumm,

@ldrumm Również gra / silnik, który nie jest straszny ...
Brian Ortiz

Dodałem zdjęcia, aby podkreślić różnicę, jaką może zrobić dithering. Zapraszam do powrotu, jeśli ci się nie podoba :)
BlueRaja - Danny Pflughoeft,

13

Warto również zauważyć, że wiele paneli LCD nie ma nawet 8 bitów na kanał. Tańsze zwykle używają mniej bitów i używają różnych sztuczek, aby to ukryć. Na przykład mogą szybko przełączać się między dwoma sąsiednimi kolorami, aby reprezentować ten pomiędzy nimi. http://www.anandtech.com/show/1557/3

Istnieje kilka szczegółów na temat tego, jak DXGI obsługuje 10 bitów na kanał i jaśniejsze niż białe kolory na http://msdn.microsoft.com/en-us/library/windows/desktop/jj635732%28v=vs.85%29.aspx

D3D od lat obsługuje także ponad 8 bitów na kanał. Nic nie stoi na przeszkodzie, aby deweloper wykonał dithering z 16 bitów na kanał do 8 bitów, jeśli uważają, że to dobry pomysł.

Oczywiście nie pomoże to tak bardzo, jeśli dane źródłowe (tekstura, itp.) Są tylko 8-bitowe (lub bardziej prawdopodobne DXT1, czyli efektywnie 5-6-5 bitów na kanał). Wydaje mi się, że to właśnie dzieje się z niebem na tym zrzucie ekranu (gaussowskie rozmycie 8-bpp sprawia, że ​​jest dla mnie znacznie gładsze), ale trudno jest być pewnym.


10

Odpowiedź Stevena Stadnickiego jest poprawna - gry rzadko używają tekstur o wyższej precyzji, ponieważ wymagają zbyt dużej ilości pamięci tekstur, aw konsekwencji zbyt dużej przepustowości pamięci podczas próbkowania tekstury w module cieniującym piksele. Istnieją jednak rozwiązania, które nie wymagają dużych tekstur. (Zamieszczę to jako komentarz, ale jest za długi).

Homeworld rozwiązuje ten problem, kodując obraz nieba jako gradienty wierzchołków . Ta technika świetnie sprawdza się w przypadku dużych obrazów o niskiej częstotliwości (tj. Gładkich gradientów) - jak niebo - gdzie tekstura pokrywa ogromną liczbę pikseli w grze.

Innym możliwym rozwiązaniem jest zastosowanie normalizacji histogramu do obrazu nieba. Jeśli dane tekstury mieszczą się w wąskim przedziale wartości, takim jak ciemne nocne niebo, większość bitów w każdym kanale kolorów nie zawiera żadnych użytecznych danych. Zamiast tego wykonaj następujące czynności:

  • Twórz oryginalną teksturę w formacie 16-bitowym, takim jak 16-bitowy TIFF.
  • Przygotowując tekstury do silnika gry, znajdź najciemniejszy piksel na obrazie i śledź to jako przesunięcie. Powiedzmy, że ta wartość piksela wynosi 0,1 w możliwym zakresie 0-1.
  • Następnie znajdź najjaśniejszy piksel i odejmij najciemniejszy piksel, aby uzyskać zakres wartości na obrazie. Tak więc, jeśli najjaśniejszy piksel jest nadal dość ciemny - powiedzmy 0,35 - zakres wynosi tylko 0,35 - 0,1 = 0,25. Na obrazie znajduje się tylko 25% zakresu wartości.
  • Wygeneruj teksturę skompresowaną w DXT / BC . Odejmij najciemniejszą wartość z każdego piksela i pomnóż, aby użyć całego zakresu kolorów. W przykładowym obliczeniu odejmujemy naszą ciemną wartość 0,1, a ponieważ istnieje tylko 25% dostępnego zakresu wartości, mnożymy każdą wartość piksela przez 4x, aby utworzyć teksturę w grze. Zrób to wszystko, zanim skwantyzujesz 16-bitowy obraz źródłowy aż do wejścia 8bpp do kompresora DXT. Obraz wyjściowy będzie teraz wykorzystywał cały zakres wartości obsługiwanych przez format w grze. Przydzielamy wszystkie nasze bity do reprezentowania wartości faktycznie obecnych na obrazie.
  • Przechowuj gdzieś metadane przesunięcia wartości ciemnej (0,1) i zakresu (0,25). Przekaż je jako dane wejściowe do modułu cieniującego piksele.
  • W kodzie cieniowania pikseli próbkuj przesuniętą, rozszerzoną teksturę, przekonwertuj ją na wartość zmiennoprzecinkową, a następnie wykonaj pomnożenie / dodanie, aby przywrócić pierwotną wartość koloru. Innymi słowy, należy pomnożyć przez 0,25 i dodać 0,1, aby przywrócić wartość zapisaną w obrazie źródłowym.

Upewnij się, że kod modułu cieniującego jest poprawny gamma . Jeśli wykonasz matematykę (oświetlenie i przetwarzanie końcowe) na próbkach tekstur, które nie są konwertowane z przestrzeni kolorów sRGB na przestrzeń liniową, zobaczysz artefakty pasmowania, takie jak te, które opisujesz. Korekcja gamma została stworzona, aby pomóc w rozwiązaniu tego rodzaju problemu poprzez przydzielenie większej liczby bitów ciemnym wartościom, w których twoje oczy są bardziej wrażliwe na zmiany wartości. Ale możesz łatwo zepsuć rzeczy, jeśli nie uwzględnisz korekcji gamma podczas obliczania, na przykład oświetlenia, ekspozycji lub efektów końcowych. Gamma FAQ jest bardzo pomocna.


1

24 bity to za mało, ale znacznie częściej zdarza się, że takie problemy są spowodowane algorytmami kompresji obrazu, aliasingiem lub innymi cyfrowymi artefaktami. Nie zapominaj też o roli technologii wyświetlania - bez względu na wejścia cyfrowe wyświetlacz może nie generować odpowiednich kroków w rzeczywistej jasności.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.