Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mo Apr 29, 2024 09:39

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: OpenGL unter Linux mit Lazarus
BeitragVerfasst: Fr Jul 18, 2014 19:07 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich habe hier ein OpenGL 3.3 - Programm welches nur das nötigste hat. Es läuft unter Windows.

Was muss man ändern, das es auch unter Linux läuft ?

Code:
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Forms,
  9.   dglOpenGL, Windows;
  10.  
  11. type
  12.  
  13.   { TForm1 }
  14.  
  15.   TForm1 = class(TForm)
  16.     procedure FormCreate(Sender: TObject);
  17.     procedure FormDestroy(Sender: TObject);
  18.     procedure FormPaint(Sender: TObject);
  19.     procedure FormResize(Sender: TObject);
  20.   private
  21.     DC: HDC;
  22.     RC: HGLRC;
  23.     procedure InitScene;
  24.     procedure RenderScene;
  25.   end;
  26.  
  27. var
  28.   Form1: TForm1;
  29.  
  30. implementation
  31.  
  32. {$R *.lfm}
  33.  
  34. { TForm1 }
  35.  
  36. type
  37.   TVertex3f = array[0..2] of GLfloat;
  38.   TFace = array[0..2] of TVertex3f;
  39.  
  40. const
  41.   Triangle: array[0..0] of TFace =
  42.     (((-0.4, 0.1, 0.0), (0.4, 0.1, 0.0), (0.0, 0.7, 0.0)));
  43.   Quad: array[0..1] of TFace =
  44.     (((-0.2, -0.6, 0.0), (-0.2, -0.1, 0.0), (0.2, -0.1, 0.0)),
  45.     ((-0.2, -0.6, 0.0), (0.2, -0.1, 0.0), (0.2, -0.6, 0.0)));
  46.  
  47. type
  48.   TVB = record
  49.     VAO,
  50.     VBO: GLuint;
  51.   end;
  52.  
  53. var
  54.   VBTriangle, VBQuad: TVB;
  55.  
  56. procedure TForm1.InitScene;
  57. begin
  58.   glGenVertexArrays(1, @VBTriangle.VAO);
  59.   glGenVertexArrays(1, @VBQuad.VAO);
  60.  
  61.   glGenBuffers(1, @VBTriangle.VBO);
  62.   glGenBuffers(1, @VBQuad.VBO);
  63.  
  64.   glClearColor(0.0, 0.5, 1.0, 1.0); //Hintergrundfarbe: Hier ein leichtes Blau
  65.  
  66.  
  67.   glBindVertexArray(VBTriangle.VAO);
  68.  
  69.   glBindBuffer(GL_ARRAY_BUFFER, VBTriangle.VBO);
  70.   glBufferData(GL_ARRAY_BUFFER, sizeof(Triangle), @Triangle, GL_STATIC_DRAW);
  71.   glEnableVertexAttribArray(0);
  72.   glVertexAttribPointer(0, 3, GL_FLOAT, False, 0, nil);
  73.  
  74.  
  75.   glBindVertexArray(VBQuad.VAO);
  76.  
  77.   glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBO);
  78.   glBufferData(GL_ARRAY_BUFFER, sizeof(Quad), @Quad, GL_STATIC_DRAW);
  79.   glEnableVertexAttribArray(0);
  80.   glVertexAttribPointer(0, 3, GL_FLOAT, False, 0, nil);
  81. end;
  82.  
  83. procedure TForm1.RenderScene;
  84. begin
  85.   glClear(GL_COLOR_BUFFER_BIT);
  86.  
  87.   // Zeichen Dreieck
  88.   glBindVertexArray(VBTriangle.VAO);
  89.   glDrawArrays(GL_TRIANGLES, 0, Length(Triangle) * 3);
  90.  
  91.   // Zeichne Quadrat
  92.   glBindVertexArray(VBQuad.VAO);
  93.   glDrawArrays(GL_TRIANGLES, 0, Length(Quad) * 3);
  94.  
  95.   SwapBuffers(DC);
  96. end;
  97.  
  98. procedure TForm1.FormCreate(Sender: TObject);
  99. begin
  100.   DC := GetDC(Handle);
  101.   RC := CreateRenderingContextVersion(DC, [opDoubleBuffered], 3, 3, True, 32, 24, 8, 0, 0, 0);
  102.   ActivateRenderingContext(DC, RC);
  103.  
  104.   InitScene;
  105. end;
  106.  
  107. procedure TForm1.FormDestroy(Sender: TObject);
  108. begin
  109.   glDeleteBuffers(1, @VBTriangle.VAO);
  110.   glDeleteBuffers(1, @VBQuad.VAO);
  111.  
  112.   glDeleteBuffers(1, @VBTriangle.VBO);
  113.   glDeleteBuffers(1, @VBQuad.VBO);
  114.  
  115.   DeactivateRenderingContext;
  116.   DestroyRenderingContext(RC);
  117.   ReleaseDC(Handle, DC);
  118. end;
  119.  
  120. procedure TForm1.FormPaint(Sender: TObject);
  121. begin
  122.   RenderScene;
  123. end;
  124.  
  125. procedure TForm1.FormResize(Sender: TObject);
  126. begin
  127.   glViewport(0, 0, ClientWidth, ClientHeight);
  128. end;
  129.  
  130. end.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL unter Linux mit Lazarus
BeitragVerfasst: Fr Jul 18, 2014 20:39 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Awesome installieren lol

gib mal "glxinfo" in die Konsole ein und poste das Ergebniss.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL unter Linux mit Lazarus
BeitragVerfasst: Fr Jul 18, 2014 20:59 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Die kurze Antwort ist: anstatt der WGL-Funktionen sich alle relevanten GLX-Funktionen und auch noch die Funktionen für das X-Window raussuchen. Die GLX-Funktionen stecken im OpenGL-Header drin. Die XLib ist in der FreePascal-FCL enthalten. Aber die Xlib zu benutzen (= die Linux-Bibliothek um Fenster öffnen zu können) ist für einen Linux-Newcomer eine ganz schöne Plage.

Die Alternative ist, die Lazarus-OpenGL-Komponente zu benutzen. Aber die habe ich schon seit langer Zeit ad acta gelegt, weil sie damals nur bis OpenGL 2.1 konnte. Wie es jetzt ist, weiß ich nicht.

Viele Leute benutzen das Toolkit QT. Aber da kenne ich mich nicht aus.

Ich mache Dir einen Vorschlag: ich habe vor nicht allzu langer Zeit (ein Jahr oder so) genau für solche Fragen ein Pascal Mini-Linux-OpenGL-32-Bit-Programm geschrieben, in zwei Ausführungen: wahlweise OpenGL3.3 oder OpenGL2.1.

Es funktioniert mit dem dglOpenGL-Header und zeichnet ein Dreieck und braucht ansonsten keine zusätzlichen Units. Wenn Du also ein *32-Bit* Linux und die dglOpenGL.pas zur Verfügung hast, müsste es eigentlich auf Anhieb laufen.

Viele Grüße,
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL unter Linux mit Lazarus
BeitragVerfasst: So Jul 20, 2014 09:25 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey

du kannst dir auch mal den glContext angucken, der hilft dir bei der erstellung eines Contextes, ist Windows und Linux kompatibel und extra für Lazarus entwickt. ;)

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL unter Linux mit Lazarus
BeitragVerfasst: So Jul 20, 2014 17:00 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Ich mache Dir einen Vorschlag: ich habe vor nicht allzu langer Zeit (ein Jahr oder so) genau für solche Fragen ein Pascal Mini-Linux-OpenGL-32-Bit-Programm geschrieben, in zwei Ausführungen: wahlweise OpenGL3.3 oder OpenGL2.1.

Kann man dies Downloaden ?

Zitat:
du kannst dir auch mal den glContext angucken,

Ich habe es angeguckt, unter Windows läuft das Test-Programm, aber unter Linux kommen Schutverletzungen.
Vielleicht liegt das daran, das Lazarus bei mir fehlerhaft installiert ist. Es ist ein gepastel mit SVN.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL unter Linux mit Lazarus
BeitragVerfasst: So Jul 20, 2014 20:13 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

was für'n Linux, Lazarus und FPC hast du installiert? Du kannst dir auch einfach nur den Code in den uglcContextGtkXXX-Units ansehen, da sollte alles drin stehen was du für die Erstellung eines Render-Contexts brauchst. Wir hatten da auch noch 1 oder 2 Bugfixes gemacht, die noch nich im git eingepflegt sind. Da muss ich nochma mit Martok reden, das wir das nachziehen. Der Stand der jetzt drin liegt ist aber auf alle Fälle mit Ubuntu 13.10, Laz 1.2RC1 und FPC 2.7.1 getestet.

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL unter Linux mit Lazarus
BeitragVerfasst: So Jul 20, 2014 22:09 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Jetzt geht es, ich habe Suse und Lazarus neu installiert, kein Beta.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL unter Linux mit Lazarus
BeitragVerfasst: So Jul 20, 2014 22:17 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Okay, super. Beim glContext kannst du zwar nicht explizit auswählen, das es ein OpenGL 3.3 Context werden soll, aber ist schonmal besser als nix^^ Das man die Version auswählen kann werden wir demnächst noch nachliefern. Sobald es da was Neues gibt stehst im Projekt-Thread ;)

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL unter Linux mit Lazarus
BeitragVerfasst: Mo Jul 21, 2014 07:12 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
mathias hat geschrieben:
Kann man dies Downloaden ?
Nein. Aber ich stelle es Dir einfach hier herein. Sind ja nur zwei kleine Source-Code-Dateien.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL unter Linux mit Lazarus
BeitragVerfasst: Mo Jul 21, 2014 19:15 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich dachte es währe sehr einfache die Windows OpenGL-Programme Linux kompatibel zum machen.

Mann müsse nur da was kleines ändern und die Unit Windows durch was anderes ersetzen.

Code:
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3.   DC := GetDC(Handle);
  4.   RC := CreateRenderingContextVersion(DC, [opDoubleBuffered], 3, 3, True, 32, 24, 8, 0, 0, 0);
  5.   ActivateRenderingContext(DC, RC);
  6.  
  7.   InitScene;
  8. end;    

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL unter Linux mit Lazarus
BeitragVerfasst: Mo Jul 21, 2014 19:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Die Art und Weise wie der Renderkontext erzeugt werden ist stark vom Betriebssystem abhängig. Unter Windows wird das in unserer dglOpenGL.pas halt durch "CreateRenderingContext" abstrahiert, aber halt nur da.

Für Linux müsste man halt etwas entsprechendes bauen, aber da ich privat schon länger nix mehr mit Delphi mache und die Nachfrage wohl auch nicht sonderlich groß ist, hab ich da nix fertiges parat.

Ansonsten kommt Lazarus doch schon mit der "TOpenGLControl"-Komponente (evtl. muss man die nachinstallieren, geht dann aber direkt über die Packageverwaltung der IDE), die die Erstellung des Kontextes abstrahiert.

Für den glCapsViewer sieht dass in etwa so aus :
Code:
  1.   {$IFDEF WINDOWS}
  2.     DC := GetDC(Handle);
  3.     RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 8, 0, 0, 0);
  4.     ActivateRenderingContext(DC, RC);
  5.   {$ENDIF}
  6.  
  7.   {$IFDEF LINUX}
  8.     InitOpenGL;
  9.     GLControl.MakeCurrent;
  10.     ReadExtensions;
  11.     ReadImplementationProperties;
  12.   {$ENDIF}
  13.  
  14.   {$IFDEF DARWIN}
  15.     GLControl.MakeCurrent;
  16.   {$ENDIF}


Der läuft schon länger unter Windows, Linux und Mac OSX und ist entsprechend weit getestet.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL unter Linux mit Lazarus
BeitragVerfasst: Mo Jul 21, 2014 22:14 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Ansonsten kommt Lazarus doch schon mit der "TOpenGLControl"-Komponente (evtl. muss man die nachinstallieren, geht dann aber direkt über die Packageverwaltung der IDE), die die Erstellung des Kontextes abstrahiert.

Älter geht es kaum noch, es wird dazu noch die unit GL gebraucht, mit dglOpenGL gibt es eine Schutzverletzung.
Es wird OpenGL 1.2.1 unterstützt. Geschrieben im Jahr 2000.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL unter Linux mit Lazarus
BeitragVerfasst: Mo Jul 21, 2014 22:19 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Das stimmt so nicht. Die Komponente benötigt man nur für den Renderkontext, danach kann man diese auch mit der dglOpenGL.pas nutzen. Mache ich wie gesagt mit dem glCapsViewer, und auch mit Projekt "W", das auch Shader und co. benutzt.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL unter Linux mit Lazarus
BeitragVerfasst: Di Jul 22, 2014 08:08 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Ich habe die Lazarus-OpenGL-Komponente bei mir nochmals aufgesetzt (Lazarus 1.2, Ubuntu 12.04).

Wenn man GL,GLU benutzt, dann zeichnet er was, ist aber offensichtlich im Softwaremodus, so langsam, dass es unbrauchbar ist.

Wenn man die dglOpenGL benutzt, gibt es einen SigSev.

@Sascha: Wenn Du das bei Dir zum Laufen bekommen hast, wärs echt schön, wenn Du uns verraten würdest, wie Du das gemacht hast.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL unter Linux mit Lazarus
BeitragVerfasst: Di Jul 22, 2014 16:46 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Wenn man die dglOpenGL benutzt, gibt es einen SigSev.

Genaus diese Problem hatte ich auch, warscheinlich wird das Problem sein, das die Komponente immer GL verwendet, und ich im Hauptprogramm dglOpenGL einsetzte, das es dann zwischen den beiden Headern einen Kompflikt gibt.

Zitat:
ist aber offensichtlich im Softwaremodus,
Das hätte ich nicht gedacht.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 43 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.067s | 19 Queries | GZIP : On ]