OpenGL Befehlsumfang
OpenGL Befehlsumfang
Ein freundliches Hallo an alle.
Da ich gerade mit Lazarus und OpenGL zu arbeiten beginne, habe ich eine Frage hinsichtlich OpenGL. Ich verwende - auf Grund der Vorgaben der Schule - die Version 1.0.14 von Lazarus und somit das Package 0.0.1 von LazOpenGLContext. Nun bin ich auf der Suche nach nach eine Übersicht der in den units GL, GLU, GLUT zur Verfügung stehenden Befehle und Klassen, Variablen, ... die verwendet werden können.
Da die meisten Publikationen C-basiert sind, kann ich diese noch nicht auf Pascal übertragen.
Wer kann hier helfen? Gibt es auch Literatur, die Pascal bezogen OpenGL erklärt? Wo finde ich gute Beispiele anhand derer man lernen kann.
Danke euch im Voraus
Andreas
Da ich gerade mit Lazarus und OpenGL zu arbeiten beginne, habe ich eine Frage hinsichtlich OpenGL. Ich verwende - auf Grund der Vorgaben der Schule - die Version 1.0.14 von Lazarus und somit das Package 0.0.1 von LazOpenGLContext. Nun bin ich auf der Suche nach nach eine Übersicht der in den units GL, GLU, GLUT zur Verfügung stehenden Befehle und Klassen, Variablen, ... die verwendet werden können.
Da die meisten Publikationen C-basiert sind, kann ich diese noch nicht auf Pascal übertragen.
Wer kann hier helfen? Gibt es auch Literatur, die Pascal bezogen OpenGL erklärt? Wo finde ich gute Beispiele anhand derer man lernen kann.
Danke euch im Voraus
Andreas
-
- Beiträge: 1908
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: OpenGL Befehlsumfang
wegnera hat geschrieben:Ein freundliches Hallo an alle.
Da ich gerade mit Lazarus und OpenGL zu arbeiten beginne, habe ich eine Frage hinsichtlich OpenGL. Ich verwende - auf Grund der Vorgaben der Schule - die Version 1.0.14 von Lazarus und somit das Package 0.0.1 von LazOpenGLContext. Nun bin ich auf der Suche nach nach eine Übersicht der in den units GL, GLU, GLUT zur Verfügung stehenden Befehle und Klassen, Variablen, ... die verwendet werden können.
Da die meisten Publikationen C-basiert sind, kann ich diese noch nicht auf Pascal übertragen.
Wer kann hier helfen? Gibt es auch Literatur, die Pascal bezogen OpenGL erklärt? Wo finde ich gute Beispiele anhand derer man lernen kann.
Danke euch im Voraus
Andreas
Alles wissenswerte findest du soweit auf DelphiGL. War (oder ist eventuell noch) die größte deutschsprachige OpenGL Community. Ansonsten kannst du jeden C Code 1 zu 1 in Pascal übersetzen, da die Nomenklatur relativ identisch ist (eventuell kommt vor den Typnamen noch ein T, da bin ich mir grade nicht so sicher). Ich habe komplette C Routinen schon übernommen indem ich nur die Syntax angepasst haben. Beispiel:
C:
Code: Alles auswählen
void
TexFunc(void)
{
glEnable(GL_TEXTURE_2D);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
#if GL_EXT_abgr
glTexImage2D(GL_TEXTURE_2D, 0, 3, 128, 128, 0, GL_ABGR_EXT,
GL_UNSIGNED_BYTE, ubImage);
glBegin(GL_POLYGON);
glTexCoord2f(1.0, 1.0);
glVertex3f(-0.2, 0.8, -100.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(-0.8, 0.8, -2.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(-0.8, 0.2, -2.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(-0.2, 0.2, -100.0);
glEnd();
#endif
glTexImage2D(GL_TEXTURE_2D, 0, 3, 128, 128, 0, GL_RGBA,
GL_UNSIGNED_BYTE, ubImage);
glBegin(GL_POLYGON);
glTexCoord2f(1.0, 1.0);
glVertex3f(0.8, 0.8, -2.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(0.2, 0.8, -100.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(0.2, 0.2, -100.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(0.8, 0.2, -2.0);
glEnd();
glDisable(GL_TEXTURE_2D);
}
Pascal:
Code: Alles auswählen
procedure TexFunc;
begin
glEnable(GL_TEXTURE_2D);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
{$IfDef GL_EXT_abgr}
glTexImage2D(GL_TEXTURE_2D, 0, 3, 128, 128, 0, GL_ABGR_EXT,
GL_UNSIGNED_BYTE, ubImage);
glBegin(GL_POLYGON);
glTexCoord2f(1.0, 1.0);
glVertex3f(-0.2, 0.8, -100.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(-0.8, 0.8, -2.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(-0.8, 0.2, -2.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(-0.2, 0.2, -100.0);
glEnd();
{$EndIf}
glTexImage2D(GL_TEXTURE_2D, 0, 3, 128, 128, 0, GL_RGBA,
GL_UNSIGNED_BYTE, ubImage);
glBegin(GL_POLYGON);
glTexCoord2f(1.0, 1.0);
glVertex3f(0.8, 0.8, -2.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(0.2, 0.8, -100.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(0.2, 0.2, -100.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(0.8, 0.2, -2.0);
glEnd();
glDisable(GL_TEXTURE_2D);
end;
Funktioniert super und ich musste nur 2 Sachen anpassen
Re: OpenGL Befehlsumfang
Danke für die schnelle Antwort, werde ich mal durchforsten. Woran sehe ich um welche OpenGL Implementierung es sich in Lazarus handelt. Version 2.1?
-
- Beiträge: 1908
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: OpenGL Befehlsumfang
Du solltest den DGL Header verwenden, dieser ist auf der aktuellen version (4.5), und ist die sicherste Variante für maximale Performance und Kompatibilität. Einfach die .pas Datei runterladen, in dein Projektverzeichnis legen, zum Projekt hinzufügen und dglopengl in die Uses einfügen.
Re: OpenGL Befehlsumfang
danke für den Hinweis, muss nur nor auf die Freischaltung meines Accounts warten
Re: OpenGL Befehlsumfang
Habe mir von der DelphiGL-Community aus dem File-Bereich das SDK mit der dlgOpenGL.pas heruntergeladen und in mein Projektverzeichnis kopiert. Danach über den Projektinspektor die pas - Datei mit hinzugefügt und über uses eingebunden:
uses
gl, glu, glut, dglOpenGL;
Wenn ich jetzt kompiliere bekomme ich "Projekt simpleshape2 hat Exception-Klasse >>>External: SIGSEGV<< ausgelöst. Wenn ich dglOpenGL rausnehme funktioniert das Programm wieder korrekt. Was mache ich noch falsch?
uses
gl, glu, glut, dglOpenGL;
Wenn ich jetzt kompiliere bekomme ich "Projekt simpleshape2 hat Exception-Klasse >>>External: SIGSEGV<< ausgelöst. Wenn ich dglOpenGL rausnehme funktioniert das Programm wieder korrekt. Was mache ich noch falsch?
Code: Alles auswählen
program simpleshape2;
{$mode objfpc}{$H+}
uses
//gl, glu, glut;
gl, glu, glut, dglOpenGL;
const
AppWidth = 640;
AppHeight = 480;
procedure InitializeGL;
begin
glClearColor(0.18, 0.20, 0.66, 0);
end;
procedure DrawGLScene; cdecl;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glLoadIdentity;
glTranslatef(0, 0, -5);
glBegin(GL_TRIANGLES);
glColor3f(1, 0, 0);
glVertex3f(-1, -1, 0);
glColor3f(0, 1, 0);
glVertex3f(1, -1, 0);
glColor3f(0, 0, 1);
glVertex3f(0, 1, 0);
glEnd;
glutSwapBuffers;
end;
procedure ReSizeGLScene(Width, Height: Integer); cdecl;
begin
if Height = 0 then
Height := 1;
glViewport(0, 0, Width, Height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(45, Width / Height, 0.1, 1000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
end;
procedure GLKeyboard(Key: Byte; X, Y: Longint); cdecl;
begin
if Key = 27 then
Halt(0);
end;
procedure glutInitPascal(ParseCmdLine: Boolean);
var
Cmd: array of PChar;
CmdCount, I: Integer;
begin
if ParseCmdLine then
CmdCount := ParamCount + 1
else
CmdCount := 1;
SetLength(Cmd, CmdCount);
for I := 0 to CmdCount - 1 do
Cmd[I] := PChar(ParamStr(I));
glutInit(@CmdCount, @Cmd);
end;
var
ScreenWidth, ScreenHeight: Integer;
begin
glutInitPascal(True);
glutInitDisplayMode(GLUT_DOUBLE or GLUT_RGB or GLUT_DEPTH);
glutInitWindowSize(AppWidth, AppHeight);
ScreenWidth := glutGet(GLUT_SCREEN_WIDTH);
ScreenHeight := glutGet(GLUT_SCREEN_HEIGHT);
glutInitWindowPosition((ScreenWidth - AppWidth) div 2, (ScreenHeight - AppHeight) div 2);
glutCreateWindow('OpenGL Tutorial :: Simple Shape');
InitializeGL;
glutDisplayFunc(@DrawGLScene);
glutReshapeFunc(@ReSizeGLScene);
glutKeyboardFunc(@GLKeyboard);
glutMainLoop;
end.
Zuletzt geändert von Lori am Mo 23. Jan 2017, 18:31, insgesamt 1-mal geändert.
Grund: Highlighter
Grund: Highlighter
-
- Beiträge: 6167
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: OpenGL Befehlsumfang
Code: Alles auswählen
uses
gl, glu, glut, dglOpenGL;
Dies könnte ein Fehler sein, die dglOpenGL.pas überschneidet sich mit den anderen Units.
Ich hätte da noch ein anderes Beispiel, welches mit der LCL arbeitet. Somit hast du Button, Menüs, etc. zur Verfügung.
Dies ist einiges einfacher als sich mit dem Glut Zeugs rumzuschlagen.
Oder willst du evtl. mit modernen OpenGL beginnen.
Wen ich mit OpenGL einsteigen würde, würde ich nicht mehr das alte verwenden.
- Dateianhänge
-
- Texturen_rechteck.zip
- (126.09 KiB) 152-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: OpenGL Befehlsumfang
Beim öffnen deines Projektes möchte er noch ein ogl_Package haben. Unter den Packages bei Lazarus finde ich es nicht.
Zu deiner Frage: beginnen möchte ich wirklich am Anfang. Ich will die einzelnen Tutorien durcharbeiten und daran meine Erfahrungen sammeln.
Zu deiner Frage: beginnen möchte ich wirklich am Anfang. Ich will die einzelnen Tutorien durcharbeiten und daran meine Erfahrungen sammeln.
Re: OpenGL Befehlsumfang
noch eine Anmerkung: die dglOpenGl.pas habe ich in das Projektverzeichnis kopiert und über den Projektinspektor in den Bereich Dateien mit eingebunden
Re: OpenGL Befehlsumfang
habe die Abhängigkeit rausgenommen, nun funktioniert das Beispiel. Danke !!
Dann werde ich mich jetzt mal ans das Tutorial wagen
Dann werde ich mich jetzt mal ans das Tutorial wagen
Re: OpenGL Befehlsumfang
Sorry, aber noch scheint meine Umgebung nicht richtig aufgesetzt zu sein. Wie muss ich das SDK in meine Lazarusumgebung einbinden, damit er alle Units, Header und dlls für die Tutorial s auch richtig findet?
- corpsman
- Lazarusforum e. V.
- Beiträge: 1496
- Registriert: Sa 28. Feb 2009, 08:54
- OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
- Kontaktdaten:
Re: OpenGL Befehlsumfang
Probiers mal hiermit du brauchst die 2. Variante.
Musst nur noch die DGLOpenGL.pas dazu kpieren und schon müsstest du nen roten strich auf Schwarzem Hintergrund sehen.
Musst nur noch die DGLOpenGL.pas dazu kpieren und schon müsstest du nen roten strich auf Schwarzem Hintergrund sehen.
--
Just try it
Just try it
-
- Beiträge: 6167
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: OpenGL Befehlsumfang
Zu deiner Frage: beginnen möchte ich wirklich am Anfang. Ich will die einzelnen Tutorien durcharbeiten und daran meine Erfahrungen sammeln.
Nur wen man später auf das moderne OpenGL umsteigen, muss man alles neu lernen, das einzige was gleich bleibt, ist die Context-Erzeugung und das laden der Texturen.
So nebenbei, Android, IOS, Rasberry, WebGL, setzt alles auf das neue OpenGL.
habe die Abhängigkeit rausgenommen, nun funktioniert das Beispiel. Danke !!
Das ist, weil ich die dglOpengl.pas in eine Pakage gepackt hatte.
damit er alle Units, Header und dlls für die Tutorial s auch richtig findet?
Du willst eine dll einbinden, somit machst du dich Windows-Abhängig.
Eine SDK, brauchst du nicht für OpenGL.
Im Anhang, ein Beispiel mit modernen OpenGL.
- Dateianhänge
-
- Tutorial 01-3 - Quad and Triangle - Color - Shader.zip
- (127.96 KiB) 159-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: OpenGL Befehlsumfang
Ich habe gerade mein Programm so angepasst, das es auch mit der dlgOpenGL läuft. Dabei bin ich auf die folgenden Zeilen gestoßen, die ich mir noch nicht erklären kann, die aber darüber entscheiden, ob ich mein Objekt sehe oder eine Fehlermeldung erhalte:
InitOpenGL;
OpenGLControl1.MakeCurrent; --- die verstehe ich
ReadExtensions;
ReadImplementationProperties;
Sind diese spezifisch für die Verwendung der dlgOpenGL unit? Wenn ich stattdessen GLU, GL verwende brauche ich die nicht.
Um welche Version von OpenGL handelt es sich jeweils
- bei Verwendung der dlgOpenGL unit
- bei Verwendung der mitgelieferten GL, GLU Units?
Danke euch
InitOpenGL;
OpenGLControl1.MakeCurrent; --- die verstehe ich
ReadExtensions;
ReadImplementationProperties;
Sind diese spezifisch für die Verwendung der dlgOpenGL unit? Wenn ich stattdessen GLU, GL verwende brauche ich die nicht.
Um welche Version von OpenGL handelt es sich jeweils
- bei Verwendung der dlgOpenGL unit
- bei Verwendung der mitgelieferten GL, GLU Units?
Danke euch
Re: OpenGL Befehlsumfang
Ich bin kein OpenGL-Experte, aber ich habe ziemliches Bauchweh mit dieser Konstruktion: TOpenGLControl wird mit den mitgelieferten "alten" gl* units gebaut, aber im Hauptprogramm wird dglOpenGl verwendet. Das mag eine Zeitlang gut gehen, aber irgendwann wird es krachen! Ich fände es besser, wenn sich jemand die Mühe machen würde herauszufinden, welche Aufrufe in den mitgelieferten gl* Units fehlen, und dies als Bug im BugTracker melden würde, so dass man langfristig auf glOpenGL verzichten kann.
[EDIT]
Bitte probiert mal die gl* Units aus, die im fpc-trunk enthalten sind. Lt. http://bugs.freepascal.org/view.php?id=29051 sollten diese moderner sein.
[EDIT]
Bitte probiert mal die gl* Units aus, die im fpc-trunk enthalten sind. Lt. http://bugs.freepascal.org/view.php?id=29051 sollten diese moderner sein.