Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   Lazarus + OpenGL: LCL statt GLUT (https://www.delphipraxis.net/148006-lazarus-opengl-lcl-statt-glut.html)

Jakob Ullmann 20. Feb 2010 14:00


Lazarus + OpenGL: LCL statt GLUT
 
Hallo!

Ich wollte nochmal versuchen, OpenGL zu lernen. Allerdings läuft bei mir keine meiner Delphi's mehr, weshalb ich auf Lazarus angewiesen bin. Ich habe also mal "opengl lazarus" gegooglet und bin hier gelandet: http://wiki.lazarus.freepascal.org/OpenGL_Tutorial

Scheint ja ganz nett zu sein, aber leider wird da nur der Einsatz von OpenGL mit GLUT erläutert. Ich würde mein Programm aber lieber auf der LCL aufsetzen. Wie muss nun die OpenGL-Initialization für die LCL aussehen? Die Tutorials auf DelphiGL.com habe ich mir angeschaut, aber die scheinen ja ausschließlich auf Delphi orientiert zu sein und nutzen ja scheinbar auch alle GLUT aufzubauen, wenn die Funktion gluPerspective aufgerufen wird, oder nicht? Das Präfix "glu" steht doch soweit ich weiß für "GLUT"...

Mithrandir 20. Feb 2010 14:35

Re: Lazarus + OpenGL: LCL statt GLUT
 
Hast du dir das LCL-Beispiel ".../lazarus/examples/openglcontrol/openglcontrol_demo.lpi" schon angesehen?

Jakob Ullmann 21. Feb 2010 16:47

Re: Lazarus + OpenGL: LCL statt GLUT
 
Wollte ich gerade (also habe ich noch nicht, habe den Hinweis auf der FPC/L/OpenGL(de)-Wiki-Seite irgendwie übersehen). Ich habe deshalb erstmal das TOpenGLContext installiert. Das war erstmal ungewohnt, dass sich die IDE selbst neu compilieren wollte (habe ich noch nicht verstanden, warum das von technischer Seite nicht so einfach wie bei Delphi gehen soll, und dann dauert das auch noch fast eine halbe Minute). Beim Start kommt eine AccessViolation von startlazarus. Press OK to risk data corruption, press Cancel to kill the program. Ich drücke Cancel und starte die IDE neu. Geht ohne Mängel und ich sehe in der Kompo-Palette den neuen Eintrag OpenGL, aber ich hoffe mal dass ich nichts kaputt gemacht habe...

Dann habe ich die lpi-Datei geöffnet (als neues Projekt), aber irgendwie sehe ich die Unit, aber keine Formulare. Der Code hat aber scheinbar Formularelemente, von denen er "ausgeht". Auch bei Ansicht->Formulare kommt kein Eintrag.

Wie komme ich an die Formulardatei? Oder gibt es da tatsächlich keine?

Corpsman 21. Feb 2010 17:36

Re: Lazarus + OpenGL: LCL statt GLUT
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Morgen,

Also ich nutze die DGLOpenGL.pas in Zusammenhang mit der OpenGLControl Kompenente, aber auch OSMesa oder SDL funktioniert wunderbar ( allerdings kann ich nur für Linux FPC 2.4.0 und Lazarus aus der SVN Version sprechen)

Anbei hab ich dir mal meine "Basic" Demo für DGLOpenGL.pas und OpenGLControl mit hoch geladen, diese müsste auch unter Windows funktionieren.

Wenn dich die anderen auch Interessieren melde dich.

JamesTKirk 22. Feb 2010 10:46

Re: Lazarus + OpenGL: LCL statt GLUT
 
[OT]
Zitat:

Zitat von Jakob Ullmann
Das war erstmal ungewohnt, dass sich die IDE selbst neu compilieren wollte (habe ich noch nicht verstanden, warum das von technischer Seite nicht so einfach wie bei Delphi gehen soll, und dann dauert das auch noch fast eine halbe Minute).

Das liegt daran, dass Free Pascal noch kein Package Konzept hat wie es Delphi existiert. Alle Komponenten werden statisch in die IDE hinein gelinkt. Dieses Packages Konzept hat bisher keine Priorität bei den Entwicklern und zudem muss das technisch so umgesetzt werden, dass es zumindest auf den drei großen Plattformen Windows, Linux und Mac OS X funktioniert (es ist also vergleichsweise kompliziert).

Zu der Kompilierzeit: Lazarus ist halt doch ein ganz schöner Brocken zum Kompilieren. Wobei es jetzt (nach dem ersten Kompilieren) schneller gehen müsste, da alle IDE Units einmal durchkompiliert wurden (und somit als Binärcode vorliegen) und "nur" noch das neue Package kompiliert und die IDE gelinkt werden muss.

Ich hoffe es ist jetzt etwas klarer. :)

Gruß,
Sven
[/OT]

Jakob Ullmann 23. Feb 2010 17:14

Re: Lazarus + OpenGL: LCL statt GLUT
 
Ja, das ist klar.

Ich hatte mich gerade mal hingesetzt und wollte mein erstes OpenGL Programm kompilieren. Nun denn, ich ziehe ein TOpenGLControl auf das Formular und schreibe folgenden Code:

Delphi-Quellcode:
unit unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  OpenGLContext, GL, GLU;

type

  { TForm1 }

  TForm1 = class(TForm)
    OpenGLControl1: TOpenGLControl;
    procedure OpenGLControl1Paint(Sender: TObject);
    procedure OpenGLControl1Resize(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{ TForm1 }

procedure TForm1.OpenGLControl1Paint(Sender: TObject);
begin
  glClearColor(1.0, 1.0, 1.0, 1.0);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glEnable(GL_DEPTH_TEST);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();

  gluPerspective(60, Double(OpenGLControl1.Width) / OpenGLControl1.Height, 0.1, 100.0);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

  glBegin(GL_TRIANGLES);
    glColor3f(1, 0, 0); glVertex3f(0, 1, 0);
    glColor3f(0, 1, 0); glVertex3f(-1, 0, 0);
    glColor3f(0, 0, 1); glVertex3f(1, 0, 0);
  glEnd();

  OpenGLControl1.SwapBuffers;
end;

procedure TForm1.OpenGLControl1Resize(Sender: TObject);
begin

end;

initialization
  {$I unit1.lrs}

end.
Abspeichern, compilieren (F9). Und freuen dass ein schönes Dreieck erscheint? Nein, Lazarus schickt mir das tolle Assemblerfenster mit dem Titel "Assembler", was sich dann schließt, danach drücke ich auf das Viereck ("Halt"). Und es kommt die Meldung, die auch schon im Zusammenhang mit startlazarus aufgetreten ist: AccessViolation. Cancel und Lazarus verabschiedet sich (schließt sich). "Normale" Projekte (ohne das TOpenGLControl) kann ich ganz normal compilieren. Woran könnte das liegen?

Hat jemand eine Idee?

EDIT: Da fällt mir ein, diese lustigen Assemblerfenster kenne ich. Und zwar habe ich schonmal mit einem StringGrid gespielt, bzw. dessen OnDrawCell-Event. Allerdings kam das da erst nach dem Schließen.

Jakob Ullmann 24. Feb 2010 16:25

Re: Lazarus + OpenGL: LCL statt GLUT
 
Ich habe mal nach TOpenGLControl gegooglet und bin auch einmal im DGL-Forum gelandet. Dort wurde geschrieben, dass man die Komponente selbst dynamisch erstellen muss, weil irgendwie die LFM-Implementierung nicht ganz klappt (oder so). Also habe ich den Code entsprechend angepasst, sieht jetzt so aus:

Delphi-Quellcode:
unit unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  OpenGLContext, GL, GLU;

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure OpenGLControl1Paint(Sender: TObject);
    procedure OpenGLControl1Resize(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
    OpenGLControl1: TOpenGLControl;
  end;

var
  Form1: TForm1;

implementation

{ TForm1 }

procedure TForm1.OpenGLControl1Paint(Sender: TObject);
begin
  glClearColor(1.0, 1.0, 1.0, 1.0);

  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glEnable(GL_DEPTH_TEST);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();

  gluPerspective(60, Double(OpenGLControl1.Width) / OpenGLControl1.Height, 0.1, 100.0);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

  glBegin(GL_TRIANGLES);
    glColor3f(1, 0, 0); glVertex3f(0, 1, 0);
    glColor3f(0, 1, 0); glVertex3f(-1, 0, 0);
    glColor3f(0, 0, 1); glVertex3f(1, 0, 0);
  glEnd();

  OpenGLControl1.SwapBuffers;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

  OpenGLControl1:=TOpenGLControl.Create(Self);
  with OpenGLControl1 do begin
    Name:='OpenGLControl1';
    Align:=alClient;
    Parent:=Self;
    OnPaint:=@OpenGLControl1Paint;
    OnResize:=@OpenGLControl1Resize;
    AutoResizeViewport:=true;
  end;
end;

procedure TForm1.OpenGLControl1Resize(Sender: TObject);
begin

end;

initialization
  {$I unit1.lrs}

end.
Jetzt kommt beim Start eine Exception "Project raised exception", daraufhin das allseits gehasste Assemblerfenster, wo nach allen Adressen "?????" steht. Naja, ich drücke wieder "Halt" (das Rechteck in der Toolbar), aber wenigstens wird dann die Ausführung beendet und Lazarus killt sich nicht selbst.

Jakob Ullmann 1. Mär 2010 14:31

Re: Lazarus + OpenGL: LCL statt GLUT
 
Hat denn wirklich keiner eine Idee?

implementation 7. Apr 2012 13:07

AW: Lazarus + OpenGL: LCL statt GLUT
 
Spät, aber besser als nie (für die Nachwelt)

Bei mir funktioniert der Code, wenn ich GLU aus den Uses streiche und gluPerspective rausnehme ;)


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