Share via


Konvertieren von Daten für das Farbraummodell

Zum Zusammensetzen auf dem Bildschirm oder zum Ausführen von Gleitkommaoperationen müssen Sie im richtigen Farbraummodell arbeiten. Es wird empfohlen, Gleitkommaoperationen in einem linearen Farbraummodell auszuführen. Wenn Sie dann Ihre Bilder auf dem Bildschirm darstellen möchten, konvertieren Sie die Daten in standard-RGB-Daten (sRGB, Gamma 2,2 korrigiert). Die Darstellung auf dem Bildschirm im sRGB-Farbraummodell ist wichtig für die Farbgenauigkeit. Wenn Bilder nicht gamma 2,2 korrigiert werden, weisen sie zu viele Bits oder zu viele Bandbreiten Highlights zu, die Benutzer nicht unterscheiden können, und zu wenige Bits oder Bandbreite zu Schattenwerten, auf die der Mensch empfindlich reagiert, so dass mehr Bits oder Bandbreite benötigt wird, um die gleiche visuelle Qualität zu erhalten. Um daher die beste Farbgenauigkeit sicherzustellen, stellen Sie Bilder auf dem Bildschirm dar, die gamma 2,2 korrigiert sind.

Genau genommen ist die tatsächliche sRGB-Umlagerungsfunktion eine stückweise Formel (lineares Segment + 2,4 Leistung), die sich geringfügig von einem rohen 2,2 Leistungs-Gamma unterscheidet. Der Einfachheit halber verwenden wir sie synonym.

Farbgenauigkeit

Für die Präsentation enthalten ganzzahlige Anzeigeformate (z. B. DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM usw.) immer sRGB-Gammakorrekturdaten. Float-Wert-Anzeigeformate (derzeit nur DXGI_FORMAT_R16G16B16A16_FLOAT) enthalten linearwertige Daten.

Der _SRGB-Formatmodifizierer gibt das Betriebssystem an, damit die App sRGB-Daten auf dem Bildschirm platziert. Die App muss sRGB-Daten immer in Hintergrundpuffer mit ganzzahligen Formaten platzieren, um die sRGB-Daten auf dem Bildschirm darzustellen, auch wenn die Daten nicht über diesen Formatmodifizierer im Formatnamen verfügen. Eine vollständige Liste der Anzeigescanformate:

Wenn Sie Gleitkomma-Ausgabewerte aus dem Pixelshader in Renderzielansichten (RenderTargetViews) mit dem an die Pipeline gebundenen _SRGB-Formatmodifizierer schreiben, konvertieren Sie sie in das korrigierten Farbraummodell von Gamma 2,2. Wenn Shaderressourcenansichten (ShaderResourceViews) mit dem _SRGB-Formatmodifizierer an die Pipeline gebunden sind, konvertieren Sie die Werte aus dem gamma 2,2-korrigierten Farbraummodell in einen linearen Farbraum, wenn Sie sie aus den ShaderResourceViews lesen. Der Shader kann dann Operationen ausführen.

Verwenden Sie z. B. Code ähnlich diesem, um Gleitkomma-Ausgabewerte aus einem Shader in ein RenderTargetView-Format zu schreiben:

struct PSOut
{
    float4 color : SV_Target;
};

PSOut S( PSIn input )
{
    PSOut output;
    output.color = float4( 1.0, 0.0, 0.0, 1.0 );
    return output;
}

Wenn die „S“-Routine zurücksendet, werden die Gleitkommawerte (1, 0, 0, 1) in das RenderTargetView-Format konvertiert. Wenn Sie RenderTargetView dann dem _SRGB-Formatmodifizierer zuweisen, erfolgt die Gammakonvertierung.

Dies sind die zu befolgenden Schritte, um sicherzustellen, dass der auf dem Bildschirm angezeigte Inhalt über die beste Farbgenauigkeit verfügt.

So stellen Sie die Farbgenauigkeit in der Pipeline sicher

  1. Wenn eine Textur sRGB-Inhalt aufweist, stellen Sie sicher, dass ShaderResourceView den _SRGB-Formatmodifizierer aufweist, sodass Sie beim Lesen aus dem ShaderResourceView in den Shader den Texturinhalt aus dem gamma 2,2-korrigiertem Farbraummodell in eine lineares Farbraummodell konvertieren.
  2. Stellen Sie sicher, dass RenderTargetView auch den _SRGB-Formatmodifizierer aufweist, sodass die Shader-Ausgabewerte gamma-konvertiert werden.

Wenn Sie die vorstehenden Schritte ausführen, weist der auf dem Bildschirm angezeigte Inhalt beim Aufrufen der IDXGISwapChain1::P resent1-Methode die beste Farbgenauigkeit auf.

Sie können die ID3D11Device::CreateRenderTargetView-Methode verwenden, um DXGI_FORMAT_*_SRGB-Ansichten in Hintergrundpuffern aus einer Swapchain zu erstellen, die Sie nur mit einem DXGI_FORMAT_*_UNORM-Format erstellen. Dies ist eine besondere Ausnahme für die Regel zum Erstellen von Render-Zielansichten, die besagt, dass Sie ein anderes Format mit ID3D11Device::CreateRenderTargetView nur verwenden können, wenn Sie die Ressource erstellt haben, die Sie mit DXGI_FORMAT_*_TYPELESS anzeigen möchten.

Weitere Informationen zu Regeln für Datenkonvertierung finden Sie unter Datenkonvertierungsregeln.

Informationen zum gleichzeitigen Lesen und Schreiben in eine Textur finden Sie unter Entpacken und Packen von DXGI_FORMAT für die direkte Bildbearbeitung.

Verbessern der Präsentation mit dem Flip-Modell, modifizierten Rechtecken und Bildlaufbereichen