Konfigurieren von Mischfunktionen

Füllvorgänge werden für jede Pixel-Shaderausgabe (RGBA-Wert) ausgeführt, bevor der Ausgabewert in ein Renderziel geschrieben wird. Wenn Multisampling aktiviert ist, erfolgt die Mischung für jede Multisampel. Andernfalls wird für jedes Pixel eine Mischung ausgeführt.

Erstellen des Mischzustands

Der Mischzustand ist eine Auflistung von Zuständen, die zum Steuern der Überblendung verwendet werden. Diese Zustände (definiert in D3D11_BLEND_DESC1) werden verwendet, um das Mischzustandsobjekt durch Aufrufen von ID3D11Device1::CreateBlendState1 zu erstellen.

Für instance sehen Sie hier ein sehr einfaches Beispiel für die Erstellung von Mischzuständen, bei dem die Alphamischung deaktiviert wird und keine Pixelmaskierung pro Komponente verwendet wird.

ID3D11BlendState1* g_pBlendStateNoBlend = NULL;

D3D11_BLEND_DESC1 BlendState;
ZeroMemory(&BlendState, sizeof(D3D11_BLEND_DESC1));
BlendState.RenderTarget[0].BlendEnable = FALSE;
BlendState.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
pd3dDevice->CreateBlendState1(&BlendState, &g_pBlendStateNoBlend);

Dieses Beispiel ähnelt dem HLSLWithoutFX10-Beispiel.

Binden des Mischzustands

Nachdem Sie das Blend-State-Objekt erstellt haben, binden Sie das Blend-State-Objekt an die Output-Merger-Phase, indem Sie ID3D11DeviceContext::OMSetBlendState aufrufen.

float blendFactor[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
UINT sampleMask   = 0xffffffff;

pd3dDevice->OMSetBlendState(g_pBlendStateNoBlend, blendFactor, sampleMask);

Diese API akzeptiert drei Parameter: das Blendzustandsobjekt, einen Mischfaktor mit vier Komponenten und eine Beispielmaske. Sie können null für das Blend-State-Objekt übergeben, um den Standard-Blendzustand anzugeben, oder sie können ein Blend-State-Objekt übergeben. Wenn Sie das Blendzustandsobjekt mit D3D11_BLEND_BLEND_FACTOR oder D3D11_BLEND_INV_BLEND_FACTOR erstellt haben, können Sie einen Mischfaktor übergeben, um Werte für den Pixelshader, das Renderziel oder beides zu modulieren. Wenn Sie das Blendzustandsobjekt nicht mit D3D11_BLEND_BLEND_FACTOR oder D3D11_BLEND_INV_BLEND_FACTOR erstellt haben, können Sie trotzdem einen Mischfaktor ohne NULL übergeben, aber in der Mischphase wird der Mischfaktor nicht verwendet. Die Runtime speichert den Mischfaktor, und Sie können später ID3D11DeviceContext::OMGetBlendState aufrufen, um den Mischfaktor abzurufen. Wenn Sie NULL übergeben, verwendet oder speichert die Runtime einen Mischfaktor von { 1, 1, 1, 1 }. Bei der Beispielmaske handelt es sich um eine benutzerdefinierte Maske, die bestimmt, wie das vorhandene Renderziel vor dem Aktualisieren stichprobeniert werden soll. Die Standard-Samplingmaske ist 0xffffffff, die die Punktentnahme bezeichnet.

In den meisten Tiefenpufferschemas wird das Pixel gezeichnet, das der Kamera am nächsten ist. Beim Einrichten des Tiefenschablonenzustands kann der DepthFunc-Member von D3D11_DEPTH_STENCIL_DESC ein beliebiges D3D11_COMPARISON_FUNC sein. Normalerweise möchten Sie, dass DepthFuncD3D11_COMPARISON_LESS ist, damit die Pixel, die der Kamera am nächsten sind, die Pixel dahinter überschreiben. Je nach den Anforderungen Ihrer Anwendung kann jedoch eine der anderen Vergleichsfunktionen verwendet werden, um den Tiefentest durchzuführen.

Themen für erweitertes Mischen

Alpha-to-Coverage

Alpha-to-Coverage ist ein Multisampling-Verfahren, das am nützlichsten für Situationen wie dichtes Laub ist, in denen es mehrere überlappende Polygone gibt, die Alphatransparenz verwenden, um Kanten innerhalb der Oberfläche zu definieren.

Sie können das AlphaToCoverageEnable-Element von D3D11_BLEND_DESC1 oder D3D11_BLEND_DESC verwenden, um zu aktivieren, ob die Runtime die .a-Komponente (Alpha) des Ausgaberegisters SV_Target0 aus dem Pixel-Shader in eine n-Schritt-Abdeckungsmaske konvertiert (bei einem n-Beispiel renderTarget). Die Runtime führt einen AND-Vorgang dieser Maske mit der typischen Beispielabdeckung für das Pixel im Grundformat (zusätzlich zur Beispielmaske) aus, um zu bestimmen, welche Beispiele in allen aktiven RenderTargetsaktualisiert werden sollen.

Wenn der Pixel-Shader SV_Coverage ausgibt, deaktiviert die Runtime alpha-to-coverage.

Hinweis

Beim Multisampling teilt sich die Runtime nur eine Abdeckung für alle RenderTarget-Instanzen. Die Tatsache, dass die Runtime .a von ausgabe SV_Target0 in coverage liest und konvertiert, wenn AlphaToCoverageEnable TRUE ist, ändert den .a-Wert nicht, der an den Blender bei RenderTarget 0 wechselt (wenn dort ein RenderTarget festgelegt wird). Wenn Sie Alpha-to-Coverage aktivieren, haben Sie im Allgemeinen keinen Einfluss darauf, wie alle Farbausgaben von Pixel-Shadern über die Ausgabefusionsphase mit RenderTargets interagieren, außer dass die Runtime einen AND-Vorgang der Abdeckungsmaske mit der Alpha-to-Coverage-Maske ausführt. Alpha-to-Coverage funktioniert unabhängig davon, ob die Runtime RenderTarget mischen kann oder ob Sie die Überblendung für RenderTarget verwenden.

 

Grafikhardware gibt nicht genau an, wie sie Pixel-Shader SV_Target0.a (Alpha) in eine Abdeckungsmaske konvertiert, mit dem Unterschied, dass Alpha von 0 (oder weniger) keine Abdeckung und Alpha von 1 (oder höher) der vollständigen Abdeckung zugeordnet werden muss (bevor die Runtime einen AND-Vorgang mit tatsächlicher primitiver Abdeckung ausführt). Da Alpha von 0 auf 1 geht, sollte die resultierende Abdeckung in der Regel monoton zunehmen. Hardware kann jedoch Flächendithering durchführen, um eine bessere Quantisierung von Alphawerten auf Kosten der räumlichen Auflösung und des Rauschens zu ermöglichen. Ein Alphawert von NaN (Not a Number) führt zu einer Maske ohne Abdeckung (Null).

Alpha-to-Coverage wird traditionell auch zur Transparenz von Bildschirmtüren oder zur Definition detaillierter Silhouetten für ansonsten undurchsichtige Sprites verwendet.

Mischen von Pixel-Shaderausgaben

Dieses Feature ermöglicht es der Ausgabezusammenführung, beide Pixel-Shaderausgaben gleichzeitig als Eingabequellen für einen Mischvorgang mit dem einzelnen Renderziel im Slot 0 zu verwenden.

In diesem Beispiel werden zwei Ergebnisse in einem einzelnen Durchlauf kombiniert, wobei eins mit dem Ziel mit einer Multiplikation und das andere mit einem Add kombiniert wird:

SrcBlend = D3D11_BLEND_ONE;
DestBlend = D3D11_BLEND_SRC1_COLOR;

In diesem Beispiel wird die erste Pixel-Shaderausgabe als Quellfarbe und die zweite Ausgabe als Mischfaktor für die Komponente pro Farbe konfiguriert.

SrcBlend = D3D11_BLEND_SRC1_COLOR;
DestBlend = D3D11_BLEND_INV_SRC1_COLOR;

In diesem Beispiel wird veranschaulicht, wie die Mischfaktoren mit den Shader-Swizzles übereinstimmen müssen:

SrcFactor = D3D11_BLEND_SRC1_ALPHA;
DestFactor = D3D11_BLEND_SRC_COLOR;
OutputWriteMask[0] = .ra; // pseudocode for setting the mask at
                          // RenderTarget slot 0 to .ra

Zusammen implizieren die Mischfaktoren und der Shadercode, dass der Pixel-Shader erforderlich ist, um mindestens o0.r und o1.a auszugeben. Zusätzliche Ausgabekomponenten können vom Shader ausgegeben werden, würden jedoch ignoriert, da weniger Komponenten nicht definierte Ergebnisse erzeugen würden.

Output-Merger-Phase

Pipelinephasen (Direct3D 10)