2017-11-03 4 views
2

Ich möchte eine Erklärung über den sRGB-Farbraum und seine 8bit pro Kanal Darstellung in OpenGL. Nach dem Ausgraben des Themas fand ich heraus, dass das Speichern von Bildern in sRGB nur dazu dient, die gegenteilige Gamma- Operation des Monitors zu kompensieren, die aus Kompatibilitätsgründen die alte CTR "imitiert". Die Tatsache, dass das menschliche Auge eine ähnliche nichtlineare Antwort hat, ist nur ein Zufall und hat nichts mit der Gammakorrektur zu tun (wie viele verwirrende Artikel behaupten), da die Ausgabe linear again anyway ist.8bit sRGB und OpenGL Verwirrung

Angenommen, dieses Verständnis ist richtig, in OpenGL haben wir das GL_SRGB8_ALPHA8 Format für Texturen, das 8bit pro Kanal hat. Da der Bereich von 0 ~ 255 jedoch mit einer linearen RGB-Textur identisch ist, bedeutet dies, dass zum Konvertieren einer linearen 8-Bit-Textur pro Kanal die sRGB-Farbwerte unverändert bleiben und ein einfaches "Flag" OpenGL anzeigt: Schauen Sie sich 0 ~ 255 an Bereich ist nicht linear, also interpretieren sie als eine Kurve? Was ist mit sRGB 16bit pro Kanal Bilder (ex. 16bit PNGs)?

Antwort

3

Die Reichweite ist gleich. The values are not.

Ihre linearen Werte vor dem Speichern sind Fließkommawerte. Sie sind daher präziser als ein 8-Bit-pro-Kanal-Format.

Wenn Sie sie in einem linearRGB-Bild speichern, verwenden Sie den Eingabebereich [0, 1] und weisen sie gleichmäßig auf [0, 255] zu.

Aber wenn Sie eine sRGB-Konvertierung durchführen, nehmen Sie den [0, 1] -Bereich und ordnen ihn über ein nichtlineares Gamma-Mapping von etwa 2,2 auf [0, 255] zu. Während dieses nichtlineare Mapping nicht magischerweise mehr Werte erzeugt, gibt es tatsächlich mehr Präzision in den höheren Teilen des Bereichs als die unteren Teile.

Bei der sRGB-Konvertierung werden Werte im Eingangsbereich [0,5, 1] ​​auf [56, 255] abgebildet. Das sind über 75% des Ausgabebereichs, der von 50% des Eingabebereichs abgedeckt wird. Dies gibt Ihnen eine bessere Darstellung der größeren Werte in Ihrer Eingabe.

Ein lineares Mapping verliert die Genauigkeit gleichmäßig. Das sRGB-Mapping verliert in den dunkleren Bereichen mehr Genauigkeit als das Feuerzeug. Oder um es anders auszudrücken, es bewahrt mehr Präzision in den helleren Bereichen als das lineare Mapping.

Für einen Kompromiss zwischen Speicher und visueller Qualität ist sRGB insgesamt besser als linearRGB 8-Bit pro Kanal.

Da jedoch der Bereich von 0 bis 255 ist das gleiche wie eine lineare RGB-Textur, bedeutet dies, dass eine lineare 8bit pro Kanal Textur konvertiert die Farbwerte unverändert bleiben auf sRGB und ein einfachen „Flag“ sagt OpenGL : Schauen Sie sich an, dass dieser Bereich von 0 ~ 255 nicht linear ist, interpretieren Sie sie also als eine Kurve?

Es hängt davon ab, über welche Operation Sie sprechen.

Eine sRGB-Textur ist eine Textur, die ihre RGB-Informationen im sRGB-Farbraum speichert. Es wird jedoch angenommen, dass Shader-Operationen Daten im linearRGB-Farbraum und nicht in sRGB benötigen. Also using an sRGB format means that texture fetches will convert the pixels they read from sRGB to linearRGB.

Schreiben von einem Fragment-Shader in ein FBO-angehängtes Bild unter Verwendung eines sRGB-Formats kann oder kann keine Konvertierung durchführen. Hier muss die Konvertierung explizit mit GL_FRAMEBUFFER_SRGB aktiviert werden. Die Idee ist, dass einige Operationen Werte im sRGB-Farbraum erzeugen (zum Beispiel GUIs. Die meisten Bilder wurden im sRGB-Farbraum erstellt), während andere Werte in linearRGB erzeugen (normales Rendering). Sie haben also die Möglichkeit, die Konvertierung ein- oder auszuschalten.

Die Konvertierung ermöglicht auch das Mischen zu read sRGB destination pixels, convert them to linear, blend with the incoming linearRGB values, and then convert them back to sRGB for writing.

Durch das Hoch- und Herunterladen von Bildern aus einem sRGB-Bild werden die Pixelwerte im sRGB-Farbraum direkt geschrieben und gelesen.

Was ist mit sRGB 16bit pro Kanal Bilder (ex. 16bit PNGs)?

Was ist mit ihnen? OpenGL hat keine 16-Bit-pro-Kanal-sRGB-Formate.

Die sRGB-Konvertierung erfolgt in der Regel über eine Nachschlagetabelle mit 256 Einträgen. Für jeden sRGB-Wert gibt es einen vorberechneten linearen Wert.

So wie in jedem anderen Fall, in dem ein Bildformat etwas bietet, dass OpenGL nicht übereinstimmt, müssen Sie sie manuell konvertieren.

Verwandte Themen