Verwenden von Farbe in Direct2D

Direct2D verwendet das RGB-Farbmodell, bei dem Farben durch Kombination verschiedener Werte von Rot, Grün und Blau gebildet werden. Eine vierte Komponente, Alpha, misst die Transparenz eines Pixels. In Direct2D ist jede dieser Komponenten ein Gleitkommawert mit einem Bereich von [0,0 1,0]. Für die drei Farbkomponenten misst der Wert die Intensität der Farbe. Für die Alphakomponente bedeutet 0,0 vollständig transparent und 1.0 bedeutet vollständig undurchsichtig. Die folgende Tabelle zeigt die Farben, die sich aus verschiedenen Kombinationen von 100 % Intensität ergeben.

Red Grün Blau Color
0 0 0 Schwarz
1 0 0 Red
0 1 0 Grün
0 0 1 Blau
0 1 1 Cyan
1 0 1 Magenta
1 1 0 Gelb
1 1 1 White

Ein Bild, das RGB-Farben zeigt.

Farbwerte zwischen 0 und 1 ergeben unterschiedliche Schattierungen dieser reinen Farben. Direct2D verwendet die D2D1_COLOR_F-Struktur , um Farben darzustellen. Der folgende Code gibt z. B. Magenta an.

    // Initialize a magenta color.

    D2D1_COLOR_F clr;
    clr.r = 1;
    clr.g = 0;
    clr.b = 1;
    clr.a = 1;  // Opaque.

Sie können eine Farbe auch mithilfe der D2D1::ColorF-Klasse angeben, die von der D2D1_COLOR_F-Struktur abgeleitet wird.

    // Equivalent to the previous example.

    D2D1::ColorF clr(1, 0, 1, 1);

Alphamischung

Durch die Alphamischung werden transluzente Bereiche erstellt, indem die Vordergrundfarbe mit der Hintergrundfarbe gemischt wird, wobei die folgende Formel verwendet wird.

color = af * Cf + (1 - af) * Cb

Dabei steht Cb für die Hintergrundfarbe, Cf für die Vordergrundfarbe und af für den Alphawert der Vordergrundfarbe. Diese Formel wird paarweise auf jede Farbkomponente angewendet. Angenommen, die Vordergrundfarbe ist (R = 1,0, G = 0,4, B = 0,0), alpha = 0,6, und die Hintergrundfarbe ist (R = 0,0, G = 0,5, B = 1,0). Die resultierende Alphamischungsfarbe ist:

R = (1,0 * 0,6 + 0 * 0,4) = .6
G = (0,4 * 0,6 + 0,5 * 0,4) = ,44
B = (0 * 0,6 + 1,0 * 0,4) = ,40

Die folgende Abbildung zeigt das Ergebnis dieses Mischvorgangs.

Ein Bild, das die Alphamischung zeigt.

Pixelformate

Die D2D1_COLOR_F-Struktur beschreibt nicht, wie ein Pixel im Arbeitsspeicher dargestellt wird. In den meisten Fällen spielt das keine Rolle. Direct2D verarbeitet alle internen Details der Übersetzung von Farbinformationen in Pixel. Möglicherweise müssen Sie jedoch das Pixelformat kennen, wenn Sie direkt mit einer Bitmap im Arbeitsspeicher arbeiten oder Direct2D mit Direct3D oder GDI kombinieren.

Die DXGI_FORMAT-Enumeration definiert eine Liste von Pixelformaten. Die Liste ist ziemlich lang, aber nur einige davon sind für Direct2D relevant. (Die anderen werden von Direct3D verwendet.

Pixelformat Beschreibung
DXGI_FORMAT_B8G8R8A8_UNORM
Dies ist das gebräuchlichste Pixelformat. Alle Pixelkomponenten (rot, grün, blau und alpha) sind 8-Bit-Ganzzahlen ohne Vorzeichen. Die Komponenten werden in BGRA-Reihenfolge im Arbeitsspeicher angeordnet. (Sehen Sie sich die folgende Abbildung an.)
DXGI_FORMAT_R8G8B8A8_UNORM
Pixelkomponenten sind 8-Bit-Ganzzahlen ohne Vorzeichen in RGBA-Reihenfolge . Mit anderen Worten, die roten und blauen Komponenten werden im Verhältnis zu DXGI_FORMAT_B8G8R8A8_UNORM getauscht. Dieses Format wird nur für Hardwaregeräte unterstützt.
DXGI_FORMAT_A8_UNORM
Dieses Format enthält eine 8-Bit-Alphakomponente ohne RGB-Komponenten. Es ist nützlich, um Deckkraftmasken zu erstellen. Weitere Informationen zur Verwendung von Deckkraftmasken in Direct2D finden Sie unter Übersicht über kompatible A8-Renderziele.

Die folgende Abbildung zeigt das BGRA-Pixellayout.

Ein Diagramm, das das bgra-Pixellayout zeigt.

Um das Pixelformat eines Renderziels abzurufen, rufen Sie ID2D1RenderTarget::GetPixelFormat auf. Das Pixelformat entspricht möglicherweise nicht der Anzeigeauflösung. Beispielsweise kann die Anzeige auf 16-Bit-Farbe festgelegt werden, obwohl das Renderziel eine 32-Bit-Farbe verwendet.

Alphamodus

Ein Renderziel verfügt auch über einen Alphamodus, der definiert, wie die Alphawerte behandelt werden.

Alphamodus Beschreibung
D2D1_ALPHA_MODE_IGNORE Es wird keine Alphamischung durchgeführt. Alphawerte werden ignoriert.
D2D1_ALPHA_MODE_STRAIGHT Gerades Alpha. Die Farbkomponenten des Pixels stellen die Farbintensität vor der Alphamischung dar.
D2D1_ALPHA_MODE_PREMULTIPLIED Prämultipliziertes Alpha. Die Farbkomponenten des Pixels stellen die Farbintensität multipliziert mit dem Alphawert dar. Dieses Format ist effizienter zu rendern als das gerade Alpha, da der Begriff (af Cf) aus der Alphamischungsformel vorab berechnet wird. Dieses Format eignet sich jedoch nicht zum Speichern in einer Bilddatei.

Hier sehen Sie ein Beispiel für den Unterschied zwischen geradem Alpha und prämultipliziertem Alpha. Angenommen, die gewünschte Farbe ist reines Rot (100 % Intensität) mit 50 % Alpha. Als Direct2D-Typ wird diese Farbe als (1, 0, 0, 0, 0,5) dargestellt. Bei Verwendung von geradem Alpha und der Annahme von 8-Bit-Farbkomponenten wird die rote Komponente des Pixels 0xFF. Bei Verwendung von prämultipliziertem Alpha wird die rote Komponente um 50 % skaliert, um gleich 0x80.

Der datentyp D2D1_COLOR_F stellt Farben immer mit geradem Alpha dar. Direct2D konvertiert Pixel bei Bedarf in ein prämultipliziertes Alphaformat.

Wenn Sie wissen, dass Ihr Programm keine Alphamischung durchführt, erstellen Sie das Renderziel mit dem D2D1_ALPHA_MODE_IGNORE Alphamodus. Dieser Modus kann die Leistung verbessern, da Direct2D die Alphaberechnungen überspringen kann. Weitere Informationen finden Sie unter Verbessern der Leistung von Direct2D-Anwendungen.

Nächste

Anwenden von Transformationen in Direct2D