OpenGL Befehlsumfang

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
wegnera
Beiträge: 14
Registriert: Sa 21. Jan 2017, 16:21

OpenGL Befehlsumfang

Beitrag von wegnera »

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

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: OpenGL Befehlsumfang

Beitrag von Warf »

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

wegnera
Beiträge: 14
Registriert: Sa 21. Jan 2017, 16:21

Re: OpenGL Befehlsumfang

Beitrag von wegnera »

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?

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: OpenGL Befehlsumfang

Beitrag von Warf »

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.

wegnera
Beiträge: 14
Registriert: Sa 21. Jan 2017, 16:21

Re: OpenGL Befehlsumfang

Beitrag von wegnera »

danke für den Hinweis, muss nur nor auf die Freischaltung meines Accounts warten

wegnera
Beiträge: 14
Registriert: Sa 21. Jan 2017, 16:21

Re: OpenGL Befehlsumfang

Beitrag von wegnera »

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?

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

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: OpenGL Befehlsumfang

Beitrag von Mathias »

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

wegnera
Beiträge: 14
Registriert: Sa 21. Jan 2017, 16:21

Re: OpenGL Befehlsumfang

Beitrag von wegnera »

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.

wegnera
Beiträge: 14
Registriert: Sa 21. Jan 2017, 16:21

Re: OpenGL Befehlsumfang

Beitrag von wegnera »

noch eine Anmerkung: die dglOpenGl.pas habe ich in das Projektverzeichnis kopiert und über den Projektinspektor in den Bereich Dateien mit eingebunden

wegnera
Beiträge: 14
Registriert: Sa 21. Jan 2017, 16:21

Re: OpenGL Befehlsumfang

Beitrag von wegnera »

habe die Abhängigkeit rausgenommen, nun funktioniert das Beispiel. Danke !!

Dann werde ich mich jetzt mal ans das Tutorial wagen

wegnera
Beiträge: 14
Registriert: Sa 21. Jan 2017, 16:21

Re: OpenGL Befehlsumfang

Beitrag von wegnera »

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?

Benutzeravatar
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

Beitrag von corpsman »

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.
--
Just try it

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: OpenGL Befehlsumfang

Beitrag von Mathias »

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

wegnera
Beiträge: 14
Registriert: Sa 21. Jan 2017, 16:21

Re: OpenGL Befehlsumfang

Beitrag von wegnera »

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

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: OpenGL Befehlsumfang

Beitrag von wp_xyz »

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.

Antworten