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.
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.
źródło
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.
źródło
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.
źródło