sRGB unter iOS OpenGL ES 2.0

8

Nach sehr wenigen verwandten Themen, die ich finden konnte sammle ich den Potenzierungsschritt, um vielleicht richtige Lichtberechnungen zu erhalten muss innerhalb des letzten Fragment-Shaders in einer iOS-App erfolgen.

Ich habe mit dem neuesten und besten Xcode 5 OpenGL-Debugger und der Exponentiation der Fragment-Accounts für eine beträchtliche Menge an Berechnungen Profiling durchgeführt. Es war die Zeile, die am längsten im gesamten Shader beansprucht wurde (der Rest der Performance wurde durch die verschiedenen norm -Aufrufe, die für Punktlichter benötigt wurden, ausgesaugt).

glEnable(GL_FRAMEBUFFER_SRGB); funktioniert leider nicht, da GL_FRAMEBUFFER_SRGB nicht deklariert ist.

Natürlich könnte die tatsächliche Enum, die ich für GL ES verwenden sollte, anders sein.

Laut Apple :

  

Die folgenden Erweiterungen werden für den SGX 543 und 554 unterstützt   nur Prozessoren:

     

EXT_color_buffer_half_float
  EXT_occlusion_query_boolean
  EXT_pvrtc_sRGB
  EXT_shadow_samplers
  EXT_sRGB
  EXT_texture_rg
  OES_texture_half_float_linear

Nun, das ist nett, das neueste Gerät, das kein 543 oder 554 hat, ist das iPhone 4.

Von der Textdatei der Erweiterung sieht es so aus, als könnte ich SRGB8_ALPHA8_EXT einstellen Der internalformat -Parameter von RenderbufferStorage , aber nichts wird darüber gesagt, wie man den normalen finalen Framebuffer bekommt, um sRGB für uns kostenlos zu verwenden.

Nun scheint die sRGB-Korrektur der fehlende Schritt, um die richtigen Farben zu erhalten. Was ich in meiner App gemacht habe, um mit den schrecklichen "unterbelichteten" Farben umzugehen, ist die manuelle Anwendung einer Gammakorrektur wie diese im Fragment-Shader:

%Vor%

Jetzt erkenne ich, dass die typische Render-Pipeline ein oder mehrere Renderings zu einer Textur gefolgt von einer FS-Quad-Draw beinhaltet, was mir die Möglichkeit gibt, einen SRGB8_ALPHA_EXT render-Puffer zu nutzen, aber was soll ich tun ein? Bin ich SOL?

Wenn das der Fall ist, saugt der Aufruf von pow so viel Zeit auf, dass es fast so aussieht, als könnte ich etwas mehr Leistung herausholen, indem ich eine 1D-Textur erstelle und als Gamma-Lookup-Tabelle verwende. Diese Textur könnte dann verwendet werden, um die Intensitäten der Ausgabefarbe auf individuelle Weise zu optimieren (und eine viel bessere Annäherung an sRGB im Vergleich zur reinen Potenzierung zu erhalten). Aber es scheint einfach alles falsch zu sein, denn angeblich ist sRGB kostenlos.

Etwas alarmierend ist auch, dass nirgends in der GL ES 2.0 Spezifikation die Zeichenfolge srgb erwähnt wird. Laut den Machern von glm ignoriert GL ES sRGB vollständig.

Ich weiß, dass ich meinen Code verwendet habe, um Texturen zu rendern (ich habe einen einfachen OpenGL-Bildbetrachter erstellt, der PVRTC-Texturen rendert) und sie wurden nicht "abgeblendet". Ich denke, was passiert, ist, dass aufgrund der fehlenden sRGB-Wahrnehmung von GL ES 2 die Texturen als linearer Raum geladen und auf dieselbe Weise zurückgeschrieben werden. Da in diesem Fall keine Beleuchtung angewendet wird (alle Farben wurden mit 1.0 multipliziert), ist den Ergebnissen nichts Schlimmes passiert.

    
Steven Lu 25.12.2013, 06:12
quelle

3 Antworten

8

iOS 7.0 fügt das neue Farbformat kEAGLColorFormatSRGBA8 hinzu, das Sie anstelle von kEAGLColorFormatRGBA8 (dem Standardwert) für den Schlüssel kEAGLDrawablePropertyColorFormat im drawableProperties Wörterbuch eines CAEAGLLayer festlegen können. Wenn Sie GLKit verwenden, um Ihren Hauptrahmenpuffer für Sie zu verwalten, können Sie GLKView zum Erstellen eines sRGB-Renderpuffers verwenden, indem Sie die Eigenschaft drawableColorFormat auf GLKViewDrawableColorFormatSRGBA8888 setzen.

Beachten Sie, dass sich die OpenGL ES-Version von EXT_sRGB so verhält, als wäre GL_FRAMEBUFFER_SRGB immer aktiviert. Wenn Sie ohne sRGB-Konvertierung in / aus dem Ziel-Framebuffer rendern möchten, müssen Sie einen anderen Anhang mit einem nicht-sRGB-internen Format verwenden.

    
Pivot 26.12.2013, 20:17
quelle
7

Ich denke, Sie sind verwirrt zwischen den Erweiterungen EXT_sRGB und ARB_framebuffer_sRGB. Der EXT_sRGB ist die aktuellere Erweiterung und wird von iOS-Geräten unterstützt. Dies unterscheidet sich von ARB_framebuffer_sRGB in einer wichtigen Weise, es ist nicht notwendig glEnable (GL_FRAMEBUFFER_SRGB) auf dem Framebuffer aufzurufen, um die Gammakorrektur zu aktivieren, es ist immer aktiviert. Alles, was Sie tun müssen, ist, den Framebuffer mit einem internen sRGB-Format zu erstellen und lineare Texturen darauf zu rendern.

Dies ist nicht sehr nützlich, da Texturen selten in einem linearen Farbraum sind. Glücklicherweise enthält die Erweiterung auch die Möglichkeit, sRGB-Texturen in einen linearen Raum zu konvertieren. Wenn Sie Ihre Texturen mit einem internen Format von sRGB8_ALPHA8_EXT hochladen, werden sie in einen freien Raum konvertiert, wenn sie in einem Shader gesampelt werden. Auf diese Weise können Sie sRGB-Texturen mit einem besser wahrgenommenen Farbraum verwenden, in lineare Räume mit höherer Genauigkeit mixen und dann das Ergebnis im Render-Puffer ohne shader-Kosten und genaue Gammakorrektur wieder in sRGB umwandeln.

    
Tark 26.12.2013 11:54
quelle
2

Hier sind meine Testergebnisse. Mein einziges iOS7-Gerät ist ein A7-betriebenes iPad5, und um die Füllrate zu testen, musste ich meine Test-App ein wenig anpassen, um das Mischen zu ermöglichen. Das war unter iOS 6.1 ausreichend, um zu verhindern, dass Optimierungen auf opaker Geometrie durch Fragmentverwerfungen ersetzt werden, aber für iOS 7 musste ich auch gl_FragColor.w ! =% Co_de% im Shader schreiben. Kein Problem.

Die Verwendung von 1.0 scheint tatsächlich in Bezug auf die Leistung frei oder nahezu frei zu sein. Ich habe kein richtiges Timedemo-Style-Benchmark-Setup, also teste ich nur "ähnliche" Szenen und entferne die GLKViewDrawableColorFormatSRGBA8888 um 2ms von der Frame-Zeit entfernt (was beispielsweise 43ms bis 41ms, 22 fps bis 24 fps erfordern würde). Dann führte das Setzen des sRGB-Framebuffer-Farbformats nicht zu einer merklichen Erhöhung der Framedauer, wie vom Debugger berichtet, aber dies ist nicht sehr wissenschaftlich und hätte es sicherlich um eine halbe Millisekunde oder so verlangsamt. Ich kann nicht wirklich sagen, ob es völlig frei ist (dh einen Hardware-Pfad voll ausnutzen, um eine abschließende sRGB-Transformation durchzuführen), ohne zuerst mehr Benching-Software zu bauen, aber ich habe das Problem bereits gelöst, so dass härtere Tests warten müssen.

>     
Steven Lu 30.12.2013 06:19
quelle

Tags und Links