Warum sollte lineares RGB in der Shader-Mathematik die Bandbreite von sRGB beibehalten?


13

sRGB wird häufig mit "linearem RGB" kontrastiert.

  • Die Bilder werden auf der Festplatte gespeichert und in sRGB an die Displays weitergeleitet , was in der Intensität ungefähr gleich ist.
  • Die Shader-Berechnung erfolgt in linearem RGB, dessen Intensität physikalisch einheitlich ist.
  • Gammakorrektur kann angewendet werden, um zwischen den beiden zu konvertieren.

Jetzt hat sRGB einen Standard, der die Farbskala farbmetrisch festlegt und genau angibt, wo reine Rot-, Grün-, Blau- und Weißtöne liegen. Es gibt jedoch keinen entsprechenden Standard für "lineares RGB". Man könnte sagen, dass jedes Dreieck in einem Farbdiagramm linear ist, und tatsächlich gibt es mehrere bekannte Farbskalen zur Auswahl:

RGB-Farbbereiche

Wenn wir in der Praxis "lineares RGB" sagen, meinen wir "sRGB ohne Gammakorrektur". (Dies ist implizit das, was wir tun, wenn wir die sRGB-Gammakorrektur als letzten Nachbearbeitungsschritt anwenden, aber die Farbräume für den Rest der Rendering-Pipeline ignorieren.)

Aber warum ist dieser RGB-Farbraum der richtige für Interpolations- und Beleuchtungsberechnungen? Es scheint willkürlich. Wenn überhaupt, möchten wir dann nicht den größtmöglichen Farbumfang für interne Berechnungen verwenden und die Farben ganz am Ende auf den Farbumfang des Ausgabegeräts skalieren oder zuschneiden?

Ist es so, dass die RGB-Beleuchtung ungefähr ist, egal für welchen Farbumfang wir uns entscheiden, und wir können auch den auswählen, der dem am nächsten kommt, was das Display nativ unterstützt? Ist es nur Fahrlässigkeit? Oder liefern Berechnungen in diesen verschiedenen Bereichen tatsächlich genau die gleichen Ergebnisse?

Antworten:


13

Das Sprechen über lineares RGB muss vermieden werden, da es Ihnen nichts über die RGB-Farbraum-Eigenschaften, dh Primär-, Weißpunkt- und Farbkomponententransferfunktionen, verrät. Vor ein paar Jahren war sRGB noch mittelmäßig, aber heute, da DCI-P3 und BT.2020 weit verbreitet sind, muss dies ausgeschlossen werden.

Der ideale Farbumfang für das Rendern ist derjenige, der Fehler in Bezug auf eine Referenz in der realen Welt oder günstiger ein Grundwahrheitsspektral-Rendering minimiert. Die erste Erkenntnis aus diesem Satz ist, dass die verschiedenen RGB-Farbräume nicht gleichwertig sind und keine ähnlichen Ergebnisse liefern.

Man könnte meinen, dass zwei Renderer mit den gleichen Grundfarben ausgeführt werden, bei denen sie jedoch mit sRGB / BT.709 codiert sind, und bei denen sie mit DCI-P3 codiert sind. Anschließend werden die beiden resultierenden Bilder in beispielsweise ACES2065-1 konvertiert die gleichen Bilder liefern, aber es ist nicht der Fall. Einige mathematische Operationen aufgrund der Natur der linearen Algebra und Matrizen hängen von den gegebenen RGB-Farbraumprimären ab, dh von der Farbraumbasis. Dieselben Operationen, die in unterschiedlichen RGB-Farbräumen ausgeführt werden, ergeben unterschiedliche Farbwerte, sobald sie zurück in den CIE XYZ-Farbraum konvertiert wurden. Beispielsweise sind Multiplikations-, Divisions- und Potenzoperationen von RGB-Farbraumprimären abhängig, während dies bei Addition und Subtraktion nicht der Fall ist.

RGB-Farbräume und Potenzierung

Dieses Bild zeigt den Effekt der Multiplikation verschiedener Farben in verschiedene RGB-Farbräume: Die resultierenden Farben sind unterschiedlich. Die verschiedenen Stichproben werden wie folgt generiert: 3 zufällige sRGB-Farbraumwerte werden ausgewählt und in die drei untersuchten RGB-Farbräume konvertiert, sie werden potenziert, zurück in sRGB-Farbraum konvertiert, im CIE 1931 Chromaticity Diagram auf der linken Seite aufgezeichnet und als Farbfelder auf der linken Seite angezeigt richtig.

Tests und Untersuchungen von Ward und Eydelberg-Vileshin (2002) , Langlands und Mansencal (2014) und Mansencal (2014) zeigten, dass Farbskalen mit Primären, die dem Spektralort am nächsten liegen, dh spektral scharfen Primären, dazu neigen, die Fehler im Vergleich zum Spektralgrund zu minimieren Wahrheit macht.

Hier ist ein Bild, das ich kürzlich mit Mitsuba gerendert habe, um unsere Ergebnisse mit Anders zu überprüfen:

Farbräume rendern

Dies sind Darstellungen derselben Szene unter Verwendung von BT.709-Vorwahlen (erste Reihe), 47 Spektralfächern (zweite Reihe), BT.2020-Vorwahlen (dritte Reihe), Spektral minus BT.709-Vorwahlen ergeben Residuen (vierte Reihe), Spektral minus BT .2020 primaries gibt Residuen aus (fünfte Reihe). Die letzte Reihe zeigt zusammengesetzte Bilder, die mit drei vertikalen Streifen der Grundfarben BT.709, Spectral und BT.2020 zusammengesetzt sind. Direkte Beleuchtung neigt dazu, zwischen den Renderings zu passen. Bereiche, die die Wirkung von mehrfachen Lichtreflexionen zeigen, dh die Decke, neigen bei den Grundrendern BT.709 und BT.2020 zu einer erhöhten Sättigung, insbesondere bei den Grundrendern BT.709, oder zu einem leichten Energieverlust, insbesondere bei den Grundrendern BT .2020 rendern. Ohne Ausreißer, z. B. die sichtbare Lichtquelle, beträgt der RMSE mit dem spektralen Rendering 0,0083und 0,0116 für die Primärrender BT.2020 bzw. BT.709.

Jetzt heißt das nicht, dass sie immer eine bessere Leistung erbringen werden, und es könnte möglich sein, Beispiele zu erstellen, die eine Tendenz zu BT.709 / sRGB aufweisen. Die wichtigste Erkenntnis ist, dass RGB-Renderings nicht mit Spektralrenderings übereinstimmen können und dass scharfe, breite Farbskalen tendenziell eine bessere Leistung erzielen. Für die Auswahl eines Rendering-Farbraums würde ich einen mit einem breiten Farbumfang wählen, der den Gamut von Pointer umfasst, und DCI-P3, BT.2020 oder ACEScg sind ausgezeichnete Kandidaten dafür.


5

Wenn wir in der Praxis "lineares RGB" sagen, meinen wir "sRGB ohne Gammakorrektur".

Richtiger wäre zu sagen, dass es den "sRGB-Farbraum" und den "linearisierten sRGB-Farbraum" gibt, wobei die Definition der sRGB-Spezifikation die Konvertierung von einem zum anderen ist.

Ja, es gibt unendlich viele "lineare RGB" -Farbräume. Allen diesen "linearen RGB" -Farbräumen ist jedoch gemeinsam, dass sie linear sind . Wenn Sie also den Wert einer Komponente verdoppeln, verdoppeln Sie die Intensität des Lichts, das die Komponente darstellt. Genau das bedeutet es, "linear" zu sein: Es gibt eine lineare Zuordnung zwischen Farbwerten und der resultierenden Intensität dieser hellen Farbe.

Dies ist wichtig, da Beleuchtungsgleichungen nicht funktionieren, wenn die Farbwerte nicht linear auf Lichtintensitäten abgebildet werden. Den Gleichungen ist es jedoch egal, welchen linearen Farbraum Sie verwenden. Sie müssen nur eine auswählen.

Der linearisierte sRGB-Farbraum ist also nicht korrekter als ein linearisierter Adobe RGB-Farbraum oder ein linearisierter SWOP CMYK-Farbraum. Was zählt, sind genau zwei Dinge:

  1. Der Farbraum repräsentiert eine lineare Abbildung von Werten auf Lichtintensitäten.
  2. Der gewählte Farbraum wird in der Beleuchtungsgleichung konsistent verwendet. Das heißt, alle in der Beleuchtungsgleichung verwendeten Farben stammen aus demselben (linearen) Farbraum.

Ist es so, dass die RGB-Beleuchtung ungefähr ist, egal für welchen Farbumfang wir uns entscheiden, und wir können auch den auswählen, der dem am nächsten kommt, was das Display nativ unterstützt?

Dies und die Tatsache, dass die sRGB-Konvertierung heutzutage in Hardware integriert ist, während dies bei anderen Farbraumkonvertierungen häufig nicht der Fall ist. Wenn Sie also den linearisierten Adobe RGB-Farbraum verwenden möchten, müssen Sie in Ihren Shadern viel Arbeit leisten, um die Texelwerte zu linearisieren und eine bilineare / trilineare Interpolation für sie durchzuführen (die nach der Linearisierung durchgeführt werden muss), bevor Sie sie überhaupt anwenden können sie auf die Beleuchtungsgleichung. Anschließend müssen Sie die Konvertierung von linearisiertem Adobe RGB in linearisiertes sRGB durchführen, damit Sie zur Anzeige in ein sRGB-Framebuffer-Bild schreiben können.

Oder Sie können einfach überall linearisiertes sRGB verwenden und Leistung erzielen. Letzteres gewinnt tendenziell.


Was haltet ihr von diesem Artikel? Wenn ich es richtig gerade lese, zeigt es , dass Berechnungen in unterschiedlichen linearen Farbraum zu tun führen zu unterschiedlichen Ergebnissen.
Maxpm

@ Maxpm: Das ist interessant. Ich habe gelesen, dass das Problem darin besteht, dass Licht nicht in unser RGB-Farbraummodell passt. Dies führt zu unterschiedlichen visuellen Ergebnissen, was mathematisch dasselbe sein sollte. Dort scheint die einzige Lösung darin zu bestehen, die Verwendung von RGB zu beenden und die Spektralwiedergabe zu verwenden.
Nicol Bolas

@Maxpm aber natürlich machen sie das, nachdem alle anderen Räume unterschiedlich sind. Aber dann ist RGB nicht Farbe, also gibt es das auch. Aber dann ist da die Frage, wie richtig du sein willst. Die Gewinne werden immer kleiner,
Joojaa

0

Es gibt zwei Gründe, warum sRGB besonders wichtig ist. Es wird behauptet, dass für Nicht-HDR-Eingabebilder davon ausgegangen werden sollte, dass diese auf sRGB komprimiert sind (ob diese Behauptung korrekt ist, ist eine andere Geschichte). Daher müssen Sie sie aus sRGB dekomprimieren, bevor Sie lineare Rechenoperationen ausführen können. Es ist auch möglich, dass ein Bild aufgenommen und in eine andere Darstellung komprimiert wurde, die nicht sRGB ist. In diesem Fall müssen Sie diese bestimmte Darstellung dekomprimieren. In jedem Fall impliziert die Codierung einen bestimmten Farbumfang, aus dem das Eingabebild niemals hervorgeht (da in sRGB gespeicherte Bilder normalerweise auf 8 Bit pro Kanal gekürzt werden), aber Ihre Shader-Mathematik muss nach der Eingabe nicht in diesem Farbumfang verbleiben Bild wird dekomprimiert. Aber am Ende muss man die Anzeige berücksichtigen.

Wenn Sie ein Bild haben und es angezeigt werden soll, codieren Sie es in einer Darstellung, die das Anzeigegerät benötigt. CRTs entschieden sich für sRGB und LCDs emulierten dies. Daher war die sRGB-Komprimierung für die Monitoranzeige in den letzten Jahrzehnten die übliche Wahl, und die Ausgabe beschränkte sich darauf, innerhalb des sRGB-Bereichs zu bleiben. Andernfalls kommt es zu Übersteuerungen. Breitbild-Displays müssen sich nicht genau an diese Skala halten.

(Ich denke, die Grundlage für die Behauptung, dass von Menschen erstellte Bilder sRGB-codiert sind, liegt darin, dass angenommen wurde, dass diese Bilder auf sRGB-Displays erstellt wurden.)

Jetzt können Sie wahrscheinlich besser erkennen, warum insbesondere sRGB in der Hardware für mathematische Shader-Eingaben und die Bildanzeige unterstützt wurde. Es ist der übliche Fall. Darüber hinaus hat es gute Vorzüge, wahrnehmbare Farbstreifen-Artefakte zu reduzieren. Daher ist es eine gute Möglichkeit, Farben in 8 Bit zu komprimieren und sie für den Menschen plausibel zu halten.


0

Wenn Sie Werte außerhalb des Bereichs 0..1 zulassen, können Sie auch mit den relativ begrenzten sRGB-Vorwahlen den gesamten menschlichen visuellen Bereich ansprechen. Für das Speichern von Fließkomma-Lichtfarbwerten sollte es also keine Rolle spielen, welche Primärfarben Sie verwenden. Allerdings wird das Ausführen von multiplikativen Berechnungen etwas unkonventionell, da die willkürlichen Koordinaten der Primärdaten als Dreh- und Angelpunkt für die Skalierung fungieren. sRGB-Primärdaten werden in der Regel verwendet, da Ihre Eingabedaten traditionell sRGB-codiert sind und die Ausgangsanzeige sRGB oder rec709 ist. Mit rec2020 hat sich die Hälfte davon geändert, aber die meisten Ihrer Eingabedaten sind wahrscheinlich immer noch sRGB-codiert Die gleichen Vorwahlen wie Ihr Speicher sind nur die einfachste Option.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.