Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Jul 15, 2025 13:08

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
BeitragVerfasst: So Nov 14, 2010 12:25 
Offline
DGL Member
Benutzeravatar

Registriert: So Nov 07, 2010 14:08
Beiträge: 11
Programmiersprache: Delphi
Hallo,

ich bin gerade dabei mich ein wenig in die Fireblade Partikel-Engine einzuarbeiten.
Ich habe die neueste Version von Sourceforge und wollte einmal tut_basic kompilieren,
da dass jedoch für Freepascal ist (und ich Codegear Delphi verwende) habe ich es - eigentlich - eins zu eins in ein mit Codegear Delphi ikompilierbares Projekt umgeschrieben.
Leider funktioniert das jetzt nicht ganz so wie es soll :mrgreen: sprich ich sehe nicht den Emitter den man eigentlich erzeugt hat sondern - nur den blauen Hintergrund (sonst nichts).

Das einzige was ich übrigens richtig verändern musste war dass ich kein SDL, und auch den SDL_TextureLoader durch die textures.pas (v1.03) ausgetauscht habe.

Falls es hilft ist hier mein Quellcode:
Code:
unit Unit1;

interface

uses
  dglOpenGL, Fireblade, fbu_emitters, fbu_effectmanager, textures, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

const
  NearClipping = 1;
  FarClipping  = 1000;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    StartTime, TimeCount, FrameCount  : Cardinal; //FrameCounter
    Frames, DrawTime                  : Cardinal; //& Timebased Movement
    FTexture: TGLUInt;
    FContext: TFB_Context;
    FEmitter: TFBU_SphereEmitter;
    FEffectManager: TFBU_EffectManager;
    FTrash: TList;
    FDeltaTime, FLastDeltaTime, t: Single;
    procedure SetupContext;
    procedure IdleHandler(Sender: TObject; var Done: Boolean);
    procedure SetupGL;
    procedure Render;
  public
    DC                                : HDC;  //Handle auf Zeichenfläche
    RC                                : HGLRC;//Rendering Context
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnIdle := IdleHandler;
  DC:= GetDC(Handle);
  if not InitOpenGL then Application.Terminate;
  RC:= CreateRenderingContext( DC,
                               [opDoubleBuffered],
                               32,
                               24,
                               0,0,0,
                               0);
  ActivateRenderingContext(DC, RC);

  SetupGL;

  ReadExtensions;
  ReadImplementationProperties;
  LoadTexture('DR_StdSet.tga', FTexture);
  SetupContext;
end;

procedure TForm1.FormResize(Sender: TObject);
var tmpBool : Boolean;
begin
  glViewport(0, 0, ClientWidth, ClientHeight);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);


  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
  IdleHandler(Sender, tmpBool);
end;

procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
begin
  StartTime:= GetTickCount;
  Render;
  DrawTime:= GetTickCount - StartTime;
  Inc(TimeCount, DrawTime);
  Inc(FrameCount);

  if TimeCount >= 1000 then begin
    Frames:= FrameCount;
    TimeCount:= TimeCount - 1000;
    FrameCount:= 0;
    Caption:= InttoStr(Frames) + 'FPS';
  end;

  Done:= false;
end;

procedure TForm1.Render;
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  SetupGL;

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;

  glTranslatef(0, 0, -3);

  FDeltaTime := getTickCount - FLastDeltaTime;
  FLastDeltaTime := getTickCount;

  FEffectManager.Update(FDeltaTime);
  FEffectManager.Render();

  SwapBuffers(DC);
end;

procedure TForm1.SetupContext;
var
  Appearance: TFB_AppearanceModel;
begin
  Appearance := TFB_AppearanceModel.Create();
  with Appearance do
  begin
    AddHook(0);   SetSize(0.25, 0.25); SetTexture(4); SetColor(0.8, 0.9, 1, 0);
    AddHook(0.1); SetColor(0.8, 0.9, 1, 0.7);
    AddHook(0.5);
    AddHook(1);   SetColor(0.8, 0.9, 1, 0);
  end;
  FTrash := TList.Create();
  FTrash.Add(Appearance);

  FContext := TFB_Context.Create();
  with FContext do
  begin
    AddTexture(FTexture, 2, 4);
    BindTexture(0);
    SetPhysicsModel(FB_PHYSICSMODEL_SIMPLE);
    SetVertexStorage(FB_VERTEXSTORAGE_VA);
    PreallocateMemory(150);
    pp_Mass(0.4);
    pp_Force(0, -3*0.4, 0);
    pp_AppearanceModel(Appearance);
  end;
  FEmitter := TFBU_SphereEmitter.Create();
  with FEmitter do
  begin
    Context := FContext;
    InnerRadius := 0.05;
    OuterRadius := 0.05;
    VelocityMode := FB_VELOCITYMODE_ORIENTATION;
    SetVelocityOrientation(0, 0, 0);
    VelocityMagnitude := 1;
    ParticleCount := 150;
    MinLifeSpan := 0.3;
    MaxLifeSpan := 0.7;
    FillDelay   := 0.7;
    AddRenderpass(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    AddRenderpass(GL_SRC_ALPHA, GL_ONE);
  end;
  FEffectManager := TFBU_EffectManager.Create();
  FEffectManager.UpdateDelay := 1/60;
  FEffectManager.Add(FEmitter);
end;

procedure TForm1.SetupGL;
begin
  glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe: Hier ein leichtes Blau
  gluPerspective(75, Width/Height, NearClipping, FarClipping);
  glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren
end;

end.


Ich bedanke mich jetzt schonmal bei jedem der sich die Mühe gemacht hat mein Problem bis hier unten durchzuleden :D
und hoffe das mir jemand helfen kann

... MfG Mikescher

_________________
This is Schäuble. Copy Schäuble into your signature to help him on his way to Überwachungsstaat.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Nov 15, 2010 01:18 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
Ich glaube du hast dich beim Setup der Projection Matrix vertan:
Code:
glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  SetupGL;

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;

procedure TForm1.SetupGL;
begin
  glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe: Hier ein leichtes Blau
  gluPerspective(75, Width/Height, NearClipping, FarClipping);
  glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren
end;



Bist du sicher, dass dein Viewport anfangs gesetzt wird? Denn einerseits passiert das nur in OnResize und andererseits wendest du den Befehl auf die Modelview Matrix an...
um sicher zu gehen solltest du das vielleicht mal so ausprobieren:

Code:
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe: Hier ein leichtes Blau

glMatrixMode(GL_PROJECTION);
  SetupGL;
glMatrixMode(GL_MODELVIEW);

glLoadIdentity;
glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren

procedure TForm1.SetupGL;
begin
  glLoadIdentity();
  glViewport(0, 0, ClientWidth, ClientHeight);
  gluPerspective(75, Width/Height, NearClipping, FarClipping);
end;



Soweit ich das sehe sollte der Emitter vom Setting her funktionieren.

MfG

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Nov 15, 2010 14:49 
Offline
DGL Member
Benutzeravatar

Registriert: So Nov 07, 2010 14:08
Beiträge: 11
Programmiersprache: Delphi
Hallo Kyro,
erst mal Danke dass du dir um 2 Uhr Nachts :shock: Zeit für mich genommen hast.

Ich habe was du gesagt hast korrigiert und meine proceduren Render / SetupGL sehen jetzt so aus:
Code:
procedure TForm1.Render;
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe: Hier ein leichtes Blau

  glMatrixMode(GL_PROJECTION);
    SetupGL;
  glMatrixMode(GL_MODELVIEW);

  glLoadIdentity;
  glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren

  glTranslatef(0, 0, -3);

  FDeltaTime := getTickCount - FLastDeltaTime;
  FLastDeltaTime := getTickCount;

  FEffectManager.Update(FDeltaTime);
  FEffectManager.Render();

  SwapBuffers(DC);
end;

procedure TForm1.SetupGL;
begin
  glLoadIdentity();
  glViewport(0, 0, ClientWidth, ClientHeight);
  gluPerspective(75, Width/Height, NearClipping, FarClipping);
end;


Jedoch bleibt der gewünschte Effekt aus :( .

Ich (als unwissender Anfänger :) ) kann mir eigentlich nur aus 2 Gründen vorstellen dass es nicht geht da ich eigentlich den Code 1:1 aus deinem tut_basic genommen habe:

1. liegt es daran dass ich Delphi 2010 hab (mit dieser neuen Unicode-Unterstützung) und deshalb irgendwas rumspinnt.

oder 2. es liegt an FDeltaTime, du berechnest es mit dem SDL-Ereignis WindowUpdate dass dir den Wert gleich gibt. In der Documentation steht jedoch für
Zitat:
ADeltaTime
The time since the last call

Und das wird bei mir ja auch so übergeben (ich habe es auch schon mit einem konstanten Wert versucht - gleiches Ergebnis).

Ich hoffe dass du eine Idee hast was ich falsch mache da ich mich eigentlich schon darauf gefreut habe deine echt tolle Engine (nach de was ich gehört habe) zu benutzen

... Mit freundlichen Grüßen Mike

PS: Falls es etwas hilft ein normales Quad wie
Code:
  glBegin(GL_QUADS);
    glVertex3f(0, 0, 0);
    glVertex3f(1, 0, 0);
    glVertex3f(1, 1, 0);
    glVertex3f(0, 1, 0);
  glEnd;

das ich in die Render Prozedur schreibe wird angezeigt.

_________________
This is Schäuble. Copy Schäuble into your signature to help him on his way to Überwachungsstaat.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Nov 15, 2010 18:51 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Was mir zu deinem Code so auffällt:

SetupGL wird ständig gerufen. Die Perspektive muss aber nicht bei jedem Draw neu gesetzt werden, wenn du die zwischendurch nicht verändert hast. Die Perspektive muss nur einmal am Anfang und im onResize gesetzt werden. Im Form Resize verwendest du nebenbei andere Parameter für die Perspektive als im SetupGL.

Versuch mal noch etwas weiter aus der Szene heraus zu gehen. Vielleicht ist der Emitter irgendwo abseits der Kamera.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Nov 15, 2010 19:50 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
Tja die Uni erfordert schonmal Nachtschichten xD

Aber jetzt wo du es sagst...
so wie ich das sehe, nimmst du die Ticks direkt als DeltaTime, also in Millisekunden. FB erwartet die Zeit in Sekunden (übrigens nen guter Hinweis für die Doku).

Bei einer maximalen Lebensdauer der Partikel von 0.7sec würde das bedeuten, dass ein Partikel quasi stirbt bevor es überhaupt gelebt hat ;)
Überprüf mal den ParticleCount im Context via TFB_Context.ParticleCount. Wenn da 0 bei rauskommt kannst du auch nichts sehen ;)

MfG

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Nov 15, 2010 20:58 
Offline
DGL Member
Benutzeravatar

Registriert: So Nov 07, 2010 14:08
Beiträge: 11
Programmiersprache: Delphi
Halleluja :mrgreen: ,

das war das Problem schreibe ich
Code:
  FEffectManager.Update(FDeltaTime / 1000);

funktioniert alles tadelos, Danke dann kann ich ja jetzt ans coden gehen :D .

Mit viel Dank ... Mikescher

@Flash: Jetzt wo dus sagst, stimmt eigentlich, auch dir danke ich habs verbessert

_________________
This is Schäuble. Copy Schäuble into your signature to help him on his way to Überwachungsstaat.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]