jak działa HDR?

17

Próbuję zrozumieć, czym jest HDR i jak działa.

Rozumiem podstawowe pojęcia i mam niewielkie pojęcie o tym, jak jest on implementowany w D3D / hlsl.

Jednak nadal jest dość mglisty.

Powiedzmy, że renderuję kulę z teksturą ziemi i małą listą punktów wierzchołków, która ma działać jak gwiazdy, jak miałbym to renderować w HDR?

Oto kilka rzeczy, które mnie mylą:

  • Zgaduję, że nie mogę użyć żadnego podstawowego formatu obrazu dla tekstury, ponieważ wartości byłyby ograniczone do [0, 255] i ograniczone do [0, 1] w module cieniującym. To samo dotyczy bufora wstecznego. Rozumiem, że format musi być formatem zmiennoprzecinkowym?

  • Jakie są inne kroki? Z pewnością musi być coś więcej niż tylko używanie formatów zmiennoprzecinkowych do renderowania w celu renderowania, a następnie zastosowanie rozkwitu jako procesu końcowego? (biorąc pod uwagę, że wynik i tak będzie wynosił 8 pb)

Zasadniczo, jakie są kroki dla HDR? Jak to działa ? Nie mogę znaleźć żadnych dobrych artykułów / artykułów, które opisywałyby ten proces, poza tym , ale wydaje się, że nieco przesadzają z podstawami, więc jest mylące.

dotminic
źródło

Odpowiedzi:

19

Techniki HDR pozwalają symulować większy zakres szczegółów niż jest to możliwe na ekranie niż w przypadku tradycyjnego oświetlenia / tekstur. Możesz porównać to z zachowaniem oka po wystawieniu go na działanie różnych ilości światła - gdy jest za dużo światła, oko wpuszcza mniej światła, więc rzeczy są nadal w zasięgu widzialnym. Gdy nie ma wystarczającej ilości światła, przesłona otwiera się bardziej, dzięki czemu można zobaczyć więcej szczegółów.

bit-tech.net Porównanie HDR

Prawa strona tego obrazu używa HDR. W większym stopniu wykorzystuje gamę kolorów, ciemności są ciemniejsze, a jasne obszary są jaśniejsze. Dla porównania lewa strona obrazu wygląda trochę płasko.

Podstawowe kroki to:

  1. Renderuj scenę do tekstury zmiennoprzecinkowej (w formacie takim jak A16B16G16R16F), używając innych tekstur zmiennoprzecinkowych w modelach i / lub świateł o jasności większej niż 1,0f.

  2. Aby wyświetlić tę teksturę, zakres widocznych kolorów należy przekonwertować na coś, co można wyświetlić na ekranie - proces ten nazywa się mapowaniem tonów , a różne efekty równania mapowania tonów można wykorzystać do uzyskania różnych efektów. Jest to konieczne, ponieważ monitory nie mogą wyświetlać pełnej gamy kolorów lub luminescencji, które możemy przechowywać w teksturach zmiennoprzecinkowych (byłoby fajnie, gdyby było to możliwe, ale stanowiłoby również oślepiające ryzyko ...).

  3. Dodano efekty Bloom i inne efekty dodatkowe, aby jeszcze bardziej wyolbrzymić różnicę w luminescencji renderowanych rzeczy. Bloom jest obliczany z bufora zmiennoprzecinkowego i łączony z obrazem odwzorowanym tonalnie.

Mam nadzieję, że to pomaga

CiscoIPPhone
źródło
Wiem, że to (bardzo) stare pytanie, ale czy możesz skierować mnie do dobrego, ale prostego algorytmu mapowania tonów?
JSQuareD
6

Technicznie HDR oznacza po prostu użycie szerszego zakresu możliwych wartości dla twojej grafiki. Zwykle jesteś ograniczony do 256 dyskretnych wartości dla kanałów czerwonego, zielonego i niebieskiego, co oznacza, że ​​jeśli masz 2 elementy, jeden dwa razy jaśniejszy od drugiego, a trzeci, który jest 10.000 razy jaśniejszy niż pierwszy, nie ma sposób, w jaki możesz poprawnie przedstawić wszystkie 3 w tej samej scenie - albo zamiast tego rozjaśniasz jasny obiekt tylko 256x jaśniej niż pierwszy, albo oba tępe obiekty są całkowicie czarne (tracąc kontrast między nimi), a następnie jasny obiekt jest nieskończenie jaśniejszy niż oni oboje.

Można to łatwo naprawić za pomocą wartości zmiennoprzecinkowych dla wartości czerwony / zielony / niebieski - ale teraz masz problem z wyświetlaniem tego na urządzeniu graficznym, które obsługuje tylko stałą liczbę wartości dyskretnych na kanał (np. 256) . Tak więc drugą częścią problemu jest mapowanie wartości zmiennoprzecinkowych z powrotem do ograniczonego zakresu. Trywialnym rozwiązaniem jest skalowanie wszystkich wartości proporcjonalnie do dyskretnego zakresu, ale oznaczałoby to, że 1 bardzo jasny piksel może sprawić, że reszta ekranu będzie czarna, itp. Czasami tego chcesz, a czasem nie - patrz mapowanie tonów w CiscoIPPhone link do przykładów, jak możesz do tego podejść.

Zasadniczo to nie twoje tekstury muszą być przechowywane w nowym formacie - to wtedy, gdy zastosujesz do nich oświetlenie, musisz być w stanie pomieścić większe wartości. Oczywiście, jeśli masz źródła światła upieczone na fakturze - np. gwiaździste tło - możesz chcieć mieć tam format wyższej rozdzielczości. Lub po prostu spraw, aby moduł cieniujący skalował wartości takich materiałów, gdy nadejdzie czas ich renderowania.

Kylotan
źródło
5

Komputery tradycyjnie reprezentowały każdy piksel na ekranie jako tylko 24 bity w pamięci: 8 dla czerwonego, 8 dla zielonego i 8 dla niebieskiego. To prawie tyle bitów, że człowiek nie zauważyłby, gdybyś dodał więcej, a 8-bitowy bajt jest bardzo wygodny dla mikroprocesorów, więc to utknęło.

Chociaż 8 bitów jest prawie wystarczającą precyzją do wyświetlenia obrazu, zdecydowanie nie jest wystarczająca precyzja do obliczenia obrazu. W różnych punktach podczas obliczania obrazu wymagane są co najmniej 32 bity precyzji.

Właśnie dlatego moduły cieniujące piksele obliczają kolory z 32-bitową precyzją, nawet podczas renderowania na 8-bitowy obraz precyzyjny. W przeciwnym razie nie można na przykład podzielić wartości przez 1000, a następnie pomnożyć ją przez 1000, ponieważ podzielenie dowolnej 8-bitowej wartości przez 1000 daje zero.

W grafice 3D w czasie rzeczywistym zaobserwowano tendencję do utrzymywania całej grafiki z dokładnością> 8 bitów do ostatniej możliwej chwili, kiedy to> 8 bitów czerwieni jest próbkowanych w dół do 8 bitów, i tak dalej dla zieleni i niebieskiego.

HDR oznacza czynność renderowania obrazów o dokładności większej niż 8 bitów. We współczesnych grach telewizyjnych precyzja 16-bitowa jest normą i może być „wystarczająca” w grach wideo na nadchodzące lata.

bmcnett
źródło
2

Jednym z aspektów, który moim zdaniem jest kluczowy dla HDR, jest prawidłowe zastosowanie monitorowania gamma.

Monitor, na który patrzysz, wytwarza światło w funkcji pikseli wejściowych. Można się spodziewać, że piksel o wartości 255 wytworzy (około) 255 razy więcej światła niż piksel o wartości 1. Tak nie jest. Przy standardowej gamma monitora wynoszącej 2,3 jest on 255 ^ 2,3 razy jaśniejszy, czyli około 340000!

Każdy, kto produkuje treści (dystrybutorzy kamer), wie o tym lub (jeśli jesteś projektantem), domyślnie to rekompensujesz.

Wszystko jest w porządku, jeśli renderujesz bitmapy (cóż, przez większość czasu), ale jeśli używasz ich jako tekstur w scenie 3D, jest to inna historia. Jeśli chcesz poprawnie modelować interakcję ze światłem, powinieneś zastosować liniowe obliczenia światła w całym strumieniu renderowania. To znaczy

  • korygowanie tekstur pod kątem gamma

  • renderuj wszystko liniowym światłem (tam, gdzie potrzebujesz dużej precyzji ze względu na wysoki zakres dynamiki światła),

  • zastosuj odwrotną transformację gamma monitora jako ostatnią rzecz przed umieszczeniem obrazu na ekranie.

Po wprowadzeniu tej zmiany w istniejącej scenie, przy użyciu istniejącej grafiki, świateł itp., Prawdopodobnie musisz naprawić wiele intensywności światła i tekstur, ponieważ zostały one wybrane tak, aby wyglądały ładnie podczas renderowania za pomocą światła nieliniowego. Nie jest to więc funkcja, którą można po prostu „włączyć” i oczekiwać, że wszystko będzie wyglądać lepiej właśnie w ten sposób.

jdv-Jan de Vaan
źródło
2
Gamma jest zdecydowanie ważna i kluczem do prawidłowego renderowania opartego na fizyce, ale nie ma bezpośredniego związku z HDR, IMO.
Nathan Reed,