OpenGL Befehlsumfang

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...

OpenGL Befehlsumfang

Beitragvon wegnera » 21. Jan 2017, 16:29 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
wegnera
 
Beiträge: 14
Registriert: 21. Jan 2017, 16:21

Beitragvon Warf » 21. Jan 2017, 16:52 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
Warf
 
Beiträge: 838
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon wegnera » 21. Jan 2017, 17:00 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?
wegnera
 
Beiträge: 14
Registriert: 21. Jan 2017, 16:21

Beitragvon Warf » 21. Jan 2017, 17:08 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.
Warf
 
Beiträge: 838
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon wegnera » 21. Jan 2017, 17:11 Re: OpenGL Befehlsumfang

danke für den Hinweis, muss nur nor auf die Freischaltung meines Accounts warten
wegnera
 
Beiträge: 14
Registriert: 21. Jan 2017, 16:21

Beitragvon wegnera » 22. Jan 2017, 11:22 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?

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 23. Jan 2017, 18:31, insgesamt 1-mal geändert.
Grund: Highlighter
wegnera
 
Beiträge: 14
Registriert: 21. Jan 2017, 16:21

Beitragvon Mathias » 22. Jan 2017, 17:30 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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3993
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon wegnera » 22. Jan 2017, 18:33 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.
wegnera
 
Beiträge: 14
Registriert: 21. Jan 2017, 16:21

Beitragvon wegnera » 22. Jan 2017, 18:37 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
wegnera
 
Beiträge: 14
Registriert: 21. Jan 2017, 16:21

Beitragvon wegnera » 22. Jan 2017, 18:40 Re: OpenGL Befehlsumfang

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: 21. Jan 2017, 16:21

Beitragvon wegnera » 22. Jan 2017, 19:04 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?
wegnera
 
Beiträge: 14
Registriert: 21. Jan 2017, 16:21

Beitragvon corpsman » 22. Jan 2017, 19:36 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.
--
Just try it
corpsman
 
Beiträge: 1041
Registriert: 28. Feb 2009, 08:54
Wohnort: Stuttgart
OS, Lazarus, FPC: Kubuntu 14.04, Lazarus SVN Trunk, FPC 3.0 | 
CPU-Target: 32Bit
Nach oben

Beitragvon Mathias » 22. Jan 2017, 19:40 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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3993
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon wegnera » 23. Jan 2017, 12:35 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
wegnera
 
Beiträge: 14
Registriert: 21. Jan 2017, 16:21

Beitragvon wp_xyz » 23. Jan 2017, 14:08 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.
wp_xyz
 
Beiträge: 2533
Registriert: 8. Apr 2011, 08:01

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Multimedia



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried