Einzelnen Beitrag anzeigen

Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#1

[DelphiX] Alphablending via "Surface.Blt"

  Alt 2. Jul 2004, 17:12
Hallo!

Ich versuche mich gerade in der Kunst des DirectDraw und hänge an einer blöden Stelle. Ich möchte einen Motion-Blur-Effekt realisieren.
Als Grundlage habe ich eine Array von TDirectDrawSurfaces in denen die zusammen zu blendenden Bilder liegen, aber gerade das Blending tut nicht

Erstmal etwas Kot:
Delphi-Quellcode:
const bmpCount = 3;
var i: integer;
    ba: array[0..bmpCount] of TDirectDrawSurface;
    fx : TDDBltFX;
begin
  for i := 0 to bmpCount-1 do
  begin
    ba[i] := TDirectDrawSurface.Create(DXDraw1.DDraw);
    ba[i].SetSize(1200, 600);
    ba[i].Fill(0);
  end;
  
  // Die TDDBltFX-Structure einstellen, ich hoffe hier ist alles korrekt
  fx.dwSize := SizeOf(fx);
  fx.dwDDFX := 0;
  fx.dwAlphaSrcConstBitDepth := 8;
  fx.dwAlphaDestConstBitDepth := 8;
  fx.dwAlphaSrcConst := 200;
  fx.dwAlphaDestConst := 200;

  DXDraw1.SurfaceWidth := 1200;
  DXDraw1.SurfaceHeight := 600;

  while true do
  begin

    // Die Bilder werden hier der Reihe nach um ein Element im Array
    // nach hinten verschoben. Das scheint zu klappen... in ba[1] z.B.
    // ist nachher tatsächlich ein Bild.
    for i := bmpCount-2 downto 0 do
    begin
      ba[i].Canvas.Release;
      ba[i+1].BltFast(0,
                      0,
                      ba[i].ClientRect,
                      DDBLTFAST_NOCOLORKEY,
                      ba[i]);
    end;

    ba[0].Fill(0);
    // Hier wird im Original-Code auf dem Canvas von ba[0] gezeichnet - das klappt auch.

    // Hier die Schleife die das Blending machen soll
    // und ba[0] ist anschließend ganz schwarz :(
    for i := bmpCount-2 downto 0 do
    begin
      ba[i].Canvas.Release;
      ba[i].Blt(ba[i].ClientRect,
                ba[i+1].ClientRect,
                DDBLT_AlphaDestConstOverride or DDBLT_AlphaSrcConstOverride,
                fx,
                ba[i+1])
    end;

    ba[0].Canvas.Release;
    DXDraw1.Surface.Draw(0,
                         0,
                         ba[0].ClientRect,
                         ba[0],
                         false);
    DXDraw1.Flip;
    Application.ProcessMessages;
  end;
end;
Kann mir einer sagen wo ich jetzt den Fehler sehen muss?

gruss,
dizzy

\\edit: Ach so! Ist mit DelphiX for Delphi 7
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat