2012-07-08 2 views
14

Ich habe ein Rendering-System, wo ich zu einem FBO mit einem Multi-Sampling renderbuffer zeichnen, dann blit es zu einem anderen FBO mit einer Textur, um die Proben zu lösen, um die Textur zu lesen, um Post-Processing-Schattierung beim Zeichnen auf die Backbuffer (FBO Index 0).Wann glEnable (GL_FRAMEBUFFER_SRGB) aufgerufen werden soll?

Jetzt möchte ich etwas korrekte sRGB-Ausgabe bekommen ... Das Problem ist das Verhalten des Programms ist ziemlich inkonsistent zwischen, wenn ich es auf OS X und Windows laufen und dies auch abhängig von der Maschine ändert: Unter Windows mit der Intel HD 3000 wird es nicht die sRGB-Nichtlinearität anwenden, aber auf meiner anderen Maschine mit einer Nvidia GTX 670 tut es. Auf der Intel HD 3000 in OS X wird es es auch anwenden.

Das bedeutet also wahrscheinlich, dass ich meinen Aktivierungsstatus GL_FRAMEBUFFER_SRGB nicht an den richtigen Stellen im Programm setze. Allerdings kann ich keine Tutorials finden, die mir sagen, wann ich es aktivieren sollte, sie erwähnen nur, dass es einfach ist und keine Performance kostet.

Ich lade gerade keine Texturen auf, also hatte ich noch keine Notwendigkeit, mit der Linearisierung ihrer Farben umzugehen.

Um das Programm zu zwingen, nicht einfach die linearen Farbwerte auszuspucken, was ich versucht habe, ist einfach meine glDisable(GL_FRAMEBUFFER_SRGB) Zeile auskommentieren, was bedeutet, dass diese Einstellung für die gesamte Pipeline aktiviert ist, und ich erzwinge sie redundant redundant auf jedem Rahmen.

Ich weiß nicht, ob das korrekt ist oder nicht. Es wird sicherlich eine Nichtlinearisierung auf die Farben angewandt, aber ich kann nicht sagen, ob dies zweimal angewendet wird (was schlecht wäre). Es könnte das Gamma anwenden, wie ich es meinem ersten FBO rendere. Es könnte es tun, wenn ich den ersten FBO zum zweiten FBO blitze. Warum nicht?

Ich habe so weit gegangen, Screenshots von meinem letzten Frame zu nehmen und rohe Pixelfarbwerte zu den Farben vergleichen ich sich in dem Programm festgelegt:

ich die Eingangsfarbe auf RGB eingestellt (1, 2,3) und der Ausgang ist RGB (13,22,28).

Das scheint ziemlich viel Farbkomprimierung am unteren Ende und führt mich zu der Frage, ob das Gamma mehrmals angewendet wird.

Ich bin gerade durch die sRGB-Gleichung gegangen und ich kann überprüfen, dass die Umwandlung scheint nur einmal als linear angewendet werden 1/255, 2/255 und 3/255 in der Tat zu sRGB 13/255, 22 zuordnen/255 und 28/255 unter Verwendung der Gleichung 1.055*C^(1/2.4)+0.055. Angesichts der Tatsache, dass die Erweiterung für diese niedrigen Farbwerte so groß ist, sollte es wirklich offensichtlich sein, wenn die sRGB-Farbtransformation mehr als einmal angewendet wird.

Also habe ich noch nicht bestimmt, was das Richtige zu tun ist. gilt glEnable(GL_FRAMEBUFFER_SRGB) nur für die endgültigen Framebuffer-Werte, in diesem Fall kann ich dies nur während meiner GL-Init-Routine festlegen und danach vergessen?

Antwort

17

Wenn GL_FRAMEBUFFER_SRGB aktiviert ist, wird bei allen Schreibvorgängen in einem Bild mit an sRGB image format davon ausgegangen, dass die Eingabefarben (die Farben, die geschrieben werden) in einem linearen Farbraum liegen. Daher werden sie in den sRGB-Farbraum konvertiert.

schreibt Alle Bilder, die nicht im sRGB-Format sind, sollten nicht beeinträchtigt werden. Wenn Sie also in ein Gleitkommabild schreiben, sollte nichts passieren. Also solltest du es einfach einschalten und es so lassen können; OpenGL wird wissen, wenn Sie zu einem sRGB Framebuffer rendern.

Im Allgemeinen möchten Sie so lange wie möglich in einem linearen Farbraum arbeiten.Nur Ihr finaler Renderer sollte nach der Nachbearbeitung den sRGB-Farbraum enthalten. Daher sollte Ihr Multisample-Framebuffer wahrscheinlich linear bleiben (obwohl Sie ihm eine höhere Auflösung für seine Farben geben sollten, um die Genauigkeit beizubehalten. Verwenden Sie GL_RGB10_A2, GL_R11F_G11F_B10F oder GL_RGBA16F als letzten Ausweg).

Was folgt aus:

Unter Windows mit der Intel HD 3000 wird es die sRGB-Nicht-Linearität nicht anwenden

die fast sicher ist auf Intel bei Schreiben von OpenGL-Treiber zu saugen. Wenn es nicht das Richtige tut, wenn Sie GL_FRAMEBUFFER_SRGB aktivieren, liegt das an Intel, nicht an Ihrem Code.

Natürlich kann es auch sein, dass Intels Treiber Ihnen zu Beginn kein sRGB-Bild zur Verfügung gestellt hat (wenn Sie auf den Standard-Framebuffer rendern).

+1

Nun, hier ist die Sache. Wenn ich 'GL_FRAMEBUFFER_SRGB' bei der Initialisierung aktiviere und nicht für immer danach berühre, macht es sogar auf der Intel HD 3000 in Windows die korrekte Umwandlung. Es scheint lediglich erforderlich zu sein, dass es für mehr des Codepfads aktiviert ist als auf Nvidia. –

+0

Was Sie gesagt haben, macht sehr viel Sinn, dass das sRGB-Format von Puffern bestimmen sollte, ob sRGB-Werte in sie geschrieben werden. Ich werde das testen, um zu sehen, ob dies korrekt implementiert ist, und es wird mir auf jeden Fall erlauben, aus 8 Bits pro Kanal viel mehr zu bekommen. Ich hoffe, dass der Multisamples-Auflösungsschritt das auch richtig macht: Ich hatte zuvor falsche Multisample-Auflösungsresultate gefunden, aber zu diesem Zeitpunkt habe ich möglicherweise im falschen Modus gearbeitet. (Siehe dieses Thema http://www.opengl.org/discussion_boards/showthread.php/165081-Multisample-resolve-is-not-gamma-correct-with-FBOs) –

+0

Behält Intel den OpenGL-Treiber für ihre Prozessoren auf Apple bei Maschinen? Ich hatte den Eindruck, dass Apple alles selbst geschrieben hat (was meiner Erfahrung nach erklären würde, warum ihr AMD-Treiber so fehleranfällig ist.) – Philip