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

Aktuelle Zeit: Mo Apr 29, 2024 04:42

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 39 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: Do Nov 28, 2013 20:49 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich habe mir mein erstes Programm mit OpenGL 3 aus diversen Tutorials zusammengewürfelt.

Bin ich da auf den richtigen Weg für OpenGL 3 ?
Ich kann mir vorstellen, das es gravierende Fehler enthält.

Ein Fehler hat es sowieso, das Dreieck ist nicht farbig sondern nur weiss.

Programmiert ist es in Lazarus.

Ich hoffe mir kann weiter geholfen werden, ich will meine zukünftitge Programm auf einer Fehlerfreien Basis aufbauen.

Danke im voraus.

Code:
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
  9.   ExtCtrls, dglOpenGL, Windows;
  10.  
  11. type
  12.   TForm1 = class(TForm)
  13.     Timer1: TTimer;
  14.     procedure FormCreate(Sender: TObject);
  15.     procedure FormDestroy(Sender: TObject);
  16.     procedure FormPaint(Sender: TObject);
  17.     procedure FormResize(Sender: TObject);
  18.     procedure Timer1Timer(Sender: TObject);
  19.   private   { private declarations }
  20.     procedure Render;
  21.     procedure SetupGL;
  22.   public        { public declarations }
  23.     DC: HDC;  //Handle auf Zeichenfläche
  24.     RC: HGLRC;//Rendering Context  end;
  25.   end;
  26.  
  27. var
  28.   Form1: TForm1;
  29.  
  30. implementation
  31.  
  32. {$R *.lfm}
  33.  
  34. { TForm1 }
  35.  
  36. const
  37.   NearClipping = 1;
  38.   FarClipping = 1000;
  39.  
  40.   Winkel: integer = 10;
  41.  
  42.   g_vertex_buffer_data: array[0..8] of GLfloat =
  43.     (-1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 0.0, 1.0, 0.0);
  44.   g_color_buffer_data: array[0..8] of GLfloat =
  45.     (1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);
  46.  
  47. var
  48.   vertexbuffer: GLuint;
  49.   colorbuffer: GLuint;
  50.  
  51. procedure TForm1.SetupGL;
  52. begin
  53.   glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe: Hier ein leichtes Blau
  54.   glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren
  55.   glEnable(GL_CULL_FACE);           //Backface Culling aktivieren
  56.  
  57.   glGenBuffers(1, @vertexbuffer);
  58.   glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
  59.   glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data),
  60.     @g_vertex_buffer_data, GL_STATIC_DRAW);
  61.  
  62.   glGenBuffers(1, @colorbuffer);
  63.   glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
  64.   glBufferData(GL_ARRAY_BUFFER, sizeof(g_color_buffer_data),
  65.     @g_color_buffer_data, GL_STATIC_DRAW);
  66.  
  67. end;
  68.  
  69. procedure TForm1.FormCreate(Sender: TObject);
  70. begin
  71.   DC := GetDC(Handle);
  72.   if not InitOpenGL then
  73.     Application.Terminate;
  74.   RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  75.   ActivateRenderingContext(DC, RC);
  76.   SetupGL;
  77. end;
  78.  
  79. procedure TForm1.FormDestroy(Sender: TObject);
  80. begin
  81.   glDeleteBuffers(1, @vertexbuffer);
  82.   glDeleteBuffers(1, @colorbuffer);
  83.  
  84.   DeactivateRenderingContext;
  85.   DestroyRenderingContext(RC);
  86.   ReleaseDC(Handle, DC);
  87. end;
  88.  
  89. procedure TForm1.FormPaint(Sender: TObject);
  90. begin
  91.   Render;
  92. end;
  93.  
  94. procedure TForm1.Render;
  95. begin
  96.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  97.  
  98.   glMatrixMode(GL_MODELVIEW);
  99.   glLoadIdentity;
  100.  
  101.   glTranslatef(0, 0, -5);
  102.   glRotatef(Winkel, 0, 0, 0);
  103.  
  104.   glEnableVertexAttribArray(0);
  105.   glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
  106.   glVertexAttribPointer(0, 3, GL_FLOAT, False, 0, Pointer(0));
  107.  
  108.   glEnableVertexAttribArray(1);
  109.   glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
  110.   glVertexAttribPointer(1, 3, GL_FLOAT, False, 0, Pointer(0));
  111.  
  112.   glDrawArrays(GL_TRIANGLES, 0, 3);
  113.  
  114.   glDisableVertexAttribArray(0);
  115.   glDisableVertexAttribArray(1);
  116.  
  117.   SwapBuffers(DC);
  118. end;
  119.  
  120.  
  121.  
  122. procedure TForm1.FormResize(Sender: TObject);
  123. begin
  124.   glViewport(0, 0, ClientWidth, ClientHeight);
  125.   glMatrixMode(GL_PROJECTION);
  126.   glLoadIdentity;
  127.   gluPerspective(45.0, ClientWidth / ClientHeight, NearClipping, FarClipping);
  128.  
  129.   glMatrixMode(GL_MODELVIEW);
  130.   glLoadIdentity;
  131. end;
  132.  
  133. procedure TForm1.Timer1Timer(Sender: TObject);
  134. begin
  135.   Inc(Winkel);
  136.   if Winkel = 360 then
  137.     winkel := 0;
  138.   Render;
  139. end;
  140.  
  141. end.

_________________
OpenGL


Zuletzt geändert von mathias am So Jan 05, 2014 19:33, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: Do Nov 28, 2013 21:09 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Du hast zwei VBO's in die du die Daten speicherst. Du musst beides in ein Array, bzw. VBO speichern:

{Vertex1,Color1,Vertex2,Color2,...,Vertexn,Colorn}

und dann mittels glVertexAttribPointer angeben wo die Color-Daten in deinem VBO (einem!) liegen.

Außerdem sind glTranslatef und generell alle Matrix-Befehle deprecated, für OGL 3 solltest du die durch eigene Funktionen ersetzen, was aber für den Anfang erstmal unwichtig ist ;)

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: Do Nov 28, 2013 21:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Das sieht mir nicht nach OpenGL3 aus. Zum Erstellen eines Kontexts mit Version 3.0 oder höher musst du auf Windows irgendwo die Funktion wglCreateContextAttribsARB aufrufen. Das sehe ich in deinem Code nicht. Kann aber auch sein, dass der DGL-Header das auf Wunsch übernimmt, da kenne ich mich nicht mit aus.

Die zweite Sache, die auffällt ist, dass du offenbar keine Shader verwendest. Das ist bei OpenGL3+ aber Pflicht. Der würde dann auch die Farbe festlegen. Meiner Meinung nach taugt das Tutorial_glsl immer noch ganz gut zum Erlernen von GLSL. Die Sprache hat sich nicht soo grundsätzlich geändert. Die wesentlichen Änderungen sind:
  • Alle eingebauten Variablen sind verschwunden (Ausnahme: gl_Position und gl_PointSize im Vertexshader, gl_FragCoord im Fragmentshader und wenige andere). Sie werden nun bei Bedarf selbst deklariert und übergeben.
  • Statt attribute wird im Vertexshader nun in geschrieben.
  • varying gibt es nicht mehr. Stattdessen werden diese Variablen im VS mit out und im FS mit in deklariert.
  • In der ersten Zeile jedes Shaders wird nun eine #version-Direktive geschrieben, z.B. #version 330 oder #version 120
  • Da die OpenGL-Funktionen zum Verwalten der Shader inzwischen im Kern angekommen sind, fällt natürlich das ARB am Ende weg.

Die Matrixfunktionen (glMatrixMode, glLoadIdentity, glRotatef, gluPerspective usw.) gibt es ebenfalls nicht mehr in OpenGL3. Du musst die Matrizen mit glUniform an den Shader weitergeben.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: Do Nov 28, 2013 21:45 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Leider kann ich dir konkret nicht weiterhelfen, weil ich mir mit der fixed Pipeline nicht mehr ganz sicher bin.
Allerdings möchte ich die dich daraufhinweisen, das du nicht reines OpenGL 3 nutzt!
Mit VBOs bist du schonmal auf einen guten Weg.
Damit das nicht passiert, dass du versehentlich(?) ohne es zu merken deprecated Zeug benutzt, möchte ich dich nochmal auf meinen Tipp hinweisen, einen Grafikkontext im Core Profile zu erstellen. Wie das bei dir in deinen Contextcreator funktioniert, kann ich dir leider nicht sagen, weil ich selber nur GLFW nutze. Am Besten einfach in die Dokumentation schauen und danach suchen.

Du solltest auf jedenjall die integrierten Matrixfunktionen und die fixed Pipeline raushauen und stattdesen Shader einsetzen, wenn du es richtig machen willst.

EDIT:
glAwesome war schneller. :wink:

Bei den Shadertutorial gebe ich dir prinziell auch recht, denke aber auch, dass ein Neueinsteiger durch die vielen feinen Unterschiede bloß unnötige Fehler einhandelt und dadurch verwirrt wird. Wer es gerne Deutsch hat, kann das Tutorial gut als ersten Einstieg in das Thema durchlesen und nach Grundkenntnissen und dem Wissen über die Änderungen, das Tutorial als Nachschlagwerk für Funktionen verwenden, jedoch für den ersten soliden Einstieg in GLSL Code in der Praxis, würde ich doch das bereits in einen anderen änlichen Thema von mir verlinkte Tutorial hier empfehlen:
www.lighthouse3d.com/tutorials/glsl-core-tutorial
Das fand ich persönlich sehr gut auch mit vielen Codebeispielen und man braucht keine Sorgen haben, dass irgendetwas veraltet ist. Sogar Tesselation wird kurz angesprochen, wenn auch nicht verwendet.

Die GLU-Funktionen wurden übrigens auch alle in OpenGL 3 entfernt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: Do Nov 28, 2013 23:06 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Schön währe, wen man einen Quelltext für eine Delphi Formular in OpenGL 3.x finden würde, auf dem man aufbauen könnte.

Von dem ihr oben schreibt verstehe ich nur Bahnhof. :cry:

Von OpenGL 1.x finde man viele solche Quelltexte, auf denen hatte ich meine sämtlichen Programme aufgebaut. Unter anderem auch in eurem Tutorial.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: Do Nov 28, 2013 23:21 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Delphiquelltexte wirst du nicht kaum finden, aber OpenGL ist ein Standard der in allen Programmiersprachen gleich aussieht. Die meisten interessanten Sachen sind in C(++) geschrieben. Rudimentäre Kenntnisse über die Sprache brauchst du eh, weil auch GLSL eine C-Sprache ist.

Was verstehst du denn nicht? Sind irgendwelche Begriffe unklar? So allgemein gestellt, fällt es mir schwer, darauf eine hilfreiche Antwort zu geben.

Ich würde dir einfach mal empfehlen ein modernes Tutorials durchzugehen. Welche Programmiersprache sollte egal sein, auch wenn es dann vielleicht im ersten Moment etwas ungewohnt aussieht vom Syntax. Bei Problemen die sich auf Delphi beziehen, kann dir da auch nicht weiterhelfen, weil ich von Delphi keine Ahnung habe. Ich kann höchstens die Quelltexte nachvollziehen. :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: Fr Nov 29, 2013 10:16 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Nun ja den speziellen Context musst du nicht unbedingt aufsetzen (jedenfalls soweit ich weiss). Der Allgemeine Context (so wie er jetzt ist) ist auf jedenfall ne ganze Ecke entspannter
wenn es z.B. um verschiedene Codepaths gehts. Aber egal. Mir scheint eher das du Probleme mit der neuen Arbeitsweise von OpenGL hast von daher fang ich mal beim Urschleim (Code Beispiele sind ES ... also nicht unbedingt fuer Desktop) an:


Die GL_ARRAY_BUFFER sind im Prinzip genau wie die Vertex (usw.) Pointer. Nur halt schneller, flexibler und besserer :). Beiden uebergibst du ein Array von, normalerweise, GLFloat. Das geschieht ganz einfach ueber:
Code:
  1.  
  2.     glGenVertexArraysOES(1, &_vertexArray);
  3.     glBindVertexArrayOES(_vertexArray);
  4.    
  5.     glGenBuffers(1, &_vertexBuffer);
  6.     glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
  7.     glBufferData(GL_ARRAY_BUFFER, sizeof(DEINEDATEN), DEINEDATEN, GL_STATIC_DRAW);
  8.  


jetzt musst du OpenGL nur noch mitteilen wie deine Daten aufgebaut sind. Wenn du dir z.B. folgende Struct vorstellst:
Code:
  1.  
  2. struct {
  3.      GLfloat p[3];
  4.      GLfloat c[4];
  5. } vertex_t;
  6.  

Dann waere dein Array wie folgt aufgebaut:
Code:
  1.  
  2. {p[0],p[1],p[2],c[0],c[1],c[2],c[3], //erster Vertex
  3. p[0],p[1],p[2],c[0],c[1],c[2],c[3]. //zweiter Vertex
  4. ...
  5.  

Du musst OpenGL also mitteilen das die Vertexposition jeweils an der 0+7*i,1+7*i,2+7*i Stelle liegen und deine Farben an 3+7*i,4+7*i,5+7*i,6+7*i liegen. Das ganze sieht dann wie folgt aus:

Code:
  1.  
  2.     glEnableVertexAttribArray(DEINPOSITIONATTRIBUTEINDEX);
  3.     glVertexAttribPointer(DEINPOSITIONATTRIBUTEINDEX, 3, GL_FLOAT, GL_FALSE, 7*sizeof(GLfloat), DEINEDATEN_OFFSET(0)); //wir starten bei 0, holen 3 GLfloat, und gehen 7 GLfloat weiter
  4.     glEnableVertexAttribArray(DEINPCOLORATTRIBUTEINDEX);
  5.     glVertexAttribPointer(DEINPCOLORATTRIBUTEINDEX, 4, GL_FLOAT, GL_FALSE, 7*sizeof(GLfloat), DEINEDATEN_OFFSET(3*sizeof(Glfloat)));//wir starten bei 3, holen 4 GLfloat, und gehen 7 GLfloat weiter
  6.    
  7.     glBindVertexArrayOES(0);
  8.  


wobei DEINPOSITIONATTRIBUTEINDEX und DEINPCOLORATTRIBUTEINDEX fixxe integer sind die von GLSL nachher fuer die attribute Variablen verwendet werden. Am besten du machst dir einen enum:
Code:
  1.  
  2. enum {
  3.   DEINPOSITIONATTRIBUTEINDEX
  4.   DEINPCOLORATTRIBUTEINDEX,
  5.   DEINPTEXTURECOORDATTRIBUTEINDEX,
  6.   DEINPNORMALCOORDATTRIBUTEINDEX,
  7.   ...
  8. }
  9.  


Kurz vor den Uniforms bindest du die Attribute dann an deinen Vertexshader per glBindAttribLocation:
Code:
  1.  
  2. glBindAttribLocation(_program, DEINPOSITIONATTRIBUTEINDEX, "position");
  3. glBindAttribLocation(_program, DEINPCOLORATTRIBUTEINDEX, "color");
  4.  


Alles zusammen ergibt also:
Code:
  1.  
  2.     glGenVertexArraysOES(1, &_vertexArray);
  3.     glBindVertexArrayOES(_vertexArray);
  4.    
  5.     glGenBuffers(1, &_vertexBuffer);
  6.     glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
  7.     glBufferData(GL_ARRAY_BUFFER, sizeof(DEINEDATEN), DEINEDATEN, GL_STATIC_DRAW);
  8.  
  9.   glEnableVertexAttribArray(GLKVertexAttribPosition);
  10.     glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 7*sizeof(GLfloat), DEINEDATEN_OFFSET(0));
  11.     glEnableVertexAttribArray(GLKVertexAttribColor);
  12.     glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, 7*sizeof(GLfloat), DEINEDATEN_OFFSET(3*sizeof(Glfloat)));
  13. glBindVertexArrayOES(0);
  14.  


Beim Zeichnen bindest du einfach dein Array und zeichnest deine Punkte:

Code:
  1.  
  2. glBindVertexArrayOES(_vertexArray);
  3. glDrawArrays(GL_TRIANGLES, 0, 3); //wir starten bei Vertex 0 und holen uns 3 Vertices um damit ein Dreieck zu zeichnen.
  4.  


und im Vertexshader holst du dir Attribute dann ueber das "attribute" Schluesselwort (aehnlich wie Uniforms):
Code:
  1.  
  2. attribute vec3 position;
  3. attribute vec4 color;
  4.  


Im Shader kannst du dann mit den Sachen rumspielen wie du lustig bist :)

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: Fr Nov 29, 2013 14:24 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Zitat:
Nun ja den speziellen Context musst du nicht unbedingt aufsetzen (jedenfalls soweit ich weiß).

Müssen tut man nichts. Sinnvoll ist es aber.
Sonst bekommt man nichtmal mit, wenn man veraltete Funktionen nutzt, das ist gefährlich und sinnlos.

Zitat:
ne ganze Ecke entspannter

Beim Programmieren geht es in erster Linie nicht um Entspannung sondern um gute Software. Die zukünftige Kompatiblität wird jedenfalls darunter leiden. Ohne die Einstellung wirklich nur reines modernes OpenGL zu verwenden erfordert schwere Selbstdisziplin und Informationen die man im Internet nur mühsam findet.

Zitat:
wenn es z.B. um verschiedene Codepaths gehts.

Wenn man irgendwann einen anderen Renderpath einbauen will, ist es auch keine große Sache: Man setzt ganz einfach dabei das Flag(?) für OpenGL Core beim Initialisieren des Kontexts nicht mehr und gut ist. Wirklich keine große Sache. Andersrum, den Core einzuschalten, sollte auch keine größere Sache sein. Ich weiß leider nur nicht, wie es bei ihm geht.

Zitat:
Nur halt schneller, flexibler und besserer

Das Entscheidende: Die Daten werden im schnellen Speicher der Grafikkarte gespeichert. Gerade Daten die nicht häufig geändert werden, können massiv davon profitieren. Bei Vertexdaten die sich pro Frame ändern, ist der Vorteil klein bis nicht vorhanden.

Zitat:
und im Vertexshader holst du dir Attribute dann ueber das "attribute" Schluesselwort (aehnlich wie Uniforms):

Nein, das ist veraltet. Man muss in GLSL der Version 3 das jetzt mit "in" und "out" machen. Eigentlich ein kleiner Unterschied aber für einen Einsteiger ein Großer: Führt zur Verwirrung.

Gerade ein Anfänge oder (Neu)Einsteiger hat die ideale Gelegenheit es gleich vernümpftig zu lernen.

@mathias
Arbeite doch einfach mal ein OpenGL 3 Tutorial deiner Wahl von vorne durch. Im anderen Thread wurden ja bereits zwei verlinkt. Wenn du dann irgendetwas darin nicht verstehst, frägst du dazu nochmal nach.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: Fr Nov 29, 2013 18:49 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich verstehe nur noch Bahnhof.

Ich habe mal versucht 2 Dreiecke zu zeichnen, dies geht auch nicht.
Es währe schön wen man mal eine Basis hätte. Am besten mit 2 Dreiecke die farbig sind.

Mit glbegin, vertex2f glcolor3f war es so einfach, ich kann mir kaum vorstellen, das OpenGL 3.0 so schwer zu verstehen ist.

Code:
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
  9.   ExtCtrls, dglOpenGL, Windows;
  10.  
  11. type
  12.   TForm1 = class(TForm)
  13.     Timer1: TTimer;
  14.     procedure FormCreate(Sender: TObject);
  15.     procedure FormDestroy(Sender: TObject);
  16.     procedure FormPaint(Sender: TObject);
  17.     procedure FormResize(Sender: TObject);
  18.     procedure Timer1Timer(Sender: TObject);
  19.   private   { private declarations }
  20.     procedure Render;
  21.   public        { public declarations }
  22.     DC: HDC;  //Handle auf Zeichenfläche
  23.     RC: HGLRC;//Rendering Context  end;
  24.   end;
  25.  
  26. var
  27.   Form1: TForm1;
  28.  
  29. implementation
  30.  
  31. {$R *.lfm}
  32.  
  33. { TForm1 }
  34.  
  35. const
  36.   NearClipping = 1;
  37.   FarClipping = 1000;
  38.  
  39.   Winkel: integer = 10;
  40.  
  41.   g_vertex_buffer_data: array[0..8] of GLfloat =
  42.     (-1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 0.0, 1.0, 0.0);
  43.  
  44.   g_vertex_buffer_data2: array[0..8] of GLfloat =
  45.     (1.0, 1.0, 0.0, -1.0, 1.0, 0.0, 0.0, -1.0, 0.0);
  46.  
  47. var
  48.   vertexbuffer, vertexbuffer2: GLuint;
  49.  
  50.  
  51. procedure TForm1.FormCreate(Sender: TObject);
  52. begin
  53.   DC := GetDC(Handle);
  54.   if not InitOpenGL then
  55.     Application.Terminate;
  56.   RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  57.   ActivateRenderingContext(DC, RC);
  58.  
  59.   glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe: Hier ein leichtes Blau
  60.   glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren
  61.   glEnable(GL_CULL_FACE);           //Backface Culling aktivieren
  62.  
  63.   glGenBuffers(0, @vertexbuffer);
  64.   glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
  65.   glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data),
  66.     @g_vertex_buffer_data, GL_STATIC_DRAW);
  67.  
  68.   glGenBuffers(1, @vertexbuffer2);
  69.   glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer2);
  70.   glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data2),
  71.     @g_vertex_buffer_data2, GL_STATIC_DRAW);
  72.  
  73.   glVertexAttribPointer(0, 3, GL_FLOAT, False, 0, Pointer(0));
  74. end;
  75.  
  76. procedure TForm1.FormDestroy(Sender: TObject);
  77. begin
  78.   glDeleteBuffers(1, @vertexbuffer);
  79.   glDeleteBuffers(1, @vertexbuffer2);
  80.   DeactivateRenderingContext;
  81.   DestroyRenderingContext(RC);
  82.   ReleaseDC(Handle, DC);
  83. end;
  84.  
  85. procedure TForm1.FormPaint(Sender: TObject);
  86. begin
  87.   Render;
  88. end;
  89.  
  90. procedure TForm1.Render;
  91. begin
  92.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  93.  
  94.   glMatrixMode(GL_MODELVIEW);
  95.   glLoadIdentity;
  96.  
  97.   glTranslatef(0, 0, -5);
  98.   glRotatef(Winkel, 0, 0, 0);
  99.  
  100.   glEnableVertexAttribArray(0);
  101.   glDrawArrays(GL_TRIANGLES, 0, 3);
  102.   glDisableVertexAttribArray(0);
  103.  
  104.   glEnableVertexAttribArray(1);
  105.   glDrawArrays(GL_TRIANGLES, 0, 3);
  106.   glDisableVertexAttribArray(1);
  107.  
  108.   SwapBuffers(DC);
  109. end;
  110.  
  111.  
  112.  
  113. procedure TForm1.FormResize(Sender: TObject);
  114. begin
  115.   glViewport(0, 0, ClientWidth, ClientHeight);
  116.   glMatrixMode(GL_PROJECTION);
  117.   glLoadIdentity;
  118.   gluPerspective(45.0, ClientWidth / ClientHeight, NearClipping, FarClipping);
  119.  
  120.   glMatrixMode(GL_MODELVIEW);
  121.   glLoadIdentity;
  122. end;
  123.  
  124. procedure TForm1.Timer1Timer(Sender: TObject);
  125. begin
  126.   Inc(Winkel);
  127.   if Winkel = 360 then
  128.     winkel := 0;
  129.   Render;
  130. end;
  131.  
  132. end.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: Fr Nov 29, 2013 19:11 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Bei deinem ersten glGenBuffers übergibst du eine "0". Der erste Parameter ist aber kein Index sondern die Anzahl. siehe glGenBuffers

Kenne mich mit den VBOs zwar noch überhaupt nicht aus, aber ich schätze, dass man vor einem glDrawArray mindestens glBindBuffer aufrufen muss, damit OGL weiß welchen Buffer es überhaupt zeichnen soll.

Außerdem solltest du bei "glRotatef(Winkel, 0, 0, 0);" eine Achse wählen um die du drehen möchtest. Etwa die y-Achse "glRotatef(Winkel, 0, 1, 0);"

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: Fr Nov 29, 2013 19:18 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Was heißt denn schonwieder, du verstehst nur noch Bahnhof?
Der Immediate Mode wurde entfernt, weil unflexibel ist, langsam (Mehrere virtual calls pro Vertex + Overhead), redundant und auf komplex im Treiber ist.

Mit deinen aktuellen Code bist du erst auf halben Weg zum Ziel.
OpenGL 3.0 ist nicht schwerer zu verstehen, es unterscheidet sich bloß ziemlich von den Praktiken/Anforderungen die vor 10 Jahren modern/günstig waren.
Du bist außerdem auf keinen der genannten Kritikpunkte am Code eingegangen.
Mach es doch einfach mal für den Anfang genauso wie in einen der Tutorials: (Ich habe das Gefühl, mich zu wiederholen...)
www.opengl-tutorial.org
Da liest du dir mal wenigstens den "Basic"-Teil durch, übernimmst einfach den Code und experimentierst dann damit rum. Das erste Kapitel wird bei dir wahrscheinlich anders funktionieren, weil du ja mit Delphi arbeitest. Kontext hast du ja auch selber schon irgendwie erstellt, wenn auch keinen für OGL3 empfohlenen, im "Core-Modus".
Es werden da alle Philosophien aus dem neuen OpenGL erklärt und es gibt wirklich viel Code auch zwischen drin, denn man gut als Basis verwenden kann.

Ansonsten: Wenn du nicht mehr Eigeninitiative ergreifst und deine Verständisprobleme hier genauer vorträgst, wird dir niemand beim Umstieg helfen können!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: Fr Nov 29, 2013 19:39 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
den link würde ich nicht empfehlen,

sondern wieder http://arcsynthesis.org/gltut/

is sicher wieder Geschmackssache


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: Fr Nov 29, 2013 19:45 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Der Link sollte auch gut sein.
Es gibt sicher noch weitere OpenGL 3 Tutorials. Wichtig ist eigentlich nur die 3... :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: Fr Nov 29, 2013 21:06 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich habe mir den Quelltext von dem Tutorial angeschaut. und möglichst viel übernommen.
http://www.opengl-tutorial.org/beginner ... ored-cube/

Immerhin kann ich jetzt 2 Dreiecke darstellen, aber die Farbe will immer noch nicht.

Hat das etwa mit dem Shader zu tun, LoadShaders( "TransformVertexShader.vertexshader", "ColorFragmentShader.fragmentshader" ); kennt dglOpenGL nicht.
Und MatrixID hat was mit der Kamera zu tun oder ?

Code:
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8. Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
  9. ExtCtrls, dglOpenGL, Windows;
  10.  
  11. type
  12.   TForm1 = class(TForm)
  13.     Timer1: TTimer;
  14.     procedure FormCreate(Sender: TObject);
  15.     procedure FormDestroy(Sender: TObject);
  16.     procedure FormPaint(Sender: TObject);
  17.     procedure FormResize(Sender: TObject);
  18.     procedure Timer1Timer(Sender: TObject);
  19.   private   { private declarations }
  20.     procedure Render;
  21.     procedure SetupGL;
  22.   public        { public declarations }
  23.     DC: HDC;  //Handle auf Zeichenfläche
  24.     RC: HGLRC;//Rendering Context  end;
  25.   end;
  26.  
  27. var
  28.   Form1: TForm1;
  29.  
  30. implementation
  31.  
  32. {$R *.lfm}
  33.  
  34. { TForm1 }
  35.  
  36. const
  37.   NearClipping = 1;
  38.   FarClipping = 1000;
  39.   Winkel: integer = 10;
  40.  
  41.   g_vertex_buffer_data: array[0..17] of GLfloat =
  42.     (-1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 0.0, 1.0, 0.0,
  43.       2.0, -1.0, 0.0, 4.0, -1.0, 0.0, 3.0, 1.0, 0.0);
  44.   g_color_buffer_data: array[0..17] of GLfloat =
  45.     (1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0,
  46.      1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0);
  47.  
  48. var
  49.   vertexbuffer: GLuint;
  50.   colorbuffer: GLuint;
  51.   VertexArrayID : GLuint;
  52.  
  53. procedure TForm1.SetupGL;
  54. begin
  55.   glClearColor(0.3, 0.4, 0.7, 0.0);
  56.  
  57.   glEnable(GL_DEPTH_TEST);
  58.   glDepthFunc(GL_LESS);
  59.  
  60.   glGenVertexArrays(1, @VertexArrayID);
  61.   glBindVertexArray(VertexArrayID);
  62.  
  63.   glGenBuffers(1, @vertexbuffer);
  64.   glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
  65.   glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data),
  66.     @g_vertex_buffer_data, GL_STATIC_DRAW);
  67.  
  68.   glGenBuffers(1, @colorbuffer);
  69.   glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
  70.   glBufferData(GL_ARRAY_BUFFER, sizeof(g_color_buffer_data),
  71.     @g_color_buffer_data, GL_STATIC_DRAW);
  72. end;
  73.  
  74. procedure TForm1.Render;
  75. begin
  76.  
  77.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  78.  
  79.   glMatrixMode(GL_MODELVIEW);
  80.   glLoadIdentity;
  81.   glTranslatef(0, 0, -5);
  82.   glRotatef(Winkel, 0, 1, 0);
  83.  
  84.   glEnableVertexAttribArray(0);
  85.   glEnableVertexAttribArray(1);
  86.   glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
  87.   glVertexAttribPointer(0, 3, GL_FLOAT, False, 0, Pointer(0));
  88.  
  89.   glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
  90.   glVertexAttribPointer(1, 3, GL_FLOAT, False, 0, Pointer(0));
  91.  
  92.   glDrawArrays(GL_TRIANGLES, 0, 12);
  93.  
  94.   glDisableVertexAttribArray(0);
  95.   glDisableVertexAttribArray(1);
  96.  
  97.   SwapBuffers(DC);
  98. end;
  99.  
  100. procedure TForm1.FormCreate(Sender: TObject);
  101. begin
  102.   DC := GetDC(Handle);
  103.   if not InitOpenGL then
  104.     Application.Terminate;
  105.   RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  106.   ActivateRenderingContext(DC, RC);
  107.   SetupGL;
  108. end;
  109.  
  110. procedure TForm1.FormResize(Sender: TObject);
  111. begin
  112.   glViewport(0, 0, ClientWidth, ClientHeight);
  113.   glMatrixMode(GL_PROJECTION);
  114.   glLoadIdentity;
  115.   gluPerspective(45.0, ClientWidth / ClientHeight, NearClipping, FarClipping);
  116.  
  117.   glMatrixMode(GL_MODELVIEW);
  118.   glLoadIdentity;
  119. end;
  120.  
  121. procedure TForm1.FormPaint(Sender: TObject);
  122. begin
  123.   Render;
  124. end;
  125.  
  126. procedure TForm1.Timer1Timer(Sender: TObject);
  127. begin
  128.   Inc(Winkel);
  129.   if Winkel = 360 then
  130.     winkel := 0;
  131.   Render;
  132. end;
  133.  
  134. procedure TForm1.FormDestroy(Sender: TObject);
  135. begin
  136.   glDeleteBuffers(1, @vertexbuffer);
  137.   glDeleteBuffers(1, @colorbuffer);
  138.  
  139.   DeactivateRenderingContext;
  140.   DestroyRenderingContext(RC);
  141.   ReleaseDC(Handle, DC);
  142. end;
  143.  
  144. end.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mein erster Versuch mit OpenGL 3
BeitragVerfasst: Fr Nov 29, 2013 21:53 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Also, die Methode "LoadShaders" ist keine OpenGL Funktion sondern scheinbar eine Hilfsfunktion von der Tutorialseite.
Das erkennt man auch daran, dass kein "gl" als Präfix im Funktionsnamen ist.
Der Quellcode der Hilfsmethode, steht in Kapitel 2 ungefähr nach der Mitte der Seite.
Ich weiß nicht wie gut deine C++ Hintergrundkenntnisse sind, deshalb noch ein paar Hinweise vorweg:
  1. "printf"-Funktionen geben den Text einfach auf der Konsole aus zu Debugzwecken. Die Funktion ist eigentlich C und hat mit C++ nichts zu suchen. Kein guter Codestil... :P Naja sollte dir als Delphinutzer egal sein.
  2. Beim "Read the * Shader code from the file" wird einfach der Code aus den übergebenden Dateinamen eingelesen in denen du den Shaderquellcode gespeichert hast und in den entsprechenden "*ShaderCode"-String-Variablen gespeichert.
  3. "std::vector<char>" ist einfach ein ASCII-Buchstaben-Array der Länge die anschließend in den Klammern angegeben ist. Man könnte also auch einfach einen String nehmen.

Zu den genauen Delphiäquivalenten des Codes, kann ich dir leider echt nichts sagen, weil ich von der Sprache wenig Ahnung habe.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 24 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 ]