Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [DelphiX] Alphablending via "Surface.Blt" (https://www.delphipraxis.net/25201-%5Bdelphix%5D-alphablending-via-surface-blt.html)

dizzy 2. Jul 2004 17:12


[DelphiX] Alphablending via "Surface.Blt"
 
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

dizzy 4. Jul 2004 01:55

Re: [DelphiX] Alphablending via "Surface.Blt"
 
*schiehiiiiieb* :angle2:

Bin leider kein Stück weiter gekommen :?
Hat denn noch niemand hier zwei DirectX-Surfaces ineinanderkopiert? Irgendwie? Und schnell, so dass für Animation geeignet?

Zu Hüüülf! :)

dizzy 5. Jul 2004 00:07

Re: [DelphiX] Alphablending via "Surface.Blt"
 
Ja Scheisse... (sorry, aber is so)

Zitat:

Zitat von 2D Alpha Blending by Gary Simmons
I have lost count of the number of times I have seen in programming news groups, cry's for help from people who cant get DirectDraw to do Alpha Blending. These people think THEY are doing something wrong or missing something, but they are not. The simple fact is this :

DirectDraw does not support AlphaBlending

*buääääähhhhh* :cry:


...kann doch nicht wahr sein... MANN!

dizzy 5. Jul 2004 00:12

Re: [DelphiX] Alphablending via "Surface.Blt"
 
Heisst das jetzt, dass ich für "blödes" einfaches Alphablending auf Direct3D zurückgreifen muss? Das wäre absoluter Overkill. Oder hat jemand von euch eine Idee wie man mit Delphi reichlich schnell bis zu 5 Bitmaps, jeweils mit halber Durchlässigkeit, ineinander Belnden kann?
Die Routinen die die Graphics 32 Lib bereitstellt sind n Tacken zu lahm :?

supermuckl 5. Jul 2004 00:15

Re: [DelphiX] Alphablending via "Surface.Blt"
 
mit openGL gehts *duck*

dizzy 5. Jul 2004 00:20

Re: [DelphiX] Alphablending via "Surface.Blt"
 
ich könnt' :kotz: : Der Typ machts mit Direct3D, in Englisch, in C, zu kompliziert, zu viel für nen blöden kleinen Effekt...

@supermuckl: OpenGL ist doch sowieso "nur" 3D, oder? Es würde auf das selbe hinaus laufen: Die Bilder sind Texturen, und es würden n Polygone halbtransparent "übereinandergestapelt" die je eines der Bildes enthalten, gell?
Ich würde das sehr gerne ohne jegliches 3D lösen... OpenGL hab ich schon mal angefasst, und naja, einfach und schnell ist was anderes :?

supermuckl 5. Jul 2004 00:23

Re: [DelphiX] Alphablending via "Surface.Blt"
 
jo da haste recht.. aber mich juckts nicht sehr.. bin ja gerade dran n 2D "ballerburg" zu coden..

und da tu ich einfach so alsob ich 2D habe.. und stell es mit hilfe von der 3D engine 2D mäßig dar.. geht super.. und ich kann nebenher auch noch lustige effekte nutzen.. auch 3D objekte die nacher wie 2D gerendert werden.. oder schatten machen usw :)

GLScene machts möglich :D

dizzy 5. Jul 2004 00:39

Re: [DelphiX] Alphablending via "Surface.Blt"
 
:roll: mit GLScene hatte ich auch schon so meine Last.

Aber nun gut, dann get es so nicht. Schade auch! Falls es mal um mehr als nen kleinen Effekt geht werd ich aber wohl dann zu GLScene greifen...

Bin aber auch weiterhin für Ideen (non-3D ;)) offen!


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz