AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Lazarus + OpenGL: LCL statt GLUT

Ein Thema von Jakob Ullmann · begonnen am 20. Feb 2010 · letzter Beitrag vom 7. Apr 2012
Antwort Antwort
Benutzerbild von Jakob Ullmann
Jakob Ullmann

Registriert seit: 17. Feb 2007
218 Beiträge
 
Lazarus
 
#1

Lazarus + OpenGL: LCL statt GLUT

  Alt 20. Feb 2010, 14:00
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"...
Jakob
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Oldenburg (Oldb)
2.370 Beiträge
 
#2

Re: Lazarus + OpenGL: LCL statt GLUT

  Alt 20. Feb 2010, 14:35
Hast du dir das LCL-Beispiel ".../lazarus/examples/openglcontrol/openglcontrol_demo.lpi" schon angesehen?
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Benutzerbild von Jakob Ullmann
Jakob Ullmann

Registriert seit: 17. Feb 2007
218 Beiträge
 
Lazarus
 
#3

Re: Lazarus + OpenGL: LCL statt GLUT

  Alt 21. Feb 2010, 16:47
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?
Jakob
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
973 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Lazarus + OpenGL: LCL statt GLUT

  Alt 21. Feb 2010, 17:36
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.
Angehängte Dateien
Dateityp: zip sample_178.zip (3,8 KB, 24x aufgerufen)
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 3,9 mb ) aktuell ver 0.64
  Mit Zitat antworten Zitat
Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: Eberfing
582 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Lazarus + OpenGL: LCL statt GLUT

  Alt 22. Feb 2010, 10:46
[OT]
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]
Sven
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
Benutzerbild von Jakob Ullmann
Jakob Ullmann

Registriert seit: 17. Feb 2007
218 Beiträge
 
Lazarus
 
#6

Re: Lazarus + OpenGL: LCL statt GLUT

  Alt 23. Feb 2010, 17:14
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
  Mit Zitat antworten Zitat
Benutzerbild von Jakob Ullmann
Jakob Ullmann

Registriert seit: 17. Feb 2007
218 Beiträge
 
Lazarus
 
#7

Re: Lazarus + OpenGL: LCL statt GLUT

  Alt 24. Feb 2010, 16:25
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
  Mit Zitat antworten Zitat
Benutzerbild von Jakob Ullmann
Jakob Ullmann

Registriert seit: 17. Feb 2007
218 Beiträge
 
Lazarus
 
#8

Re: Lazarus + OpenGL: LCL statt GLUT

  Alt 1. Mär 2010, 14:31
Hat denn wirklich keiner eine Idee?
Jakob
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
908 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Lazarus + OpenGL: LCL statt GLUT

  Alt 7. Apr 2012, 13:07
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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2014 by Daniel R. Wolf