Thursday, November 15, 2007

Für eine bessere virtuelle Welt!

Oder: Ein wort über gamma, für 3d nerds, und solche, die es werden wollen. Und für alle anderen.


Also, die geschichte mit dem gamma ist im prinzip äußerst logisch. Generell muß man erst mal festhalten, daß alles, was du dir so tagtäglich ansiehst, also sämtliche jpgs, gifs, bilder usw., alle schon sRGB 'codiert' sind. Der standard, bzw. das farbprofil sRGB beinhaltet eine korrektur, die ungefähr einem gamma 2.2 wert entspricht (nicht ganz, aber nahezu). Das alles ist nicht weiter von belang - solang sich eben alles nur in diesem farbraum abspielt, was im alltag so gut wie immer der fall sein sollte. Schließlich sind alle photos etc. üblicherweise in eben diesem farbraum angelegt. Und sollte mal eines aus der reihe tanzen und beispielsweise adobeRGB statt sRGB benutzen (was eher selten der fall sein dürfte), kriegt man das oftmals gar nicht mit, weil die software die transformation von einem farbraum in den anderen quasi stillschweigend vornimmt.

Wann aber treten dabei die probleme auf? Eigentlich nie - außer, und das ist der knackpunkt, wenn man bilder verwendet (in unserem fall in form von texturen), für eine sache (nämlich unser rendering), die später in den sRGB farbraum konvertiert werden sollen. Da eben üblicherweise alle bilder, bzw. texturen schon in dem sRGB farbraum vorliegen, würde man diese bilder quasi von sRGB nach sRGB konvertieren.

Dabei würde sich dann logischerweise alles verdoppeln, was im sRGB quasi steckt (zwei mal sRGB ist prinzipiell die selbe rechnung wie zwei mal zwei gleich vier! Auch wenn letztendlich was anderes dahintersteckt, nämlich ein exponent). Da wir jedoch wollen, daß die texturen hinterher genauso aussehen, wie wir sie von vorher kennen, muß man einen zusätzlichen schritt vollziehen. Wie bereits erwähnt, beinhaltet sRGB eine gamma 2.2 korrektur - was nichts anderes heißt, als daß alle pixel im bild (folglich einem 'globalen' tonemapper gleich), mit dem reziprok der gamma 2.2 funktion belegt werden. Auf gut deutsch: alle pixel werte wurden zum exponenten 1/2.2 (gleich 0.455) genommen. Hatte also ein pixel den tatsächlichen RGB wert von 0.5, 0.6, 0.7 gehabt, würde er jetzt den wert 0.5^0.455, 0.6^0.455, 0.7^0.455 oder eben 0.73, 0.793, 0.85 annehmen.

Das mit dem reziprok mag erst mal verwirrend klingen, aber generell muß man sagen, daß sich die erfinder der gamma korrektur da selber ein ei gelegt haben. Wenn man also sagt daß man eine gamma 2.2 korrektur durchführt, meint man eben eigentlich, daß man eine gamma 2.2 situation kompensiert. Das kommt aus zeiten der röhrenmonitore, zu der, aus elektrotechnischen bzw. physikalischen gründen, eben tatsächlich ein gamma wert von 2.2 durch eine umkehrung (das reziprok, also 1 geteilt durch 2.2) kompensiert, bzw. linearisiert werden mußte. Linearisiert deswegen, weil diese gamma 2.2 funktion eben eine kurve darstellt - wendet man das genau umgekehrte an, wird daraus wieder ein lineare gerade:


(die graue winkelhalbierende ist diese gewünschte gerade, unten bei 'CRT gamma' ist die gamma 2.2 situation, oben die 'gegenfunktion', das reziprok)

Das ganze ist also geboren aus einem mißstand, verursacht durch den physikalisch bedingten elektrischen spannungsabfall der damaligen röhrenmonitore. Da sich die geschichte aber (aus gutem grund! Später mehr dazu) eben durchgesetzt hatte, sind heute alle, oder so gut wie alle bilder in eben diesem gamma 2.2 bzw. sRGB farbraum zuhause - ohne daß die welt davon bescheid weiß..!

Was aber, wenn man ein bild quasi 'from scratch' völlig neu generiert, wie es im cgi eben der fall ist? Die ganze cgi/render geschichte hat nämlich einen riesigen und weithin völlig unbekannten nachteil: sie passiert im mathematisch völlig linearen farbraum!

Was aber bedeutet das? Wird ein frisch gerendertes bild ohne vorbereitung auf dem monitor angesehen, befindet es sich quasi auf der unteren kurve des obigen bildes (da wo 'CRT gamma' steht)! Weshalb? Weil unsere monitore (in aller regel) so funktionieren! Damals die röhrenmonitore, und heute aus bequemlichkeit ebenso unsere LCDs! Es wurde in unserem fall also nicht dafür sorge getragen, daß der gamma 2.2 'mißstand' kompensiert wurde, durch eine entsprechende 'gegenfunktion', wie es üblicherweise der fall ist. 'Mathematisch linear' bedeutet in der regel also: 'mit einem gamma 2.2 wert belegt', aus traditionellen gründen, wenn man so will.

Die lösung ist jetzt denkbar einfach: man wendet einfach das reziprok, bzw. die 'gegengammafunktion' auf das mathematisch lineare, gerenderte bild an, um eben wieder in den visuell linearen, korrekten farbraum zu kommen. Du merkst, 'mathematisch linear' ist ein riesenunterschied zu 'visuell linear' (die graue gerade auf dem bild oben).

Visuell linear, bzw. wahrnehmungs- oder 'perceptual'-linear hat jedoch eine weitreichendere bedeutung, als es den anschein hat. So erscheint uns ein mathematisch mittleres grau (also RGB 0.5, 0.5, 0.5) eben nicht als subjektiv mittleres grau! Das hat damit zu tun, daß das auge, bzw. die elektrischen impulse, die die rezeptoren darin übertragen, tatsächlich den gleichen gesetzen gehorchen wie die röhrenmonitore! Somit ist der sRGB farbraum eine sehr viel bessere annäherung an die subjektiv wahrgenommene welt, und erscheint uns aus diesem grunde auch sehr viel natürlicher und angenehmer als der mathematisch lineare farbraum. Zwar ist die tatsächliche menschliche wahrnehmung sehr viel komplizierter als diese gamma funktion beschreiben könnte (grob gesagt ähnelt sie auch eher einer logarithmischen als einer exponentiellen funktion), aber die gamma kompensation bzw. der sRGB farbraum sind eben eine gut genuge annäherung an diese subjektiv wahrgenommene non-linearität, und in jedem fall der mathematischen linearität vorzuziehen.

Hast du dich schon immer gefragt, warum 3d meist matschig und seltsam aussieht? DAS ist der grund.

Wenn man jetzt also als cgi-ler dinge rendert, tut man das grundsätzlich technisch bedingt im mathematisch linearen farbraum (wie die wirklichkeit eben auch! Die wirklichkeit, bzw. eben die matrix funktioniert linear; wir sehen sie nur nicht-linear!). Das ist nicht weiter schlimm, man muß nur sorge dafür tragen, später in den richtigen farbraum zurückzukommen. Wenn wir jetzt aber bilder und texturen, oder sogar einfach nur normale farben ('color-swatches') verwenden, die bereits in eben diesem korrekten farbraum sind (nämlich sRGB), müssen wir mit diesen zunächst in den linearen farbraum hinein, damit wir wieder (fast) unbeschadet zurück können. Oft passiert sowas hinter der bühne des 3d programms (siehe Maxwell), aber zumeist wird gar keine sorge dafür getragen - außer man tut es selbst! Mental ray bietet dafür die framebuffer gamma 'general-textur-gegengamma-option' an, die man im falle von sRGB dann auf 0.455 stellen sollte. Vorsicht ist jedoch geboten bei bump, displacment und ähnlichen, für 'werte' vorgesehenen texturen, die im urprünglichen zustand bleiben sollten, außer man weiß es besser. Mit diesem 0.455 wert werden jedenfalls zwei dinge bewerkstelligt: erstens wird jeder pixel des gerenderten bildes zum exponenten des wertes, also ^0.455 genommen (das entspricht grob dem gewünschten sRGB), und gleichzeitig jede textur intern mit dem reziprok dieser funktion belegt, also ^2.2, bzw. von ihrem ursprünglichen sRGB farbraum in den mathematisch linearen raum genommen. Da das gleichzeitig passiert (bzw. das eine vor dem rendern, das andere danach), haben wir am ende die selbe textur wie zuvor - das klingt im ersten moment überflüssig, ist aber toll, da wir jetzt das gerenderte bild im korrekten farbraum sRGB haben, und unsere textur so aussieht, wie wir es erwartet haben, und nicht seltsam verwaschen aussehend gedoppel-sRGBt.

Wenn du soweit folgen konntest, was eigentlich nicht weiter schwer sein sollte,
NIMM DIESE INFORMATION UND VERBREITE SIE IN DER WELT!
Dieser aufruf geht ebenso an leute, die echtzeit 3d/cgi machen! Ihr könnt das genauso! Nichts ist schrecklicher, als cgi sehen zu müssen, die nur aus einer unwissenheit heraus schlecht aussieht. Rendere im richtigen farbraum, und werde von deinen freunden und deiner familie bewundert, für tolle und realistische bilder!

Laßt die schmutzigen fesseln der linearität hinter euch, FÜR eine schönere virtuelle realität!

No comments:

Post a Comment