Seite 1 von 1
[ERLEDIGT] [DX9] Blending
Verfasst: 30.05.2009, 07:47
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?
Re: [DX9] Blending
Verfasst: 30.05.2009, 09:07
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
Re: [DX9] Blending
Verfasst: 30.05.2009, 10:52
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
Re: [DX9] Blending
Verfasst: 30.05.2009, 12:42
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
Re: [DX9] Blending
Verfasst: 30.05.2009, 22:18
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...