PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : sRGB-Texturen jetzt bei NV unter OpenGL


Asmodeus
2005-08-22, 14:08:56
Hab ich einen Thread dazu einfach übersehen, oder ist diese Tatsache doch nicht so von Bedeutung, dass sie hier nicht besprochen wird. :wink:

GL_EXT_texture_sRGB:

Link zur Extension (http://www.nvidia.com/dev_content/nvopenglspecs/GL_EXT_texture_sRGB.txt)


...
Implemented by NVIDIA's Release 80 driver series for GeForce FX
(NV3x), GeForce 6 and 7 Series (NV4x and G7x), and Quadro FX (NV3xGL,
NV4xGL, G7xGL).
...



...
13) Does this extension imply filtered results from sRGB texture
have more than 8 bits of precision?

RESOLVED: Effectively, yes.

8-bit components of sRGB texels are converted to linear RGB values
which requires more than 8 bits to avoid lose of precision.
This implies the filtering involve more than 8 bits of color
precision per component. Moreover, fragment color (whether by
a fragment program, vertex program, or glTexEnv modes) should
operate at precision beyond 8 bits per color component.

The exact precision maintained (and its distribution) is left to
implementations to define but returning at least 12 but more
likely 16 linear bits per component, post-filtering, is a
reasonable expectation for developers.

This extension assumes fragment coloring is performed.

14) What must be specified as far as how do you convert to and from
sRGB and linear RGB color spaces?

RESOLVED: The specification language needs to only supply the
sRGB to linear RGB conversion (see section 3.8.x below).

For completeness, the accepted linear RGB to sRGB conversion
(the inverse of the function specified in section 3.8.x) is as
follows:

Given a linear RGB component, cl, convert it to an sRGB component,
cs, in the range [0,1], with this pseudo-code:

if (isnan(cl)) {
/* Map IEEE-754 Not-a-number to zero. */
cs = 0.0;
} else if (cl > 1.0) {
cs = 1.0;
} else if (cl < 0.0) {
cs = 0.0;
} else if (cl < 0.0031308) {
cs = 12.92 * cl;
} else {
cs = 1.055 * pow(cl, 0.41666) - 0.055;
}

sRGB components are typically stored as unsigned 8-bit
fixed-point values. If cs is computed with the above
pseudo-code, cs can be converted to a [0,255] integer with this
formula:

csi = floor(255.0 * cs + 0.5)
...


Gruss, Carsten.

Simon
2005-08-22, 19:00:45
Doofe Frage: was bringt das in der praktischen Anwendung? Ich hab keine Ahnung, was sRGB genau bedeutet :confused:

Corrail
2005-08-22, 19:01:02
Kurze Frage, aber wofür ist diese Extension deiner Meinung nach so wichtig? Ich wüßt jetzt keinen Fall, wo nicht 16Bit float Texturen besser wären...

Coda
2005-08-22, 19:08:04
16bit braucht halt auch doppelt so viel Speicher und es funktioniert kein DXT damit.

sRGB ist soweit ich weiß eine Art Gamma-Korrektur vor oder nach dem Texturfiltering.

aths
2005-08-23, 17:31:10
Zumindest die neuen NV-Chips können vor dem Filter nicht korrigieren. Dabei wäre das genau dort notwendig, um tatsächlich sRGB-Texturen richtig zu verarbeiten.

aths
2005-08-23, 17:32:51
Doofe Frage: was bringt das in der praktischen Anwendung? Ich hab keine Ahnung, was sRGB genau bedeutet :confused:Bei sRGB werden die kleinen Werte (dunklen Farben) zu Lasten der großen Werte (hellen Farben) feiner abgestuft. sRGB bietet damit mehr Dynamik als RGB.

Kurze Frage, aber wofür ist diese Extension deiner Meinung nach so wichtig? Ich wüßt jetzt keinen Fall, wo nicht 16Bit float Texturen besser wären...16 Bit FP? Damit hast du sofort heftige Bandbreitenprobleme am Hals.

Corrail
2005-08-23, 17:54:54
16 Bit FP? Damit hast du sofort heftige Bandbreitenprobleme am Hals.

Es ist shcon klar, dass 16 Bit FP doppelt so viel Speicher und daher auch Bandbreite frisst, bei Texturkomprimierung sogar noch mehr. Aber ich wüßte keine Anwendung, wo man mit sRGB8 auskommen würde? Normal Maps? nicht wirklich...

Coda
2005-08-23, 18:36:41
FP16-Texturen haben 4 Komponenten also insgesammt 64bit, sRGB hat insgesammt 32bit, also das "ganz normale" Format.

Bei Normalmaps ist natürlich das normale RGB sehr viel sinnvoller, weil man dort eine lineare Abstufung braucht, sRGB ist nur für die Diffusemap gedacht.

aths
2005-08-23, 21:52:35
Es ist shcon klar, dass 16 Bit FP doppelt so viel Speicher und daher auch Bandbreite frisst, bei Texturkomprimierung sogar noch mehr. Aber ich wüßte keine Anwendung, wo man mit sRGB8 auskommen würde? Normal Maps? nicht wirklich...sRGB-Texturen speichern Farben besser, und sind damit z. B. für Foto-Texturen besser geeignet als Texturen im linearen RGB-Format.

Corrail
2005-08-23, 22:22:27
sRGB-Texturen speichern Farben besser, und sind damit z. B. für Foto-Texturen besser geeignet als Texturen im linearen RGB-Format.

In wiefern speichern sie die Farben besser?
Oh, ich seh grad, dass ich was falsches angenommen hab. sRGB steht nicht für signed-RGB, oder? ;)

Coda
2005-08-23, 23:05:09
Nein.

aths
2005-08-23, 23:28:17
In wiefern speichern sie die Farben besser?
Oh, ich seh grad, dass ich was falsches angenommen hab. sRGB steht nicht für signed-RGB, oder? ;)Nein, für standard RGB.

Corrail
2005-08-23, 23:59:04
Nein, für standard RGB.

alles klar, danke

und wo ist dann der Vorteil vom sRGB Format gegenüber RGB?

aths
2005-08-24, 00:22:35
alles klar, danke

und wo ist dann der Vorteil vom sRGB Format gegenüber RGB?Normales 8-Bit-RGB speichert in 1/255-Schritten linear den R-, G- und B-Anteil im Bereich von 0..1. Das heißt, 0,5 enspricht Integer interpretiert 127 bzw. 128 (je nach dem, wie man rundet.)

sRGB löst die kleinen Werte feiner auf. 0,5 entspricht als Integer interpretiert 186. Man hat also 187 Bitmuster für Werte < 0,5 und nur 69 Bitmuster für Werte > 0,5.

Das Auge kann bei dunklen Farben kleinere absolute Helligkeitsunterschiede unterscheiden als bei hellen Farben. Mit sRGB werden die 8 Bit pro Farbkanal also besser ausgenutzt.

sRGB orientiert sich an der Gamma-Kennlinie von 2,2 und löst damit verschiedene konkurrierende Normen (mit etwas anderen Gamma-Kennlinen) ab. Monitore sollten so eingestellt sein, dass sRGB-Inhalte richtig angezeigt werden. Mit dem aktuellen aTuner kann man das z. B. prüfen, da gibts im Gamma-Panel ein kleines Testbild, das für Gamma 2,2 korrekt ist. Die Gamma-Korrektur von 1,0 (also nichts korrigieren und alles so lassen) sollte eben für eine Gamma-Charakteristik von 2,2 sorgen.