Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [Andorra 2D] Licht - stufiger Übergang realisieren (https://www.delphipraxis.net/154186-%5Bandorra-2d%5D-licht-stufiger-uebergang-realisieren.html)

sabbert 31. Aug 2010 12:26

[Andorra 2D] Licht - stufiger Übergang realisieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

undzwar habe ich eine erneute Frage zu dem Thema Licht bzw. Lampe generell oder hier Andorra 2D.

Alter Fragethread : hier

Ich habe es geschafft eine Taschenlampe zu erstellen und weitere normale Lampen, die ich gebrauche, um einige Stellen in meinem Level zu erleuchten ( siehe Bild im Anhang).

Das klappt wunderbar nur sieht das grafisch nicht unbedingt "super" aus.

Mit "super" meine ich, ob es möglich wäre eine Art Übergang zwischen Licht und "Dunkelheit" zu erschaffen.

Das Licht soll sozusagen Stufenweise dunkler werden...

Weiß aber nicht genau wie ich das machen soll :( Habe versucht die Maske so zu Zeichnen das ein Schwarz/Weißer Kreis entsteht, der innen weiß ist und nach außen hin dunkler wird. Nur bringt dies leider nichts, es ist trotzdem alles hell xD

Wie ist so ein "Stufiger Übergang" in Andorra 2D realisierbar?

mfg

blackfin 31. Aug 2010 12:30

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
Wenn du die Maske über den Stencil-Buffer gemacht hast, kannst du damit keine Übergänge bilden, da der Stencil-Buffer ein 1-Bit-Puffer ist (0/1).

Allerdings könntest du doch innerhalb der Maske (also im hellen Bereich) eine Textur mit Alphakanal überblenden, die einen nach aussen hin dunkler werdenden Kreis darstellt (Gradient-Circle).
Wie man das allerdings mit Andorra macht, keine Ahnung. Ich denke aber, das unterstützt ja auch irgendwie Blending.

Namenloser 31. Aug 2010 12:38

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
Ich würde die Maske auf eine Textur zeichnen und anschließend diese Textur multiplikativ auf die Zeichenfläche anwenden. Wie das mit Andorra 2D geht, weiß ich aber nicht.

igel457 31. Aug 2010 14:55

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
Du kannst mit dem Canvas nochmal die gleiche Figur mit einem Gradient drüber zeichnen - zumindest für die kreisförmigen Lichter sollte das kein Problem sein. Setze dafür die äußere Farbe auf "Ad_ARGB(255, 0, 0, 0)" und die innere auf "Ad_ARGB(0, 0, 0, 0)". Siehe hierfür das Canvas-Tutorial.

Ein Problem hast du nur, wenn sich zwei Lichtquellen überschneiden. Normalerweise wird das so gelöst, dass du die Szene für jedes Licht einzeln in einen Off-Screen-Buffer (TAdRenderTargetTexture) zeichnest und das Ergebnis additiv auf das Ergebnis additiv auf den eigentlichen ausgabe Puffer blendest. Hierdurch verstärken sich die einzelnen Lichtquellen. Du kannst dir hierzu die "Surface" Demo anschauen.

Am besten löst du aber erstmal das Problem mit den Gradienten und gib bescheid wenn du mit zweiterem nicht weiter kommst.

Edit: Die Lösung von NamenLozer ist eigentlich viel eleganter: Hier zeichnest du auf ein Schwarzes Surface allgemein nur deine Lichter additiv (mit dem Gradienten wie oben beschrieben) und mulitiplizierst das Ergebnis mit der kompletten Szene. Nur multiplikatives Zeichnen muss noch ein die Plugins eingebaut werden (ist aber mit wenigen Zeilen erledigt):

Erstmal musst du in der AdClasses Zeile 117 den Modus "bmMultiply" hinzufügen. Im OpenGL-Plugin (/dll/OpenGL/OGLMain.pas) Zeile 642
Delphi-Quellcode:
bmMultiply: glBlendFunc(GL_DST_COLOR, GL_ZERO);
schreiben, im DirectX-Plugin (/dll/DirectX/DX3DMain.pas) Zeile 767
Delphi-Quellcode:
if ABlendMode = bmMultiply then begin
Direct3DDevice9.SetRenderState(D3DRS_SRCBLEND,D3DBLEND_DESTCOLOR);
Direct3DDevice9.SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ZERO);
end;
. Dann beide Plugins neu Compilieren und fertig.

himitsu 31. Aug 2010 15:16

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
Und wenn man die Gradienden erstmal auf ein schwarzes Bild aditiv draufmalt und diese gemeinsamme Bild dann über die Szene drüberlegt?

igel457 31. Aug 2010 16:36

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
Es sollte schwerer werden den Alpha-Kanal an den richtigen Stellen transparent zu kriegen... Mit der Multiply-Lösung ist aber auch der Vorteil gegeben, dass die Lichter unterschiedliche Farben haben können.

sabbert 31. Aug 2010 23:28

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
ok danke erstmal für die Hilfe

Habe es geschafft für die Kreise Gradients zu erzeugen...

Für das Polygon leider noch nicht.

Habe bei dem zweiten Probleme. Die Codes hab ich eingefügt nur beim Kompilieren der dlls komme ich nicht weiter.

Erst fehlten Units, die ich mir dann besorgt habe. Doch Delphi will jedesmal wenn ich Kompiliere eine HostAnwendung in den Paramtern eingegeben haben oO

Was muss ich tun :D

Looper 1. Sep 2010 00:09

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
Bei Start|Parameter muss man die dllhost.exe einfügen.
Zu finden im system32 Ordner. Jedenfalls lief das bei mir dann immer :wink:

Neutral General 1. Sep 2010 07:25

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
Du kannst auch die DLL einfach erzeugen mit Shift-F9 oder Projekt--> <Projektname> erzeugen.
Dann brauchst du keine Hostanwendung.

sabbert 1. Sep 2010 14:19

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
Hab das geschafft danke ;-)

Zitat:

Zitat von igel457 (Beitrag 1046362)
Edit: Die Lösung von NamenLozer ist eigentlich viel eleganter: Hier zeichnest du auf ein Schwarzes Surface allgemein nur deine Lichter additiv (mit dem Gradienten wie oben beschrieben) und mulitiplizierst das Ergebnis mit der kompletten Szene.

Versteh das noch nicht so ganz mit dem dem "Ergebnis multiplizieren"...

igel457 1. Sep 2010 14:45

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
Also... du erstellst ein Surface von der Größe des Fensters (wie das geht, ist in der Surface Demo gezeigt) - bei einem Surface handelt es sich um eine Textur, auf die du mit allen anderen Andorra 2D Befehlen drauf Zeichnen kannst - auch das TAdDraw ist ein solches Surface, nur das dessen Inhalte direkt auf den Bildschirm gezeichnet werden.

1. Surface erstellen:
Delphi-Quellcode:
AdSurface := TAdTextureSurface.Create(AdDraw);
AdSurface.SetSize(AdDraw.Width, AdDraw.Height);
2. In der Spieleschleife:
Delphi-Quellcode:
AdSurface.Clear(clBlack);
//Zeichne nun deine Lichter auf das Surface (mit AdSurface.Canvas), wobei du
//AdSurface.Canvas.Brush.BlendMode auf bmAdd stellst. Durch das "bmAdd" addieren
//sich die Farbwerte der Lichter korrekt auf, wenn sie sich überschneiden
4. Zeichne dein Spielfeld ohne Stencilbuffer (den brauchen wir nicht mehr) auf das AdDraw

5. Zeichne das Surface nun multiplikativ auf das Spielfeld. Das hat folgenden Effekt: Die Farbwerte eines jeden Surface-Pixels werden mit dem darunterliegenden Pixel multipliziert: Wo das Surface weiß war (1.0, 1.0, 1.0) wird die Farbe des darunterliegenden Pixels übernommen (da x * 1.0 = x), wo das Surface schwarz war (0.0, 0.0, 0.0) wird auch der darunterliegende Pixel schwarz.
Delphi-Quellcode:
var
  r: TAdRect;

r := AdDraw.SurfaceRect;
AdSurface.Image.DrawEx(AdDraw, r, r, 0, 0, 0, 255, bmMultiply);
Hoffe dir hilft das ;-)

sabbert 1. Sep 2010 23:26

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
So habe alle gemacht, aber es scheint leider nicht zu Funktionieren :(

Es ist alles schwarz, bis auf Taschenlampe(ohne Gradient). Sobald ich keine Gradient-Kreise zeichne werden die Lichter zwar angezeigt aber natürlich ohne den gewünschten Effekt...

Delphi-Quellcode:
     if Map.Licht then //Nur zu Testzwecken
     begin

      AdDraw.Options := AdDraw.Options + [aoLight];
      AdDraw.Scene.AmbientColor := Ad_ARGB(0, 0, 0, 0);

      //Scene einmal zeichnen
      AdSpriteEngine.Draw;

      AdDraw.Options := AdDraw.Options - [aoLight];

      AdSurface.ClearSurface(clBlack);


      AdSurface.Canvas.Brush.BlendMode := bmAdd;

      //Zeichnet weiße Kreise um alle Lampen (Licht)
      Map.Lichtanzeigen(AdSurface);

      //Zeichnet das Taschenlampelicht in weiß
      Figur.Lampe.zeichne(AdSurface);

      //Zeichnet gradient-Kreise um alle Lampen (Schwarz/weiß)
      Map.LichtanzeigenGradient(AdSurface);

      r := AdDraw.SurfaceRect;
      AdSurface.Image.DrawEx(AdDraw, r, r, 0, 0, 0, 255, bmMultiply);


      //Szene zeichnen
      AdSpriteEngine.Draw;

     end else AdSpriteEngine.Draw;
Was ist falsch an dem Code?!
Hab die neuen Dll's in den Ordner kopiert...

igel457 2. Sep 2010 09:00

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
Du musst erst die Spriteengine auf das AdDraw zeichnen und dann das Surface mit dem Ergebnis multiplizieren:
Delphi-Quellcode:
AdDraw.Activate;
AdSpriteEngine.Draw;

AdSurface.Image.Draw(AdDraw, ..., bmMultiply);
Wenn das nicht funktioniert, überprüfe ob der Inhalt des Surfaces (also nur die Lichter) korrekt gezeichnet werden, wenn du bmAlpha als BlendMode angibst.

sabbert 2. Sep 2010 15:07

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Jo danke hat geklappt ;-)

Sieht schon besser aus hab mal ein Testbild angehängt, wo einfach ein paar Lampen nebeneinander sind.

Muss jetzt nurnoch die Taschenlampe versuchen Gradient zu zeichnen hat noch nicht so geklappt ;-)

igel457 2. Sep 2010 15:51

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
Hey, das sieht ja gar nicht mal so schlecht aus, dafür, dass ich den Code für die Grafikplugins nicht getestet habe ;-)

Du solltest - entsprechende Grafiken für das Terrain vorausgesetzt - recht coole Effekte herstellen können - schließlich können die Lampen jede beliebige Lichtfarbe haben und auch flackern etc.

igel457 2. Sep 2010 16:26

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
Zitat:

Zitat von sabbert (Beitrag 1047019)
Muss jetzt nurnoch die Taschenlampe versuchen Gradient zu zeichnen hat noch nicht so geklappt ;-)

Ich würde dafür an deiner Stelle den Taschenlampenkegel als vorgefertigtes Bild nehmen und dieses entsprechend Rotiert zeichnen, mit der "TAdImage.DrawRotateAdd" funktion - mit dem Canvas wird das weniger gut funktionieren.

Namenloser 2. Sep 2010 16:28

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
Oder mit dem Stencilbuffer den Lichtkegel maskieren und dann vom Mittelpunkt aus einen ausfadenden Kreis im Radius des Kegels zeichnen.

igel457 2. Sep 2010 16:32

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
Klingt auch nach einer guten Lösung, doch Surfaces (FBOs) und Stencilbuffer gleichzeitig sind eine Sache, bei der ich nicht garantieren kann, dass sie funktioniert (ich bin mir auf jeden Fall nicht sicher, ob ich es je getestet habe) ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:34 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