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

Aktuelle Zeit: So Mai 19, 2024 04:52

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Problem mit Vertexarray
BeitragVerfasst: So Jul 07, 2013 23:07 
Offline
DGL Member

Registriert: Sa Apr 09, 2011 20:48
Beiträge: 43
Programmiersprache: Delphi
Hallo,

ich habe einen funktionierenden Vertexarray-Code. Diesen wollte ich jetzt erweitern, damit auch
Normale mit übergeben werden.
Dazu schreibe ich in das Vertexarray die Werte in folgender Weise:
Vertex.X, Vertex.Y, Vertex.Z, Normal.X, Normal.Y, Normal.Z
Also 6 glFloat-Werte hintereinander.

ich habe dazu folgenden Render-Code:
Code:
  1.  
  2. type
  3.   TVertex = packed record
  4.     x, y, z : glFloat;
  5.     nx, ny, nz : glFloat;
  6.   end;
  7.   ...
  8.   ...
  9.   ...
  10. function Draw;
  11. begin
  12.   glEnableVertexAttribArray(0);
  13.   glBindBuffer(GL_ARRAY_BUFFER, vbo);
  14.  
  15.   glVertexPointer(3,GL_FLOAT,0, @arVertex[0].x); // für Vertices
  16.   glNormalPointer(GL_FLOAT, 12, @arVertex[0].nx); // für Normals
  17. //  glVertexAttribPointer(0,3,GL_FLOAT, false, 0,0); // Aufruf für reines Vertexarray ohne normals
  18.  
  19.   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
  20.  
  21.   case DrawMode of
  22.     mdmTriangles: glDrawElements(GL_TRIANGLES, isize, GL_UNSIGNED_INT, 0);
  23.     mdmQuads: glDrawElements(GL_QUADS, isize, GL_UNSIGNED_INT, 0);
  24.   end;
  25.  
  26.   glDisableVertexAttribArray(0);
  27. end;
  28.  


Beim Befehl glDrawElements gibt es dann eine Exception.
Ich habe mittlerweile alle Arrays und Größenangaben überprüft. Da ist alles in Ordnung.
Die Arrays sind korrekt gefüllt. Was ich vermute ist, das ich OpenGL nicht klarmachen kann, welche Werte
welche Bedeutung haben, bzw. die Abstände oder Pointer nicht stimmen.

Mit dem glVertexAttribPointer und einem Array ohne Normals funktioniert alles einwandfrei.
Mit den Aufrufen von glVertexPointer/glNormalPointer und dem Array mit Normals kracht es.
Benutze ich die falschen Funktionen (glVertexPointer)?
Muss ich glVertexAttribPointer benutzen?
Aber wie übergebe ich glVertexAttribPointer die richtigen Werte für die Normals im Array?
Oder sollte ich vielleicht mal ne Pause machen?

:cry:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit Vertexarray
BeitragVerfasst: Mo Jul 08, 2013 07:50 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Hey,

was beinhaltet 'vbo'? Ist das ein VBO mit dem gleichen Inhalt wie 'arVertex'? In dem Fall solltest du den letzten Parameter von glXXXPointer durch das byte offset des Attributs im VBO ersetzen. Da du aus einem VBO (VRAM) und keinem Vertex Array (RAM) renderst. (siehe http://wiki.delphigl.com/index.php/glVertexPointer)
Für glVertexPointer wäre das dann 0 und bei glNormalPointer 3 * sizeof(float)

Zur Frage glVertexPointer vs glVertexAttribPointer:
glVertexAttribPointer ist nur eine generellere Variante. D.h. damit bist du nicht auf von ogl verständliche Repräsentationen für Vertices, Normals, UVs oder Farben beschränkt, sondern kannst alles irgendwie darstellbare als Vertex Attribut übergeben.

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit Vertexarray
BeitragVerfasst: Mo Jul 08, 2013 08:17 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
am besten du nimmst direkt das sizeof fuer eine struct, statt irgendwelche wilden Werte.
Code:
  1.  
  2. size_t stride = sizeof(vertex_t);
  3. glNormalPointer(GL_SHORT, stride, vertex.normal);
  4. glTexCoordPointer (2, GL_SHORT, stride, vertex.texcoord);
  5. glVertexPointer (3, GL_FLOAT, stride, vertex.position);  
  6.  

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit Vertexarray
BeitragVerfasst: Mo Jul 08, 2013 20:46 
Offline
DGL Member

Registriert: Sa Apr 09, 2011 20:48
Beiträge: 43
Programmiersprache: Delphi
Ich denke ich habe irgendwo grundsätzlich etwas nicht verstanden.
Deshalb gehe ich jetzt mal die wiki-quellen durch und versuche mal von gaaaanz vorne das Erstellen und Bearbeiten dieser Arrays durchzugehen.

Nur als Beispiel warum Wikis alleine oft nicht wirken.
Ich hatte vor kurzem erst mit CallLists angefangen. Nach dem ich die erste CallList laufen hatte, packte ich eine zweite dazu.
Schon fingen die Probleme an. Aber...was ich nirgendwo rausgelesen hatte war, das die CallLists seriell vergeben werden und deshalb zentral verwaltet werden müssen.

Und da hab ich schon meine erste Frage beim ersten Befehl zu den Arrays.
glGenBuffers(integer n, Cardinal Pointer(buffers));
Parameter n ist ja klar: Die Anzahl der zu generierenden Buffer.
Allerdings ist Parameter 2 nicht ganz so klar. Im Wiki steht dazu:
"Specifies an array in which the generated buffer object names are stored."
Das "buffer object names" keine Namen sind ist mir schon klar :-)
Aber was heisst das jetzt im klartext?
Was wäre wenn ich folgendes Konstrukt erstelle:

Code:
  1.  
  2. var
  3.    buf : array[0..3] of integer;
  4.    vbo : integer;
  5.    ibo : integer;
  6.  
  7. procedure CreateBuffers;
  8. begin
  9.   glGenBuffers(4,@buf[0]);
  10.   glGenBuffers(1,@vbo);
  11.   glGenBuffers(1,@ibo);
  12. end;
  13.  


Funktionieren müsste dann ja:
glBindBuffer(GL_ARRAY_BUFFER, buf[0]);
glBindBuffer(GL_ARRAY_BUFFER, buf[1]);
etc... und
glBindBuffer(GL_ARRAY_BUFFER, vbo);

Nach meinem Verständnis ist der zweite Parameter einfach nur eine Nummer auf einem Schlüssel, die mir sagt in welchem Schliessfach sich die Daten befinden.
Im ersten Fall habe ich sogar einen Schlüssel der auf mehrere hintereinanderfolgende Schliessfächer passt.
Ich brauche nur die Nummer des ersten Schliessfachs, dann erhöhe ich die Nummer um eins und bin beim nächsten Schliessfach.

Funktioniert das so?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit Vertexarray
BeitragVerfasst: Di Jul 09, 2013 07:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Wenn ich dich jetzt richtig verstanden habe, dann ja. Aber nur um noch einmal auf Nummer sicher zu gehen (wird halt oft falsch gemacht):
Du uebergibst OpenGL an dieser Stelle genau wie bei Texturen und co nur eine Speicheraddresse und keine Nummern. OpenGL schreibt dir an diese Addresse dann n-Namen hintereinander weg. In OpenGL sind Namen einfache Integer daher ist @buf[0]+(sizeof(integer)*i) gleich @buf[i] (sofern Pascal nicht voellig anders arbeitet). Allerdings solltest du beachten das (buf[0]) + i nicht buf[i] ist (wenn ja ist es Zufall!... ein haeufiger Zufall aber ein Zufall).

Ich persoehnlich wuerde uebrigens immer nur 1 erzeugen lassen. Macht das ganze i.d.R. etwas uebersichtlicher und stabiler.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit Vertexarray
BeitragVerfasst: Mi Jul 10, 2013 20:28 
Offline
DGL Member

Registriert: Sa Apr 09, 2011 20:48
Beiträge: 43
Programmiersprache: Delphi
Hab ich so verstanden und Delphi macht genau das gleiche mit dem Befehl array[0..3] of integer.
Also kein Problem.
Danke auch an Dich.


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 12 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.008s | 14 Queries | GZIP : On ]