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

Aktuelle Zeit: Do Mär 28, 2024 09:42

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Vertex-Daten auslesen
BeitragVerfasst: So Nov 23, 2014 18:09 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich habe versucht der Vertex-Daten von der Grafikkarte einzulesen, aber ohne Erfolg, bei Writeln kommt nur 9x 0.0;

Ist dies überhaupt möglich ?

Code:
  1. type
  2.   TVertex3f = array[0..2] of GLfloat;
  3.   TFace = array[0..2] of TVertex3f;
  4.  
  5. const
  6.   Triangle: array[0..0] of TFace =
  7.     (((-0.8, 0.8, 0.0), (0.8, 0.8, 0.0), (0.0, -0.8, 0.0)));
  8.   Quad: array[0..1] of TFace =
  9.     (((-0.2, -0.6, 0.0), (-0.2, -0.1, 0.0), (0.2, -0.1, 0.0)),
  10.     ((-0.2, -0.6, 0.0), (0.2, -0.1, 0.0), (0.2, -0.6, 0.0)));
  11.  
  12. type
  13.   TVB = record
  14.     VAO,
  15.     VBO: GLuint;
  16.   end;
  17.  
  18. var
  19.   VBTriangle, VBQuad: TVB;
  20.  
  21. procedure TForm1.InitScene;
  22. begin
  23.   Shader:=TShader.Create('VertexShader.txt', 'FragmentShader.txt');
  24.  
  25.   glClearColor(0.0, 0.5, 1.0, 1.0); //Hintergrundfarbe: Hier ein leichtes Blau
  26.  
  27.   glGenVertexArrays(1, @VBTriangle.VAO);
  28.   glGenVertexArrays(1, @VBQuad.VAO);
  29.  
  30.   glGenBuffers(1, @VBTriangle.VBO);
  31.   glGenBuffers(1, @VBQuad.VBO);
  32.  
  33.   glBindVertexArray(VBTriangle.VAO);
  34.  
  35.   glBindBuffer(GL_ARRAY_BUFFER, VBTriangle.VBO);
  36.   glBufferData(GL_ARRAY_BUFFER, sizeof(Triangle), @Triangle, GL_STATIC_DRAW);
  37.   glEnableVertexAttribArray(0);
  38.   glVertexAttribPointer(0, 3, GL_FLOAT, False, 0, nil);
  39.  
  40.  
  41.   glBindVertexArray(VBQuad.VAO);
  42.  
  43.   glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBO);
  44.   glBufferData(GL_ARRAY_BUFFER, sizeof(Quad), @Quad, GL_STATIC_DRAW);
  45.   glEnableVertexAttribArray(0);
  46.   glVertexAttribPointer(0, 3, GL_FLOAT, False, 0, nil);
  47. end;
  48.  
  49. procedure TForm1.Auslesen;  // Versuch, die Daten auszulesen.
  50. var
  51.   TempTriangle: array[0..8] of glFloat;
  52.   i: integer;
  53. begin
  54.   for i := 0 to Length(TempTriangle) - 1 do begin
  55.     TempTriangle[i] := 0;
  56.   end;
  57.   glBindVertexArray(VBTriangle.VAO);
  58.  
  59.   glBindBuffer(GL_ARRAY_BUFFER, VBTriangle.VBO);
  60.   //  glBufferData(GL_ARRAY_BUFFER, sizeof(TempTriangle), @TempTriangle, GL_STATIC_Read);
  61.   //  glEnableVertexAttribArray(0);
  62.  
  63.  
  64.   //    glBufferData(GL_ARRAY_BUFFER, sizeof(TempTriangle), nil, GL_STATIC_Read);
  65.   glGetBufferSubData(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sizeof(TempTriangle), @TempTriangle);
  66.   //  glVertexAttribPointer(0, 3, GL_FLOAT, False, 0, nil);
  67.  
  68.   for i := 0 to Length(TempTriangle) - 1 do begin
  69.     writeln(TempTriangle[i]);
  70.   end;
  71.   writeln; 
  72. end;
  73.  
  74. procedure TForm1.RenderScene;
  75. begin
  76.   glClear(GL_COLOR_BUFFER_BIT);
  77.  
  78.   // Zeichen Dreieck
  79.   glBindVertexArray(VBTriangle.VAO);
  80.   glDrawArrays(GL_TRIANGLES, 0, Length(Triangle) * 3);
  81.  
  82.   // Zeichne Quadrat
  83.   glBindVertexArray(VBQuad.VAO);
  84.   glDrawArrays(GL_TRIANGLES, 0, Length(Quad) * 3);
  85.  
  86.   OpenGLControl1.SwapBuffers;
  87. end;    

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex-Daten auslesen
BeitragVerfasst: So Nov 23, 2014 19:30 
Offline
DGL Member
Benutzeravatar

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

wieso übergibst du GL_TRANSFORM_FEEDBACK_BUFFER an glGetBufferSubData? Das sollte in deinem Fall mit GL_ARRAY_BUFFER aufgerufen werden. Das Transform-Feedback musst du erst entsprechend initialisieren, eh du das nutzen kannst.

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: Vertex-Daten auslesen
BeitragVerfasst: So Nov 23, 2014 19:56 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Danke, jetzt kommen die richtigen Daten.

Kann man auch auslesen, wie lange die Vertex-Array ist ?

Code:
  1. procedure TForm1.Auslesen;
  2. var
  3.   TempTriangle: array[0..8] of glFloat;
  4.   i: integer;
  5. begin
  6.   for i := 0 to Length(TempTriangle) - 1 do begin
  7.     TempTriangle[i] := 0;
  8.   end;
  9.   glBindVertexArray(VBTriangle.VAO); 
  10.   glBindBuffer(GL_ARRAY_BUFFER, VBTriangle.VBO);
  11.  
  12.   Laenge := glBufferSize // im Still von sowas ?
  13.  
  14.   glGetBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(TempTriangle), @TempTriangle);
  15.  
  16.   for i := 0 to Length(TempTriangle) - 1 do begin
  17.     writeln(TempTriangle[i]);
  18.   end;
  19.   writeln;
  20. end;

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex-Daten auslesen
BeitragVerfasst: So Nov 23, 2014 21:01 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Stichwort: glGetBufferParameter ;)

_________________
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: Vertex-Daten auslesen
BeitragVerfasst: So Nov 23, 2014 22:37 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Jetzt geht es. :D

Was ist eigentlich der Sinn, das man die Daten auslesen kann, können die in der Graka manipuliert werden.
Man kann ja genauso gut die Daten nach glBufferData im Hauptspeicher nicht löschen.

Code:
  1. procedure TForm1.Auslesen(VB: TVB);
  2. var
  3.   TempTriangle: array of glFloat;
  4.   i: integer;
  5.   l: GLint;
  6. begin
  7.   glBindVertexArray(VB.VAO);
  8.   glBindBuffer(GL_ARRAY_BUFFER, VB.VBO);
  9.  
  10.   glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, @l);
  11.   l := l div 4;
  12.   SetLength(TempTriangle, l);
  13.   Writeln('Länge: ', l);
  14.  
  15.   for i := 0 to l - 1 do begin
  16.     TempTriangle[i] := 0;
  17.   end;
  18.   glGetBufferSubData(GL_ARRAY_BUFFER, 0, l * SizeOf(glFloat), Pointer(TempTriangle));
  19.  
  20.   for i := 0 to l - 1 do begin
  21.     writeln(TempTriangle[i]);
  22.   end;
  23.   writeln;
  24. end;  

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex-Daten auslesen
BeitragVerfasst: So Nov 23, 2014 22:51 
Offline
DGL Member
Benutzeravatar

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

ja das ist der Sinn von VBOs. Die Daten nochmal im RAM zu halten macht nur Sinn, wenn man die noch für irgendwelche Berechnungen braucht und nicht jedesmal die Daten zwischen RAM und VRAM hin und her schaufeln will. Die Daten können von der Graka manipuliert werden. z.B. für eine Partikel-Engine mit GPU unterstützung. Dafür nutzt man dann das Transform Feedback (mit 2 alternierenden VBOs) und manipuliert dann die Positions-Daten der Partikel auf der Graka.
Eine Alternative zum glGetBuffer(Sub)Data wäre glMapBuffer damit werden die VBO-Daten im VRAM in den Client-AddressSpace gemappt und man kann dort lesend und schreibend zugreifen. Das ist ganz nützlich wenn man Mesh's im nachhinein deformieren möchte und es ist performanter als glGetBufferData, weil man nur die Daten überträgt, die man auch wirklich liest, bzw. schreibt.

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: Vertex-Daten auslesen
BeitragVerfasst: Mo Nov 24, 2014 18:04 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Bei meine Animation mit dem Niveau-Anzeiger(Lazarus Version) habe ich die ganzen Vertex-Daten im RAM, weil ich als Option die Daten als Datei speichern kann, für meine Android und Java-Script Animation.
Aber wen man nachträglich die Daten aus dem VRAM holen kann, kann ich die Daten aus dem RAM löschen, was mein Programm aufgeräumter macht.

Für was kann man in der Methode
Code:
  1. glBufferData(GL_ARRAY_BUFFER, sizeof(Triangle), @Triangle, GL_STATIC_DRAW);

GL_STATIC_READ schreiben ?
Zuerst dachte ich man könnte so die Vertex-Daten auslesen.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex-Daten auslesen
BeitragVerfasst: Mo Nov 24, 2014 18:49 
Offline
DGL Member
Benutzeravatar

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

die Nutzung des Buffers (aka GL_STATIC_READ) ist dazu da, das der Treiber die Zugriffe auf die Daten optimieren kann.
GL_STATIC_READ bedeutet so viel wie: Daten einmal ins VBO laden und dann oft im Client lesen.
Eine Liste der Parameter gibts auch im Wiki: glBufferData

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  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 27 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 : 0.032s | 17 Queries | GZIP : On ]