Wie viel Präzision (halb, schwebend, doppelt usw.) reicht für eine Farbklasse aus?

8

Während ich etwas darüber las, wie Echtzeitanwendungen unter OpneGL mit Farben umgehen, stellte ich fest, dass einige Beispiele Color als Sammlung von 4 implementierten floats, während andere 4 verwendeten doubles. Ich habe sogar einige Beispiele für die Vertex-Komprimierung im Bereich der Spieleentwicklung gesehen, die das Speichern von Farben als 4 befürworteten short.

All dies hat mich dazu gebracht, mehr darüber zu erfahren: Wie hoch ist die Grenzgenauigkeit, mit der OpenGl (oder Hardware) für Farben umgehen? Noch wichtiger ist jedoch, an welchen Genauigkeitsgrenzen sind Farbunterschiede nicht mehr zu bemerken?

Ich habe den Eindruck, dass ein genaueres Lernen darüber mir helfen würde, besser darüber nachzudenken und zu entscheiden, wie eine Farbklasse für verschiedene Anwendungen und Szenarien implementiert werden soll (z. B. Kompromiss zwischen Speicher, Geschwindigkeit und Farbvielfalt).

Vielen Dank für Ihre Ideen dazu.

AndrewSteer
quelle

Antworten:

6

Farben, die auf Ihrem Display angezeigt oder in Standardbilddateiformaten gespeichert werden, verwenden 8 Bit pro Komponente. Um diese Farben zu speichern, reicht es aus, vier Bytes ( unsigned char) zu verwenden. Diese Farben verwenden normalerweise den sRGB- Farbraum, der eine nichtlineare "Gamma" -Transformation enthält, die die Präzision neu verteilt, um sie wahrnehmungsmäßig gleichmäßiger zu machen, sodass sie tatsächlich ziemlich nahe an der Grenze liegt, wie fein Menschen Farbunterschiede bereits wahrnehmen können. (Der sRGB-Farbumfang ist jedoch nur eine Teilmenge aller Farben, die physisch wahrnehmbar sind. Breitere Farbskalen benötigen mehr Bits.)

Wenn Sie jedoch Farben in Grafiksoftware generieren oder verarbeiten (und nicht nur laden / speichern), gibt es verschiedene Gründe, warum Sie möglicherweise mehr Präzision verwenden möchten.

  • Das Ausführen von Vorgängen für Farben, wie das Anpassen von Helligkeit und Kontrast, Alpha-Überblendung, Gammakorrektur usw., neigt dazu, an Präzision zu verlieren. Möglicherweise möchten Sie Farben intern als 16-Bit oder mehr speichern, um mehr Präzision zu erzielen. Andernfalls kann eine wiederholte Rundung auf 8 Bit nach jeder Operation zu einem fortschreitenden Qualitätsverlust führen.
  • Wenn Sie für die Beleuchtungsmathematik mit linearen Farben (nicht mit den sRGB-Gamma-codierten Farben) arbeiten, ist zusätzliche Präzision erforderlich, um sicherzustellen, dass Sie eine ausreichende Präzision haben, wenn Sie schließlich wieder in sRGB konvertieren.
  • Es kann schneller und bequemer sein, mit Gleitkommafarben anstelle von ganzzahligen Farben zu arbeiten. Dies gilt insbesondere für GPUs, bei denen ganzzahlige mathematische Anweisungen nur einen Bruchteil des Durchsatzes von Float-Anweisungen ausmachen. Aber selbst auf CPUs ist es sicherlich einfacher und wahrscheinlich schneller, Farben in Float umzuwandeln, eine Reihe von Operationen auszuführen und dann wieder in Ganzzahlen umzuwandeln, anstatt zu versuchen, alles mit Ganzzahl-Festkomma-Mathematik zu tun.
  • Wenn Sie überhaupt HDR- Rendering durchführen, benötigen Sie mehr als 8 Bit Genauigkeit, um den größeren Farbumfang und Intensitätsbereich zu bewältigen. Die neuen HDR-Displays, die gerade erst herauskommen, akzeptieren Bilder mit 10 oder 12 Bit pro Komponente.

Die Verwendung doublefür Farben ist ein massiver Overkill, aber die Verwendung floatfür die interne Darstellung von Farben ist aus allen oben genannten Gründen üblich. Bei der Arbeit mit GPUs ist auch half(16-Bit-Float) üblich, da sie dieses Format in Hardware unterstützen.

Nathan Reed
quelle
Hervorragende Antwort, danke! Ich habe den letzten Teil einfach nicht verstanden: Die Verwendung eines halfwürde nicht zu den gleichen Problemen führen, die Sie zuvor erwähnt haben, weil es an Präzision mangelt? Ich denke, das wäre besonders wichtig bei der GPU, aufgrund der vielen Farbberechnungen, die häufig in Shadern durchgeführt werden
AndrewSteer
1
@AndrewSteer A halfist 16 Bit, einschließlich 11 effektiver Bits mit Mantissengenauigkeit. Obwohl es nicht so genau ist wie float, ist es für die meisten Farboperationen immer noch ausreichend. (Vielleicht nicht ganz ausreichend, wenn Sie auf einem HDR-Display mit hohem Farbumfang ausgeben; ich bin mir nicht sicher.)
Nathan Reed