24-Bit-Farbtiefe nicht genug?

30

Mir ist aufgefallen, dass bei sehr weichen Verläufen die 24-Bit-Farbtiefe nicht ausreicht, da Sie die Farbübergänge sehen können. Dies tritt am häufigsten bei dunklen Szenen oder Nachthimmel auf.

Warum ändert niemand die Farbtiefe auf zwei Bytes pro Kanal? Ich weiß, das wäre eine Menge Arbeit und viel Hardware müsste ersetzt werden, aber ich finde es ein bisschen nervig. Ich glaube wirklich nicht, dass die Technologie der Hardware nicht ausgereift genug ist.

Warum macht das also niemand?

Hier ist ein Bild von "The War Z", auf dem du sehen kannst, was ich meine:

Die War Z-Farbübergänge

Liess Jemai
quelle
12
Ihr Bild ist im JPEG-Format, auch das kann zu Artefakten führen. Können Sie ein Beispiel in verlustfreiem Format präsentieren?
Kaiser Orionii
Willst du mich veräppeln? Sie beschweren sich über die Bittiefe, laden aber eine JPEG-Datei hoch?
Tara
1
Genau. Keine Notwendigkeit für ein verlustfreies Format, wenn JPG zeigt, was ich meine. Übrigens: Es ist nicht die Komprimierung, die diesen Effekt verursacht hat. Sparen Sie Ihre Ressourcen Mann ...
Liess Jemai

Antworten:

19

Sie haben es mehr oder weniger selbst gesagt: "Ich weiß, das wäre eine Menge Arbeit und es müsste viel Hardware ausgetauscht werden." Während das Grafik-Hardware-Ende der Dinge eigentlich relativ einfach wäre (wenn teuer - die Verdoppelung der Größe aller Texturen und Bildpuffer ist alles andere als trivial), ist das "Ökosystem" für Bilder mit höherer Farbtiefe einfach nicht vorhanden Dies ist für jeden eine lohnende Ausgabe, da sich kein LCD-Hersteller darauf konzentriert, bis zu 16 Bit pro Pixel zu erhalten (obwohl es bei 10BPP einige Experimente gegeben hat, bei denen ein RGB-Signal bequemerweise immer noch in ein 32-Bit-Signal passt). Bit-Kanal).

Kurz gesagt, es ist einfach zu viel Arbeit für das, was die meisten Leute noch für zu wenig Gewinn halten. Es mag vielleicht "ein bisschen nervig" sein, aber diese Belästigungsstufe ist so gering, dass andere Verbesserungen der Bildqualität Priorität hatten.

Steven Stadnicki
quelle
1
Obwohl einige High-End-27/30-Zoll-Monitore für Bild- / Videoprofis nicht direkt zugänglich sind, sind sie intern mit 14 Bit und extern mit 10 Bit ausgestattet. Mithilfe der zusätzlichen 4 Bit kann eine Nachschlagetabelle gespeichert werden, um die Kalibrierung der Farben auf dem Display zu erleichtern.
Dan Neely
@DanNeely: Jeder "Endbenutzer" kann eine für ein paar tausend US-Dollar haben. Sie benötigen auch eine Grafikkarte auf Pro-Level, wie einen Quadro. In Anbetracht dessen, was manche Leute für ihr Fernseh- und Soundsystem bezahlen, ist das nicht schlecht.
Zan Lynx
@ZanLynx Ich habe den Ausdruck für Profis verwendet und nicht absichtlich nur für Profis. Jeder kann den vollen Stapel kaufen; Aber die Preise sind so hoch und die Vorteile so selten, dass nur sehr wenige Menschen dies tun. Nur 1,17% der Steam-Nutzer haben 2560 Displays. Und der Monitor ist der einzige Teil des benötigten Stacks, den ein Power-User wahrscheinlich zufällig erhält, da einige (alle?) Der 2011er-Modelljahres-Markennamen 2560-Displays von Mainstream-Anbietern 10/14-Bit-Farben enthielten. und die billigeren koreanischen Importe waren eine Zeit lang nicht weit verbreitet. Quadro / etc-Karten bieten Gamern nichts gegen Standard.
Dan Neely
1
Ist es möglich, dass es sich bei dem Streifen tatsächlich um eine Textoptimierung handelt, um den Arbeitsaufwand beim Rendern des Himmels zu verringern? Wenn ich in GIMP einen 24-Bit-Farbverlauf erstelle, sieht das nicht so aus. Unter static.inky.ws/image/4306/gradient.png finden Sie einen 24-Bit-Verlauf.
ldrumm
2
@ldrumm nein, nicht wirklich, du hast wirklich den extremsten Bereich ausgenutzt und das Dithering in Gimp aktiviert. Schau dir dieses Beispiel mit Dithering an (leichte Streifenbildung sichtbar) und hier ohne Dithering . Das Problem ist, dass Sie das Dithering in Texturen nicht einfach nachbearbeiten können und die meisten Texturen nicht mit Verläufen erstellt werden. Wenn sie handgemalt sind und eine große Fläche mit einem Verlauf zwischen 2 ziemlich ähnlichen Farben haben dann wird es ein Band geben
PeterT
44

Ja, Sie sind nicht die erste Person, die das bemerkt . :) Bei den heutigen hohen Kontrastverhältnissen reichen 8 Bit pro Komponente nicht aus, um einen gleichmäßigen Verlauf ohne sichtbare Streifen zu erzielen - es sei denn, Dithering wird verwendet.

Die Verwendung von mehr als 8 Bit pro Kanal auf einem Display wird von den Displayherstellern als " Deep Color " bezeichnet. Aufgrund eines Henne-Ei-Problems ist es nicht sehr verbreitet. Ein Deep Colour-Display ist ohne eine Grafikkarte, die Deep Colour ausgeben kann, und eine Game-Engine, die das Rendern in Deep Colour unterstützt, nutzlos. Ebenso macht eine Game-Engine oder eine Grafikkarte, die tiefe Farben ohne das Display unterstützt, keinen Sinn. Daher besteht für Hardwarehersteller und Spieleentwickler kein großer Anreiz, diese Technologie zu unterstützen, da es an beiden Enden keinen Markt gibt, der die Entwicklungskosten rechtfertigt.


Aufgrund der begrenzten 8-Bit-Genauigkeit gibt es auch andere Möglichkeiten, das Banding zu beheben. Wie bereits erwähnt, können Game-Engines Dithering verwenden , um die Streifenbildung auszublenden.


(Bild einer Katze mit einer 256-Farben-Palette, ohne und mit Dithering. Erstellt vom Wikipedia-Benutzer Wapcaplet , verwendet unter der CC-By-SA 3.0- Lizenz.)

Das Hinzufügen eines leichten Zitters von ± 0,5 / 255 vor dem Ausschreiben des Pixelwerts in den Framebuffer ist äußerst effektiv, um Streifen auf glatten Verläufen zu verbergen, und im Wesentlichen unbemerkt. Wenn Sie sich in einer HDR-Engine befinden, tun Sie dies während der Tonemapping-Phase.


Schließlich kann, wie andere angemerkt haben, die Texturkomprimierung eine größere Quelle bandartiger Artefakte im Bild sein als die 8-Bit-Genauigkeit. Dies ist möglicherweise das, was mit dem Himmel in diesem Bild passiert, obwohl es schwer zu sagen ist - es enthält so viel JPEG-Komprimierung, dass Artefakte aufgrund der DXT-Komprimierung ziemlich überfüllt sind.

Nathan Reed
quelle
+1 - eine ausgezeichnete Antwort, und ich hatte die Wahrscheinlichkeit, dass die Streifenbildung andere Ursachen hatte, völlig übersehen.
Steven Stadnicki
1
+1 für das Bemerken, dass die Datei ein JPEG ist. Ein verlustfreies Beispiel des OP würde ein schlechtes Urteilsvermögen aufgrund von Rauschen in den Daten verhindern.
ldrumm
@ldrumm Auch ein Spiel / Engine, die nicht schrecklich ist ...
Brian Ortiz
Ich habe Bilder hinzugefügt, um den Unterschied hervorzuheben, den Dithering ausmachen kann. Fühlen Sie sich frei, um zurückzukehren, wenn Sie es nicht mögen :)
BlueRaja - Danny Pflughoeft
13

Es ist auch erwähnenswert, dass viele LCD-Panels nicht einmal 8 Bit pro Kanal haben. Die billigeren neigen dazu, weniger Bits zu verwenden und verschiedene Tricks zu verwenden, um sie zu verbergen. Beispielsweise können sie schnell zwischen zwei benachbarten Farben wechseln, um die dazwischen liegende Farbe darzustellen. http://www.anandtech.com/show/1557/3

Unter http://msdn.microsoft.com/en-us/library/windows/desktop/jj635732%28v=vs.85%29.aspx finden Sie einige Details dazu, wie DXGI 10-Bit pro Kanal und hellere Farben als Weiß unterstützt

D3D unterstützt seit Jahren auch mehr als 8-Bit pro Kanal. Es gibt nichts, was einen Entwickler davon abhält, von 16 Bit pro Kanal auf 8 Bit herunterzuzittern, wenn er dies für eine gute Idee hält.

Das hilft natürlich nicht viel, wenn die Quelldaten (Textur usw.) nur 8-Bit sind (oder wahrscheinlicher DXT1, was effektiv 5-6-5 Bit pro Kanal ist). Ich glaube, das ist, was mit dem Himmel in diesem Screenshot los ist (eine 8-bpp-Gauß-Unschärfe macht es für mich viel glatter), aber es ist schwer, sicher zu sein.

Adam
quelle
10

Steven Stadnickis Antwort ist richtig - Spiele verwenden selten Texturen mit höherer Präzision, weil sie zu viel Texturspeicher und folglich zu viel Speicherbandbreite erfordern, wenn die Textur in einem Pixel-Shader abgetastet wird. Es gibt jedoch Lösungen, die keine großen Texturen erfordern. (Ich würde dies als Kommentar posten, aber es ist zu lang.)

Homeworld löst dieses Problem, indem das Himmelsbild als Scheitelpunktgradienten codiert wird . Diese Technik eignet sich hervorragend für große Bilder mit niedriger Frequenz (dh weiche Verläufe) - wie z. B. Himmel -, bei denen die Textur eine große Anzahl von Pixeln im Spiel abdeckt.

Eine andere mögliche Lösung besteht darin, die Histogrammnormalisierung auf Ihr Himmelsbild anzuwenden . Liegen die Texturdaten wie bei einem dunklen Nachthimmel in einem engen Wertebereich, tragen die meisten Bits in jedem Farbkanal keine Nutzdaten. Tun Sie stattdessen Folgendes:

  • Erstellen Sie die Originaltextur in einem 16-Bit-Format, z. B. einem 16-Bit-TIFF.
  • Wenn Sie Ihre Texturen für die Game-Engine vorbereiten, suchen Sie das dunkelste Pixel im Bild und verfolgen Sie dies als Versatz. Angenommen, dieser Pixelwert ist 0,1 in einem möglichen Bereich von 0-1.
  • Suchen Sie als Nächstes das hellste Pixel und subtrahieren Sie das dunkelste Pixel, um den Wertebereich im Bild zu erhalten. Wenn also das hellste Pixel noch ziemlich dunkel ist - sagen wir 0,35 -, beträgt der Bereich nur 0,35 - 0,1 = 0,25. Im Bild sind nur 25% des Wertebereichs vorhanden.
  • Generiere deine DXT / BC-komprimierte In-Game-Textur. Subtrahieren Sie den dunkelsten Wert von jedem Pixel und multiplizieren Sie ihn, um den gesamten Farbbereich zu nutzen. In der Beispielberechnung subtrahieren wir unseren Dunkelwert von 0,1. Da nur 25% des verfügbaren Wertebereichs vorhanden sind, multiplizieren wir jeden Pixelwert mit 4x, um die In-Game-Textur zu erstellen. Stellen Sie sicher, dass Sie dies alles tun, bevor Sie Ihr 16-Bit-Quellbild auf den 8-Bit-Eingang des DXT-Kompressors quantisieren. Das Ausgabebild verwendet nun den gesamten Wertebereich, der vom In-Game-Format unterstützt wird. Wir ordnen alle unsere Bits zu, um die tatsächlich im Bild vorhandenen Werte darzustellen.
  • Speichern Sie den Dunkelwert-Offset (0,1) und den Bereich (0,25) in Metadaten. Übergeben Sie diese als Eingaben an Ihren Pixel-Shader.
  • Probieren Sie im Pixel-Shader-Code Ihre verschobene, erweiterte Textur aus, konvertieren Sie sie in einen Gleitkommawert und führen Sie dann eine Multiplikation / Addition durch, um den ursprünglichen Farbwert wiederherzustellen. Mit anderen Worten, multiplizieren Sie mit 0,25 und addieren Sie 0,1, um den im Quellbild gespeicherten Wert wiederherzustellen.

Stellen Sie sicher , dass der Shader - Code ist Gamma korrekt . Wenn Sie Texturen berechnen (beleuchten und nachbearbeiten), die nicht vom sRGB-Farbraum in den linearen Raum konvertiert wurden, werden Streifenartefakte wie die beschriebenen angezeigt. Die Gammakorrektur wurde entwickelt, um diese Art von Problemen zu lindern, indem dunklen Werten, bei denen Ihre Augen empfindlicher auf Wertänderungen reagieren, mehr Bits zugewiesen werden. Sie können jedoch schnell Fehler beheben, wenn Sie die Gammakorrektur bei der Berechnung nicht berücksichtigen, z. B. Beleuchtung, Belichtung oder Nachbearbeitung von Effekten. Die Gamma-FAQ ist hilfreich.

ThisIsTheDave
quelle
1

24 Bit sind nicht genug, aber es ist weitaus häufiger, dass solche Probleme durch Bildkomprimierungsalgorithmen, Aliasing oder andere digitale Artefakte verursacht werden. Übersehen Sie auch nicht die Rolle der Anzeigetechnologie. Unabhängig von den digitalen Eingängen liefert die Anzeige möglicherweise nicht die richtigen Helligkeitsstufen.

ddyer
quelle