Strona głównaArtykułyFotografia

Mapowanie Tonów HDR: Wciskanie Światła Na Ekran

Reinhard, Filmic ACES, Drago i Durand kompresują ogromny zakres dynamiczny sceny na wyświetlaczu, który go nie potrafi odtworzyć – każdy operator inaczej negocjuje kontrast, kolor i szczegółowość.

mysimulator teamZaktualizowano — czerwiec 2026≈ 7 min czytania▶ Otwórz symulację

Dlaczego zakres 100 000:1 nie mieści się na ekranie

Rzeczywiste oświetlenie może obejmować ogromny zakres jasności: bezpośrednie światło słoneczne, zacieniony fragment drzwi i płomień świecy w tym samym kadrze mogą różnić się o pięć lub sześć rzędów wielkości. Czujnik kamery HDR lub fizycznie oparty renderer rejestruje ten zakres jako liniową jasność zmiennoprzecinkową, bez górnej granicy. Standardowy panel HDR natomiast odtwarza kontrast zbliżony do 100:1 lub 1000:1, a nawet najlepsze panele konsumenckie nie przekraczają tego poziomu, który rzeczywiście zawiera jasne oświetlenie na zewnątrz. Tonemapping to mapowanie z jednego zakresu na drugi. Proste przycinanie wszystkich wartości powyżej 1.0 do białego powoduje utratę detali wysokiego światła; a liniowe skalowanie w dół o stałym współczynniku niszczy cienie, redukując je do niemal czerni. Żaden z tych rozwiązań nie jest akceptowalny, dlatego tonemapping wymaga krzywej, a nie skalaru.

demo na żywo · powiązana symulacja● LIVE

Operatory globalne: Reinhard

Operator Erik Reinhardt'a z 2002 roku "reprodukcje tonalne fotografii", zainspirowany systemem stref Ansela Adamsa, jest najprostszym krzywym, które zachowuje się dobrze: dzielimy luminancję przez jeden plus samą siebie. Wartości bliskie zeru przechodzą niemal niezmienione, a wartości rosnące w kierunku nieskończoności łagodnie zbliżają się do jednego zamiast obcinać. Rozszerzona wersja dodaje punkt biały Lwhite, dzięki czemu najjaśniejsze prawdziwe reflektory w scenie mogą nadal osiągnąć biel wyświetlacza zamiast ustępować szaremu odcieniu:

prosty Reinhard: Ld = L / (1 + L) rozszerzona (z punktem białym): Ld = L * (1 + L / Lwhite^2) / (1 + L) Operator globalny stosuje dokładnie tę samą krzywą do każdego piksela niezależnie od jego sąsiadów. Dzięki temu jest tani, stabilny w czasie przez klatki wideo i wolny od artefaktów halo, które dotykają metody lokalne — ale nie może zachować silnego lokalnego kontrastu zarówno w jasnym oknie, jak i w ciemnym wnętrzu w tej samej scenie, ponieważ obie strefy są zmuszane przez tę samą funkcję.

simple Reinhard:       Ld = L / (1 + L)
extended (with white):  Ld = L * (1 + L / Lwhite^2) / (1 + L)

Filmowy ACES: czerpanie inspiracji z rolki filmowej

System Koloryzacji Akademickiej (ACES) wykorzystuje krzywą kinofilmową, która oddaje sposób, w jaki światło reaguje z materiałem filmowym: łuk S o miękkim, stopniowym odcięciu highlightów zamiast twardego cięcia, co zapobiega wyblenckowaniu nasyconych kolorów i utrzymuje jasne obszary w charakterze prześwietlonych ujęć filmowych, zamiast płaskiego efektu cyfrowego. Ponieważ krzywa ta została dostosowana do oczekiwań scenografistów, wymaga minimalnej korekty na poszczególne kadry, co przyczyniło się do tego, że stała się domyślnym tonem mapowaniem w większości nowoczesnych silników gier i rendererów. Popularny, zwięzły model opracowany przez Krzysztofa Narkowicza przybliża pełną sekwencję ACES jednym wyrażeniem:

ACES fitted (Narkowicz, 2016), x = linear colour
a = 2.51, b = 0.03, c = 2.43, d = 0.59, e = 0.14
Ld = clamp( (x * (a*x + b)) / (x * (c*x + d) + e), 0, 1 )

Lokalne operatory: bilateralny podział Drago i Durand

Adaptacyjny logarytmiczny operator Frederica Drago z 2003 roku zmienia podstawę krzywej kompresji logorytmicznej z parametrem odchyłu, co daje lepszą kontrolę nad tym, w jakim stopniu końce wysokie i niskie zakresu są ściskane niż samo użycie logarytmu. Fredo Durand i Julie Dorsey poszli o krok dalej w 2002 roku, uczyniąc operator naprawdę lokalnym: podzielili obraz luminance-log z gładką warstwą bazową, zbudowaną przy użyciu bilateralnego filtru o zachowaniu krawędzi, oraz warstwę detali, która była tym, co usunął bilateralny filtr. Ścisnąć agresywnie tylko warstwę bazową – to tam znajduje się ogromny zakres dynamiczny, a warstwę detali pozostawić bez zmian, a następnie połączyć je ponownie.

baz = bilateralFilter( log(L) ) // zachowujący krawędzie, na dużą skalę detail = log(L) - baz // drobne tekstury, mała skala Ld = exp( compress(baz) + detail ) // ściskanie tylko gładkiej części Ponieważ bilateralny filtr szanuje silne krawędzie, tekstura i mikroprzeciwy przetrwają nawet po skompresowaniu całego zakresu stoomafoldrotnie – ale jeśli promień lub próg krawędzi bilateralnego filtra nie pasują do obrazu, luminance może przeciekć przez silną krawędź i pojawić się jako widoczny pierścień halo po połączeniu warstw.

base   = bilateralFilter( log(L) )      // edge-preserving, large-scale
detail = log(L) - base                  // fine texture, small-scale
Ld     = exp( compress(base) + detail ) // squeeze only the smooth part

Wybór operatora

Renderowanie w czasie rzeczywistym i gry preferują filmowe lub ACES, ponieważ są to stabilne klatki z czasem, które nie wymagają dostrajania na poziomie pojedynczych ujęć, natomiast naiwny lokalny operator może migotać podczas przesuwania się kamery i zmiany podstawowej warstwy "smooth". Prace fotograficzne opierają się na lokalnych operatorach lub na fuzji wieloekspozycyjnej, aby uzyskać wyrazisty, szczegółowy wygląd HDR. Często wizualizacje w kolorze i fałszywe obrażenia chcą prostego, dokładnego globalnego mapowania, ponieważ kontrast lokalny może wprowadzić obserwatora w błąd co do podstawowych danych. Jedną z cech wszystkich operatorów jest to, że naiwne dostrajanie na poziomie kanałów w RGB powoduje odcienie desaturacji jasnych kolorów, dlatego większość implementacji dostosowuje luminancję i przywraca oryginalne barwy i nasycenie lub operuje w przestrzeni barw perceptualnie jednolitej, aby kolory wyglądały naturalnie przez cały proces kompresji.

Frequently asked questions

Jakie jest różnica między HDR capture a tonemappingiem?

HDR capture lub rendering generuje wartości promieniowania w zmiennym skali (floating-point radiance values) które mogą przekraczać możliwości wyświetlenia przez dowolny ekran, często rozciągając się na zakres od 10 000 do 1 lub więcej. Tonemapping to oddzielny etap końcowy, który kompresuje te liniowe wartości do zakresu około 0 do 1, który może faktycznie odtworzyć ekran.

Dlaczego lokalne operatorzy tonemappingowe czasami powodują powstawanie halo?

Operatorzy lokalni dzielą obraz na gładką warstwę bazową i warstwę szczegółów, kompresując tylko warstwę bazową. Jeśli filtr zachowawczy krawędzi używany do zbudowania tej warstwy bazowej powoduje wyciek luminancji przez silną krawędź, po zrekomponowaniu obrazu widać widoczny jasny lub ciemny pierścień następujący za krawędzią – klasyczny halo tonemappingowy.

Dlaczego ACES wygląda bardziej naturalnie niż prosty Reinhard?

ACES filmic tonemapping przybliża miękki, S-kształtny charakterystyka wygaszania highlightów w filmach photochemicalnych, więc jasne, nasycone obszary delikatnie bledną w kierunku bieli zamiast obcinać lub spłaszczać do szarości. Prosty Reinhard kompresuje każdy poziom luminancji tą samą krzywą i może powodować desaturację oraz spłaszczenie highlightów w porównaniu.

Wypróbuj na żywo

Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz HDR Tonemapping Operators i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.

▶ Otwórz symulację HDR Tonemapping Operators

Co znalazłeś?

Dodaj kroki odtworzenia (opcjonalnie)