![]() |
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: ![]() 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"... |
Re: Lazarus + OpenGL: LCL statt GLUT
Hast du dir das LCL-Beispiel ".../lazarus/examples/openglcontrol/openglcontrol_demo.lpi" schon angesehen?
|
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? |
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. |
Re: Lazarus + OpenGL: LCL statt GLUT
[OT]
Zitat:
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] |
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:
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?
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. 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. |
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:
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.
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. |
Re: Lazarus + OpenGL: LCL statt GLUT
Hat denn wirklich keiner eine Idee?
|
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 01:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz