Zu blöd für OpenGL??

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
keypressed
Beiträge: 2
Registriert: Mi 18. Feb 2009, 00:48

Zu blöd für OpenGL??

Beitrag von keypressed »

Hallo!

Ich will gerne in die Programmierung von OpenGL einsteigen. Eigentlich will ich das mit Freepascal tun, oder eventuell aber mit Unterstützung der Lazarus-IDE... Wie ich zum (ersten) Ziel komme (Grafiken im Vollbild anzeigen lassen), ist mir eigentlich egal...

Eigentlich hab ich bis jetzt aber immer eher in Standard-Pascal programmiert, und zwar nicht allzu aufwändiges Zeugs. Auf diesen Kenntnissen würde ich gerne aufbauen, um unter Windows Grafiken und 3D-Geschichten darzustellen, die über die Fähigkeiten von Graph.TPU hinausgehen. :D

Dazu habe ich im Internet nach Tutorials gesucht, und bin auf die Seite
http://www.friends-of-fpc.org/" onclick="window.open(this.href);return false;
gestoßen.

Und hierbei auf das Tutorial, von dem die englische Version empfohlen wird.
http://www.friends-of-fpc.org/tutorials ... index.html" onclick="window.open(this.href);return false;

Das Problem: Es wurde offenbar für eine 0.9.x-Version von Freepascal verfasst, und seitdem hat sich wohl einiges geändert! So bekomme ich das Beispielprogramm
http://www.friends-of-fpc.org/tutorials ... ource01.pp" onclick="window.open(this.href);return false;

unter Freepascal nicht zum Laufen. Herausgefunden habe ich, dass es den Typ MSG nicht mehr gibt und dass dieser durch TMSG zu ersetzen ist. Das andere Problem ist der Abschnitt

Code: Alles auswählen

hWindow := CreateWindow('GLWindow',
			  pcApplicationName,
			  WS_CAPTION OR WS_POPUPWINDOW OR WS_VISIBLE OR WS_CLIPSIBLINGS OR WS_CLIPCHILDREN,
			  cw_UseDefault,
			  cw_UseDefault,
			  width,
			  height,
			  0, 0,
			  system.MainInstance,
			  nil);
mit der Zeile WS_CAPTION... (128): Range check error while evaluating constants

Das Programm soll nichts weiter tun als ein OpenGL-Fenster zu initialisieren.

Gefunden habe ich im Freepascal-Forum dann diesen Thread:
http://community.freepascal.org:10000/b ... _id=245237" onclick="window.open(this.href);return false;

Der beschreibt genau mein Problem, aber bietet mir - abgesehen von MSG->TMSG - keine funktionierende Lösung. Getestet habe ich zuerst den dort gemachten Vorschlag, die API-Funktion umzubauen:

Code: Alles auswählen

{$ifdef win32}
function SetWindowLong(hWnd:HWND; nIndex:longint; dwNewLong:cardinal):cardinal; stdcall; external 'user32' name 'SetWindowLongA';
{$endif}
Das hat leider nichts genützt. Ohnehin finde ich die Zeile merkwürdig, weil diese Funktionsdefinition ja nicht wirklich schöner Pascal-Code ist... EXTERNAL und NAME sind nach meinem Verständnis Schlüsselwörter, wie z.B. PROGRAM Hallo; wobei diese nackten Strings ja total unmöglich sind... :shock:

Dann hab ich noch mir von Lazarus die CreateWindow-Funktionsdefinition suchen und anzeigen lassen, und alle DWords durch Long ersetzt wie in dem Thread empfohlen. Leider ebenfalls ohne Erfolg.


Was kann ich da noch tun? Ich hab von dieser ganzen Freepascal-WinAPI-Schnittstelle kaum Ahnung! :oops:

Ziel ist, irgendwie ein OpenGL-Fenster zu erzeugen.


Interessant war übrigdens auch dass es Lazarus am Ende geschafft hat, das Ding irgendwie zu compilieren. Wo Freepascal "Fehler" gemeldet hat, kam bei Lazarus nur Warning. Allerdings ließ sich das Programm nicht direkt aus Lazarus heraus starten. Da lief zwar irgendwas, aber angezeigt wurde nix! Irgendwann geht dann Lazarus in einen Endlos-Debugger-Modus, und wenn man den über "Debugger zurücksetzen" abbrechen will verreckt die komplette Entwicklungsumgebung. :roll:

Die compilierte EXE scheint aber zu laufen. Aber es ist auf die Dauer kein Zustand, nur mit einem instabilen Lazarus und vielen Compiler-Warnungen mit OpenGL anzufangen. Wundern tut mich aber trotzdem, dass sich Lazarus hier so anders verhält als Freepascal! Ist da irgendein fehlertoleranterer Compiler-Switch standardmäßig gesetzt?

Benutzeravatar
theo
Beiträge: 10950
Registriert: Mo 11. Sep 2006, 19:01

Re: Zu blöd für OpenGL??

Beitrag von theo »

Das Beispiel in <lazarusdir>/examples/openglcontrol hast du angeschaut?

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Zu blöd für OpenGL??

Beitrag von mschnell »

Du kannst auch sdl verwenden. Bei Delphi, Free Pascal, Lazarus und MSEGUI kann JediSDL passende Komponenten zur Verfügung stellen. Damit hast Du u.U. viel weniger Programmier-Arbeit als wenn Du direkt OpenGL ansprichst.

SDL kann dazu konfiguriert werden, OpenGL (anstelle eines anderen OS-Interfaces wie z.B. Direct-X) zu verwenden.

Soweit ich weiß, gibt es aber auch andere Libraries, die die Verwendung von OpenGL in Opject-Pascal erleichtern

Gruß,
-Michael

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Zu blöd für OpenGL??

Beitrag von pluto »

Eine davon ist Andorra. Allerdings meines Wissens nur für 2D. Mit Andorra kannst du für OpenGL, (DirectX) und (SDL) Programme schreiben.
Hier gibt es Tutorials:
http://andorra.sourceforge.net/index.ph ... =tutorials" onclick="window.open(this.href);return false;

Ich selbst habe einige Versuche unternommen. Die Engine macht einen guten Eindruck. Sie ist DelphiX nach empfunden. Kann allerdings wesentlich mehr. Für Lazarus musst du Andorra selbst Kompilieren. Es gibt noch keine Komponenten, sondern einfach nur Klassen.
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Zu blöd für OpenGL??

Beitrag von Christian »

Andorra ist ne 2D Engine, glaub kaum das ihm das was nützt.
Du kannst ein Fenster auch mithilfe der GLUT erstellen ist glaub ich der einfachste weg.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Zu blöd für OpenGL??

Beitrag von pluto »

Ja, Andorra ist eine 2D Engine genau. Aber man kann sie Problemlos in ein LCL Fenster einbinden. Sie läuft sogar unter Delphi.

Auf der seite gibt es auch Tutorials. Ließ sie mal, dann weißt du mehr. Es gibt auch eine GUI. Sie ist zwar noch im Anfang Stadium, aber einige Grund Komponenten gibt es bereits schon. Natürlich kann man das Fenster auch per API erzeugen, aber warum es schwere machen als es ist ? Ich meine auch sie unterstützt bedingt 3D, aber primär ist es eine 2D Engine.
MFG
Michael Springwald

mollilinux

Re: Zu blöd für OpenGL??

Beitrag von mollilinux »

Ich kenne da auch noch ne engine... Irrlicht, eine 3D Engine (OpenGL). War sehr lange nur mit C++ kompatiebel, funktioniert aber seit geraumer Zeit auch mit Delphi. Ich denke, dass die Engine auch gut unter Lazarus läuft und sie ist OpenSource. Du kannst mit Irrlicht auch Quake 3 Levels einbinden. Die 3D Räume könntest du mit Blender, anim8or (Nur Windows), GTK Radiant konstruieren. Mit Windows könntest du für die Texturen Irredit anwenden.

Schau mal vorbei unter

http://irrlicht.sourceforge.net

Bin noch auf diesen Artikel gestossen, könnte eventuell helfen...

http://irrlicht.sourceforge.net/phpBB2/ ... hp?t=10511

Grüsse mollilinux

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Zu blöd für OpenGL??

Beitrag von Christian »

GLScene ist in Delphi geschrieben und unterstützt auch Quake Levels/Editoren und ist sogar im Designer benutzbar um n leven/Umgebung zu designen. Ist dann wohl das naheliegenste wenn er ne Engine sucht.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

keypressed
Beiträge: 2
Registriert: Mi 18. Feb 2009, 00:48

Re: Zu blöd für OpenGL??

Beitrag von keypressed »

So, habe jetzt einige OpenGL-Programme unter Freepascal zum Laufen gebracht, die auf Jedi-sdl aufbauen! *freu*


Weil es ewig gedauert hat, hier nun noch einmal die Lösung für das Überwinden der Hürden, falls jemand vor einem ähnlichen Problem steht, mit primitivem FreePascal OpenGL- und sonstigen Multimediakram auf den Bildschirm zu bringen. :D

1. Download der benötigten Dateien

Man braucht natürlich einen gescheit installierten Freepascal-Compiler für Windows, sowie grundsätzlich zwei Dinge:

1. Die Units von JEDI-SDL, welche die Funktionen von
2. den Bibliotheken des Simple Direct Media Layer (.dll-Dateien) einbinden.

Die Pascal-Units "JEDI-SDL" gibt es hier:
http://jedi-sdl.pascalgamedevelopment.com/" onclick="window.open(this.href);return false;

Und die .dll-Dateien gibt es hier:
http://www.libsdl.org/" onclick="window.open(this.href);return false;

(Auf den Trichter bin ich auch erst spät gekommen, weil ich dachte, dass die SDL-Units direkt die OpenGL/DirectX-Funktionen ansprechen... :oops: )


2. Installation der SDL-Bibliotheken
Die .dll-Dateien müssen für das Pascal-Programm bzw. Freepascal verfügbar gemacht werden, indem man sie entweder in den Projektordner kopiert, in dem die compilierte EXE landet, oder man sie ins System32-Verzecinis kopiert.

Die meisten Beispiel-Programme benötigen zumeist mindestens die sdl.dll. Und eventuell weitere .dll-Dateien, wenn besondere Funktionen benötigt werden, die diese bereit stellen.

3. Installation der Units
Die JEDI-SDL-Units lassen sich beim Installer-Paket in irgendein Verzeichnis auf der Platte kopieren. Dieses muß Freepascal kennen. Dazu wird die fpc.cfg im BIN-Ordner von Frepascal geöffnet. Der JEDI-SDL-Installer hat hier im Idealfall schon einige Zeilen eingetragen wie

Code: Alles auswählen

-Fi<jedi-sdl-path>/JEDI-SDLv1.0/SDL/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/SDL/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/SDL_Mixer/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/SDL_Image/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/SDL_Net/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/SDL_ttf/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/smpeg/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/SFont/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/SDL_Sound/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/SDLMonoFonts/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/SDLSpriteEngine/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/Cal3D/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/ODE/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/SDLCtrls/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/SDL_flic/Pas
(oft ganz unten in der Datei)

Wenn man in das JEDI-SDL-Verzeichnis wechselt, wird einem klar, dass (JEDI-)SDL aus mehreren Teilen besteht. Diese werden vom Installer nach Unterverzeichnissen gegliedert. In jedem dieser Unterverzeichnisse gibt es ein Verzeichnis \Pas, welches die zugehörige Unit enthält und dem Compiler mitgeteilt werden muß. Das geschieht über die beschriebenen Einträge in der fpc.cfg.

Das hat der Installer bei mir offenbar NUR TEILWEISE erledigt. Ich mußte genau schauen, was noch nicht drinstand, und es per Hand nachtragen... :? Die obigen Zeilen habe ich aus einem Thread im Freepascal-Forum kopiert. Inzwischen hat sich offenbar auch die JEDI-SDL-Verzeichnisstruktur leicht geändert.

Bei mir sieht der Abschnitt wie folgt aus, ich habe JEDi-SDL direkt im FPC-Verueichnis installiert:

Code: Alles auswählen

# JEDI-SDL include paths
-FiC:\FPC\JEDI-SDL Full\SDL\Pas
 
# JEDI-SDL unit paths
-FuC:\FPC\JEDI-SDL Full\SDL\Pas
-FuC:\FPC\JEDI-SDL Full\SDL_Image\Pas
-FuC:\FPC\JEDI-SDL Full\SDL_Mixer\Pas
-FuC:\FPC\JEDI-SDL Full\SDL_Net\Pas
-FuC:\FPC\JEDI-SDL Full\SDL_ttf\Pas
-FuC:\FPC\JEDI-SDL Full\smpeg\Pas
-FuC:\FPC\JEDI-SDL Full\OpenGL\Pas
-FuC:\FPC\JEDI-SDL Full\ODE\Pas
-FuC:\FPC\JEDI-SDL Full\Newton\Pas
-FuC:\FPC\JEDI-SDL Full\HawkVoice\Pas
-FuC:\FPC\JEDI-SDL Full\Fmod\Pas
-FuC:\FPC\JEDI-SDL Full\Cal3D\Pas
-FuC:\FPC\JEDI-SDL Full\SDL_Sound\Pas
-FuC:\FPC\JEDI-SDL Full\SDL_flic\Pas
-FuC:\FPC\JEDI-SDL Full\SDLFilter\Pas
-FuC:\FPC\JEDI-SDL Full\SDLCtrls\Pas
Nach längerem herumprobieren habe ich dann herausgefunden, dass diese Zeilen offenbar nur vom Kommandozeilencompiler ausgewertet werden, aber nicht von der Entwicklungsumgebung FPC.EXE! Hier muß man sämtliche JEDI-SDL-Verzeichnisse dann noch einmal PER HAND nachtragen, da die Entwicklungsumgebung nicht mit der Windows-Zwischenablage kommuniziert. Dazu ruft man im Menü "Options" den Punkt "Directories" auf. Unter "Units" werden dann sämtliche \Pas-Unterverzeichnisse der JEDI-SDL-Installation eingetragen. Unter "Include Files" sollte normalerweise das \SDL\Pas-Verzeichnis reichen. Anschließend evtl. sicherheitshalber Options ->Save anklicken.

Einfacher geht es evtl, wenn man mit der Windows-Suchfunktion den JEDI-SDL-Ordner nach *.ppu; *.o; *.pas; *.inc durchsucht und alles außer Menu.pas in ein leicht zugängliches Extra-Verzeichnis verschiebt, welches man dann angibt....

4. Start von Beispielprogrammen
Wenn alles richtig installiert wurde, müßten sich nun Demoprogramme starten lassen. 8)
Da JEDi-SDL für Delphi geschrieben wurde, finden sich die Quellcodes in *.dpr-Dateien. Es gibt auch einige Beispiele, die wohl nur unter Delphi, nicht aber unter Freepascal funktionieren (z.B. solche mit Main-Unit...).

Aber: In der Version 1.0 RC2 von Jedi-SDL gibt es unter \Demos\3D\NeHe ein nettes OpenGL-Tutorial, welches auch unter Freepascal läuft. :mrgreen:
Erklärungen gibt es hier:
http://nehe.gamedev.net/" onclick="window.open(this.href);return false;

Ab Beispiel 6 des NeHe-Tutorials werden allerdings Texturen aus einem Unterordner geladen. Damit dies auf Anhieb funktioniert, sollte vor dem Start unter "File", "Change Dir..." dann das Verzeichnis des jeweiligen Beispiels gewählt werden. Ansonsten gibt es einen ExitCode 217, da die Texturdatei nicht gefunden wurde. :roll:

5. Mögliche Probleme mit Beispielen
Sollte man bei Beispielprogrammen ExitCode 309 begegnen und nichts angezeigt werden, heißt das, dass eine .DLL -Datei (wie SDL.DLL) nicht gefunden und verwendet werden konnte. Hier heißt es zu schauen, ob Bibliotheken wie die SDL.DLL für Freepascal bzw. das Programm zugänglich sind, und ob das Programm eventuell eine oder mehrere weitere .DLL-Bibliotheken aus dem SDL-Projekt benötigt.
Exitcode 217: Irgendwas, was geladen werden sollte, wurde nicht gefunden, z.B. eine Textur. ->Verzeichnis auf Beispielcode umstellen, oder Textur umkopieren.

Soviel zu meinen Erlebnissen, vielleicht hilft es ja jemandem weiter...

Antworten