Gamma (Direct3D 9)

Texturinhalte werden häufig im sRGB-Format gespeichert. In der Regel gehen Pixelpipelines davon aus, dass die Farben linear sind, sodass Vermischungsvorgänge im linearen Raum ausgeführt wurden. Da der sRGB-Inhalt jedoch gammakorrigiert ist, führen Vermischungsvorgänge im linearen Raum zu falschen Ergebnissen. Grafikkarten können dieses Problem jetzt beheben, indem sie die Gammakorrektur rückgängig machen, wenn sie sRGB-Inhalte lesen, und Pixeldaten beim Schreiben von Pixeln wieder in das sRGB-Format konvertieren. In diesem Fall werden alle Vorgänge innerhalb der Pixelpipeline im linearen Raum ausgeführt.

Gamma-Korrektur

Direct3D 9 kann:

  • angeben, ob eine Textur Gamma 2,2-korrigiert ist oder nicht (sRGB oder nicht). Der Treiber wird entweder in ein lineares Gamma für Vermischungsvorgänge zur SetTexture-Zeit konvertiert, oder der Sampler konvertiert ihn in lineare Daten zur Nachschlagezeit.
  • Geben Sie an, ob die Pixelpipeline beim Schreiben in das Renderziel zurück zum sRGB-Raum gammakorrigiert werden soll.

Bei allen anderen Farben (klare Farbe, Materialfarbe, Vertexfarbe usw.) wird angenommen, dass sie im linearen Raum sind. Anwendungen können die Farben, die in den Framepuffer geschrieben wurden, mithilfe von Pixelshaderanweisungen gammakorrigieren. Die Linearisierung sollte nur auf die RGB-Kanäle und nicht auf den Alphakanal angewendet werden.

Nicht alle Oberflächenformate können linearisiert werden. Nur die Formate, die CheckDeviceFormat mit „D3DUSAGE_QUERY_SRGBREAD“ übergeben, können linearisiert werden. Der Samplerstatus „D3DSAMP_SRGBTEXTURE“ wird für den Rest ignoriert. Es wird erwartet, dass nur nicht signierte Texturformate diese Konvertierung unterstützen. Nicht signierte Texturformate umfassen nur R-, G-, B- und L-Komponenten. Wenn der Alphakanal vorhanden ist, wird er ignoriert. Wenn gemischte Formate die Linearisierung von sRGB unterstützen, sind nur die nicht signierten Kanäle betroffen. Im Idealfall sollte Hardware die Linearisierung vor dem Filtern durchführen, aber in Direct3D 9 kann Hardware die Linearisierung nach dem Filtern durchführen.

Nicht alle Oberflächenformate können im sRGB-Raum geschrieben werden. Nur die Formate, die das CheckDeviceFormat mit dem Verwendungsflag “D3DUSAGE_QUERY_SRGBWRITE“ übergeben, können linearisiert werden. Der Renderzustand „D3DRS_SRGBWRITEENABLE“ wird für den Rest ignoriert. Es wird erwartet, dass die unsignierten RGB-Formate mit acht Bits pro Kanal diese Fähigkeit verfügbar machen.

Im Idealfall sollte die Hardware die Framepuffermischungsvorgänge im linearen Raum ausführen, aber Hardware kann sie nach dem Pixelshader, aber vor der Framepuffermischung ausführen. Das bedeutet, dass die Framepuffermischungsvorgänge, die im sRGB-Raum stattfinden, falsche Ergebnisse erzeugen. „D3DRS_SRGBWRITEENABLE“ wird beim Löschen des Renderziels beachtet. Für Hardware, die mehrere Renderziele (Direct3D 9) oder Texturen mit mehreren Elementen (Direct3D 9) unterstützt, wird nur das erste Renderziel oder -element geschrieben.

API-Änderungen

// New sampler state (DWORD)
// If this is nonzero, the texture is linearized on lookup.
D3DSAMP_SRGBTEXTURE       // Default FALSE

// New render state (DWORD)
D3DRS_SRGBWRITEENABLE     // Default FALSE

// New usage flags
D3DUSAGE_QUERY_SRGBWRITE
D3DUSAGE_QUERY_SRGBREAD

Fensterswapchains

Es ist für Anwendungen nützlich, die Hintergrundpuffer ihrer Swapchains im linearen Raum beizubehalten, um korrekte Mischvorgänge zu ermöglichen. Da sich der Desktop normalerweise nicht im linearen Raum befindet, ist eine Gammakorrektur erforderlich, bevor der Inhalt des Hintergrundpuffers dargestellt werden kann. Die Anwendung kann sich auf diese Korrektur selbst auswirken, indem sie einen zusätzlichen Puffer angibt und eine eigene Korrekturkopie aus dem linearen Puffer auf den Hintergrundpuffer ausführt. Dies erfordert eine zusätzliche Kopie, die vermieden werden kann, wenn der Treiber eine Gammakorrektur im Rahmen der Präsentationsbitbereichübertragung durchführt.

In Direct3D 9 steht ein neues Flag, D3DPRESENT_LINEAR_CONTENT, für Präsentieren zur Verfügung, mit dem die Präsentation implizit vom linearen Raum in sRGB/Gamma 2.2 konvertiert werden kann. Anwendungen sollten dieses Flag angeben, wenn das Backbufferformat 16-Bit-Gleitkomma ist, um den Fenstermodus abzugleichen, der dem Gammaverhalten im Vollbildmodus vorhanden ist, vorausgesetzt, dass „D3DCAPS3_LINEAR_TO_SRGB_PRESENTATION“ für Gerätefunktionen zurückgegeben wird, die über GetDeviceCaps abgerufen werden.

Framepuffer