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

Aktuelle Zeit: Do Apr 25, 2024 13:03

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: VAO und VBO erzeugen
BeitragVerfasst: Mo Jan 13, 2014 22:34 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ist es erlaubt, die VBO und VBO so zu deklarieren ?
Es würde funktionieren, aber ob es Zufall ist.

Somit könnte ich für jedes Qbjekt (Cylinder, etc) eine eigene Classe erzeugen und muss nicht mit Zähler oder ähnlichen für die V?O arbeiten.
Code:
  1. var
  2.   //uiVBO: array[0..5] of UINT; // So war es früher
  3.   //uiVAO: array[0..2] of UINT; // 3 Objekte mit vertex und normalen
  4.  
  5.   quiVBO: array[0..1] of UINT;
  6.   quiVAO: array[0..0] of UINT;
  7.  
  8.   tuiVBO: array[0..1] of UINT;
  9.   tuiVAO: array[0..0] of UINT;
  10.  
  11.   cuiVBO: array[0..1] of UINT;
  12.   cuiVAO: array[0..0] of UINT;
  13.  
  14. procedure InitScene;    
  15. begin
  16. ....
  17.  // Setup whole triangle
  18.  
  19.   glGenVertexArrays(1, tuiVAO);
  20.   glGenBuffers(2, tuiVBO);
  21.  
  22.   glBindVertexArray(tuiVAO[0]);
  23.  
  24.   glBindBuffer(GL_ARRAY_BUFFER, tuiVBO[0]);
  25.   glBufferData(GL_ARRAY_BUFFER, sizeof(Triangle), @Triangle, GL_STATIC_DRAW);
  26.   glEnableVertexAttribArray(pos_id);
  27.   glVertexAttribPointer(pos_id, 3, GL_FLOAT, False, 0, nil);
  28.  
  29.   glBindBuffer(GL_ARRAY_BUFFER, tuiVBO[1]);
  30.   glBufferData(GL_ARRAY_BUFFER, sizeof(fTriangleNormale), @fTriangleNormale, GL_STATIC_DRAW);
  31.   glEnableVertexAttribArray(Normale_id);
  32.   glVertexAttribPointer(Normale_id, 3, GL_FLOAT, False, 0, nil);
  33.  
  34.   // Setup whole Quad
  35.  
  36.   glGenVertexArrays(1, quiVAO);
  37.   glGenBuffers(2, quiVBO);
  38.  
  39.   glBindVertexArray(quiVAO[0]);
  40.  
  41.   glBindBuffer(GL_ARRAY_BUFFER, quiVBO[0]);
  42.   glBufferData(GL_ARRAY_BUFFER, sizeof(fquad), @fQuad, GL_STATIC_DRAW);
  43.   glEnableVertexAttribArray(pos_id);
  44.   glVertexAttribPointer(pos_id, 3, GL_FLOAT, False, 0, nil);
  45.  
  46.   glBindBuffer(GL_ARRAY_BUFFER, quiVBO[1]);
  47.   glBufferData(GL_ARRAY_BUFFER, sizeof(fQuadColor), @fQuadColor, GL_STATIC_DRAW);
  48.   glEnableVertexAttribArray(col_id);
  49.   glVertexAttribPointer(col_id, 3, GL_FLOAT, False, 0, nil);
  50.  
  51.   // Setup whole Cube
  52.   glGenVertexArrays(1, cuiVAO);
  53.   glGenBuffers(2, cuiVBO);
  54.  
  55.   glBindVertexArray(cuiVAO[0]);
  56.  
  57.   glBindBuffer(GL_ARRAY_BUFFER, cuiVBO[0]);
  58.   glBufferData(GL_ARRAY_BUFFER, Size(Cylinder.Vertex), Pointer(Cylinder.Vertex), GL_STATIC_DRAW);
  59.   glEnableVertexAttribArray(pos_id);
  60.   glVertexAttribPointer(pos_id, 3, GL_FLOAT, False, 0, nil);
  61.  
  62.   glBindBuffer(GL_ARRAY_BUFFER, cuiVBO[1]);
  63.   glBufferData(GL_ARRAY_BUFFER, Size(Cylinder.Normale), Pointer(Cylinder.Normale), GL_STATIC_DRAW);
  64.   glEnableVertexAttribArray(Normale_id);
  65.   glVertexAttribPointer(Normale_id, 3, GL_FLOAT, False, 0, nil);
  66. ...
  67. end.
  68.  
  69. procedure TForm1.RenderScene;
  70. begin
  71.  ...
  72.   glBindVertexArray(tuiVAO[0]); // Triangle
  73.  
  74.   Matrix := NormalMatrix;
  75.   MatrixModif.Translate(Matrix, 0.0, 1.0, 0);
  76.   glUniformMatrix4fv(Matrix_id, 1, False, @Matrix);
  77.   glUniformMatrix4fv(MatrixCamera_id, 1, False, @CameraMatrix);
  78.   glUniform4f(VecColor_id, 1, 0, 0, 1);
  79.   glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
  80.  
  81.   glBindVertexArray(quiVAO[0]);  // Quad
  82.   glUniform4f(VecColor_id, 1, 0, 1, 1);
  83.   glDrawArrays(GL_TRIANGLE_STRIP, 8, 4);
  84.   glUniform4f(VecColor_id, 1, 1, 0, 1);
  85.   glDrawArrays(GL_TRIANGLE_STRIP, 4, 4);
  86.   glUniform4f(VecColor_id, 0, 1, 1, 1);
  87.   glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
  88.  
  89.   glBindVertexArray(cuiVAO[0]); // Cylinder
  90.  
  91.   Matrix := WurfelMatrix;
  92.   MatrixModif.Translate(Matrix, 0.0, -1.0, 0);
  93.   glUniformMatrix4fv(Matrix_id, 1, False, @Matrix);
  94.   glUniform4f(VecColor_id, 0, 1, 0, 1);
  95.   glDrawArrays(GL_TRIANGLES, 0, Length(Cylinder.Normale));
  96.  ...
  97.  
  98.   SwapBuffers(DC);                                
  99. end;
  100.  
  101. procedure Destroy;
  102. begin
  103.   //glDeleteBuffers(1, @uiVBO);
  104.   //glDeleteBuffers(1, @uiVAO);
  105.   glDeleteBuffers(1, @tuiVBO);
  106.   glDeleteBuffers(1, @tuiVAO);
  107.   glDeleteBuffers(1, @quiVBO);
  108.   glDeleteBuffers(1, @quiVAO);
  109.   glDeleteBuffers(1, @cuiVBO);
  110.   glDeleteBuffers(1, @cuiVAO);
  111. ...
  112. end;

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: VAO und VBO erzeugen
BeitragVerfasst: Mo Jan 13, 2014 22:43 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Also ich kann an dem Code jetzt nichts besonderes erkennen.
Wenn du die ID-Arrays meinst, ja natürlich kann man das so machen.
Wieso nicht?
Ich würde annehmen, dass in den meisten Anwendungen die IDs immer einzeln vorliegen und nicht in irgendwelchen Arrays oder ähnliches. Ich habe jedenfalls für mich alle OpenGL Objekte mit ihren Methoden in Klassen gekapselt. Mit DSA oder automatisch im Hintergrund durchgeführte Binds, kann ich es wie jedes andere Objekt nutzen.
Keine Binds, keine verwirrenden "gl*"-Aufrufe und kein Extensionswildwuchs im Anwendungscode. Dafür aber Typsicherheit, Syntaxvervollständigung und eine dünne Abstraktionsschicht, die das eine oder andere Übel verstecken kann. :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: VAO und VBO erzeugen
BeitragVerfasst: Mo Jan 13, 2014 22:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Den ersten Paramter bei deinen glDeleteBuffers-Aufrufen solltest du aber mal überprüfen.

_________________
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: VAO und VBO erzeugen
BeitragVerfasst: Mo Jan 13, 2014 22:52 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Sieht dies besser aus ?
Code:
  1. procedure Destroy;
  2. begin
  3.   //glDeleteBuffers(6, @uiVBO); // bei einer Array
  4.   //glDeleteBuffers(3, @uiVAO);
  5.   glDeleteBuffers(2, @tuiVBO);
  6.   glDeleteBuffers(1, @tuiVAO);
  7.   glDeleteBuffers(2, @quiVBO);
  8.   glDeleteBuffers(1, @quiVAO);
  9.   glDeleteBuffers(2, @cuiVBO);
  10.   glDeleteBuffers(1, @cuiVAO);
  11. ...
  12. end;

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: VAO und VBO erzeugen
BeitragVerfasst: Di Jan 14, 2014 09:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Jawohl. :)

_________________
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: VAO und VBO erzeugen
BeitragVerfasst: Mi Jan 15, 2014 00:26 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich habe unterdessen die VAOs und VBOs in eine Klasse verpackt.

Der Nachkomme der Klasse erzeugt bei WriteVetrex der Vertex und Normale.

Code:
  1. constructor TKoerper.Create;
  2. begin
  3.   inherited Create;
  4.   Color := vec4(1.0, 0.0, 0.0, 1.0);
  5.   Sektoren := 36;
  6.   glGenVertexArrays(1, @VAO);
  7.   glGenBuffers(1, @VBOvertex);
  8.   glGenBuffers(1, @VBOnormale);
  9. end;
  10.  
  11. destructor TKoerper.Destroy;
  12. begin
  13.   inherited Destroy;
  14.   glDeleteBuffers(1, @VAO);
  15.   glDeleteBuffers(1, @VBOvertex);
  16.   glDeleteBuffers(1, @VBOnormale);
  17. end;
  18.  
  19. procedure TKoerper.WriteVertex;
  20.  
  21.   function Size(var Vertex: TVertexArray): integer; inline;
  22.   begin
  23.     Result := SizeOf(Vertex[0]) * Length(Vertex);
  24.   end;
  25.  
  26. begin
  27.   glBindVertexArray(VAO);
  28.  
  29.   glBindBuffer(GL_ARRAY_BUFFER, VBOvertex);
  30.   glBufferData(GL_ARRAY_BUFFER, Size(Vertex), Pointer(Vertex), GL_STATIC_DRAW);
  31.   glEnableVertexAttribArray(Vertex_id);
  32.   glVertexAttribPointer(Vertex_id, 3, GL_FLOAT, False, 0, nil);
  33.  
  34.   glBindBuffer(GL_ARRAY_BUFFER, VBOnormale);
  35.   glBufferData(GL_ARRAY_BUFFER, Size(Normale), Pointer(Normale), GL_STATIC_DRAW);
  36.   glEnableVertexAttribArray(Normale_id);
  37.   glVertexAttribPointer(Normale_id, 3, GL_FLOAT, False, 0, nil);
  38. end;
  39.  
  40. procedure TKoerper.Draw;
  41. begin
  42.   glBindVertexArray(VAO);
  43.   glUniform4f(VecColor_id, Color[0], Color[1], Color[2], Color[3]);
  44.   glDrawArrays(GL_TRIANGLES, 0, Length(vertex));
  45. end;                                        
  46.  
  47. // Ein Nachkommen des TKoerper
  48.  
  49. procedure TCube.WriteVertex;
  50. begin
  51.   vertex := fCube;  // FCube ist eine Array mit Konstanten.
  52.   SetLength(normale, Length(vertex));
  53.   VertexModif.Normale(vertex, normale);
  54.   inherited;
  55. end;  


Im Hauptprogramm sieht es recht aufgeräumt aus.

Code:
  1. var
  2.   Wurfel: TCube;
  3.   CylinderLinks, CylinderMitte, CylinderRechts: TCylinder;  
  4. begin
  5. .... // Sonstiges für InitScene
  6.   Wurfel := TCube.Create;
  7.   Wurfel.Sektoren := 4;
  8.   Wurfel.WriteVertex;
  9.  
  10.   CylinderLinks := TCylinder.Create;
  11.   CylinderLinks.Sektoren := 13;
  12.   CylinderLinks.Color := vec4(1, 1, 0, 1);
  13.   CylinderLinks.WriteVertex;
  14.  
  15.   CylinderMitte := TCylinder.Create;
  16.   CylinderMitte.Sektoren := 3;
  17.   CylinderMitte.Color := vec4(1, 0, 1, 1);
  18.   CylinderMitte.WriteVertex;
  19.  
  20.   CylinderRechts := TCylinder.Create;
  21.   CylinderRechts.Sektoren := 5;
  22.   CylinderRechts.Color := vec4(0, 1, 1, 1);
  23.   CylinderRechts.WriteVertex;
  24. end.
  25.  
  26. // Bei Draw kommt nur noch dies:
  27.  
  28. CylinderLinks.Draw;  

CylinderRects... etc.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 101 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 5.218s | 17 Queries | GZIP : On ]