[ERLEDIGT] [DX9] Blending

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

[ERLEDIGT] [DX9] Blending

Beitrag von DomiOh »

Hallo,

ich habe diesmal folgendes:

Wenn ich (z.B. per Shader) mehrere Screen-Aligned-Quads übereinander rendere, werden diese bei eingeschaltetem Alpha-Blending
(ONE, ONE) multipliziert oder addiert?
Kann man diese Blending-Operation ändern?
Zuletzt geändert von DomiOh am 30.05.2009, 22:18, insgesamt 1-mal geändert.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: [DX9] Blending

Beitrag von Zudomon »

Hi!
Bei One One wird addiert.
Ich hatte mir in meiner DX9 Engine damals eine Funktion gemacht, in der ich ein paar Blendings direkt aktivieren konnte.
Ist zwar Delphi Code, aber ich denke, den versteht trotzdem jeder. :)

Code: Alles auswählen

  
// _mode:
//  0 - No blend
//  1 - Adaptive
//  2 - Alpha
//  3 - Subtract
//  4 - Color
//  5 - Multiply
//  6 - Invert

procedure TModul3D.BlendMode(_mode: Integer);
begin
  with D3DDevice do begin
    SetRenderState(D3DRS_ALPHABLENDENABLE, cardinal(_mode>0));

    case _mode of
      1: begin
           SetRenderState(D3DRS_SRCBLEND,Cardinal(D3DBLEND_ONE));
           SetRenderState(D3DRS_DESTBLEND,Cardinal(D3DBLEND_ONE));
         end;
      2: begin
           SetRenderState(D3DRS_SRCBLEND,Cardinal(D3DBLEND_SRCALPHA));
           SetRenderState(D3DRS_DESTBLEND,Cardinal(D3DBLEND_INVSRCALPHA));
         end;
      3: begin
           SetRenderState(D3DRS_SRCBLEND,Cardinal(D3DBLEND_ZERO));
           SetRenderState(D3DRS_DESTBLEND,Cardinal(D3DBLEND_INVSRCCOLOR));
         end;
      4: begin
           SetRenderState(D3DRS_SRCBLEND,Cardinal(D3DBLEND_SRCCOLOR));
           SetRenderState(D3DRS_DESTBLEND,Cardinal(D3DBLEND_INVSRCCOLOR));
         end;
      5: begin
          SetRenderState(D3DRS_SRCBLEND,Cardinal(D3DBLEND_ZERO));
           SetRenderState(D3DRS_DESTBLEND,Cardinal(D3DBLEND_SRCCOLOR));
         end;
      6: begin
          SetRenderState(D3DRS_SRCBLEND,Cardinal(D3DBLEND_INVDESTCOLOR));
           SetRenderState(D3DRS_DESTBLEND,Cardinal(D3DBLEND_ZERO));
         end;
    end;

  end;
end;
Gruß
Zudo
Benutzeravatar
Schrompf
Moderator
Beiträge: 4852
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [DX9] Blending

Beitrag von Schrompf »

Es gibt zusätzlich noch den D3DRS_BLENDOP. Mit dem kannst Du die tatsächliche mathematische Operation einstellen, die mit den beiden Operanden ausgeführt wird.

Eine kleine Einführung, weil mein Kaffeewasser grad kocht:

Die ultimative, allzeit richtige Alphablending-Formel lautet "QuellFaktor * QuellPixel <op> ZielFaktor * ZielPixel"

Der Quellfaktor ist die Einstellung, die Du mit D3DRS_SRCBLEND einstellst. Wenn Du da ein ONE einstellst, heißt das wirklich "1". Der Zielfaktor ist dann entsprechend D3DRS_DESTBLEND.

Mit "Quellpixel" ist die RGBA-Farbe gemeint, die aus dem PixelShader rauskommt. Der "Zielpixel" ist die Farbe, die vor der PixelShader-Ausführung an der Ziel-Bildschirmstelle steht. Und zuletzt die <op> ist die mathematische Operation, mit der die beiden Teile verrechnet werden. Der Standardwert ist "Addition", aber es gibt auch noch "Subtraktion", "inverse Subtraktion", "min" und "max". Nützlich.

Die Standardeinstellung bei DX9-Alphablending ist SRC == ONE, DEST == ZERO, OP == ADD. Wenn wir diese drei Werte in obige Formel einsetzen, heißt die Rechnung "1 * QuellPixel + 0 * ZielPixel". Da sieht man schon, das auf dem Bildschirm am Ende nur die PixelShader-Ergebnisfarbe rauskommt, die bisherige Bildschirmfarbe an der Stelle verschwindet komplett. Das ist also eine Einstellung, wie als wär AlphaBlending aus.

Mit (ONE, ONE) ändert sich das dann zur reinen Addition. Die Formel würde dann lauten "1 * QuellPixel + 1 * ZielPixel", oder kurz "Quelle + Ziel". Es dürfte jetzt klar sein, warum man das "Additives AlphaBlending" nennt. Eine andere gängige Einstellung ist das eigentliche "AlphaBlending", bei dem Quellfarbe und Zielfarbe anteilig zusammengemischt werden, je nachdem wie hoch der Alphawert des Quellpixels ist. Die Einstellung dazu (SRCALPHA, INVSRCALPHA), die Formel dazu lautet dann "QuellAlpha * QuellFarbe + (1-QuellAlpha) * ZielFarbe". Auch hier sieht man sofort, wie die Formel wirkt: je höher der Alphawert ist, der aus dem Shader kommt, desto mehr von der Shader-Ausgabefarbe überlebt und desto weniger von der bisherigen Bildschirmfarbe bleibt übrig.

Bye, Thomas
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Droven
Beiträge: 25
Registriert: 05.03.2009, 08:48
Echter Name: David Lorenz
Wohnort: Dresden

Re: [DX9] Blending

Beitrag von Droven »

Hi,

Schöne Zusammenfassung, Thomas. Ich denke dies wird noch für weiter User/Gäste nützlich sein.

Well done.

MfG Droven
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

Re: [DX9] Blending

Beitrag von DomiOh »

Aha. Das war genau mein Problem.
Das mit dem D3DRS_BLENDOP hatte ich total vergessen.
Habe lange nichts mit dieser Blending-Technik gemacht.

Vielen Dank für die Info...
Antworten