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

Aktuelle Zeit: Fr Jul 18, 2025 12:42

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



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Aufbau von Gl-Normal-Array
BeitragVerfasst: Mo Mär 20, 2006 18:41 
Offline
DGL Member

Registriert: Mo Mär 20, 2006 18:24
Beiträge: 2
Hallo,
um direkt zum Punkt zu kommen:

Code:
  1.  
  2. glBegin(draw-mode);
  3.    for(c from 0 below tri.indices-count)
  4.      let i = tri.indices[c];
  5.      glNormal3f(tri.normals[c * 3], tri.normals[c * 3 + 1], tri.normals[c * 3 + 2]);
  6.      glVertex3f(tri.vertices[i * 3], tri.vertices[i * 3 + 1], tri.vertices[i * 3 + 2]);
  7.    end for;
  8. glEnd();
  9.  

funktioniert, ist aber schrecklich langsam.

Code:
  1.  
  2. glEnableClientState($GL-NORMAL-ARRAY);
  3. glEnableClientState($GL-VERTEX-ARRAY);
  4.   glNormalPointer($GL-FLOAT, 0, renderer.geometry.normals);
  5.   glVertexPointer(3, $GL-FLOAT, 0, renderer.geometry.vertices);
  6.   glDrawElements(draw-mode, tri.indices-count, $GL-UNSIGNED-INT, tri.indices);
  7. glDisableClientState($GL-NORMAL-ARRAY);
  8. glDisableClientState($GL-VERTEX-ARRAY);
  9.  

sollte doch eigentlich das gleiche machen, dem ist aber nicht so.
Die Geometrie stimmt, die Belichtung jedoch nicht - mit den Normalen stimmt also irgendwas nicht.

Leider hab ich nirgend gefunden, wie genau das Normalen-Array aufgebaut sein muss, damit glDrawElements richtig funktioniert. Hat jemand einen Tipp?

Ich danke schonmal im Vorraus,
Tobias

PS: Ist kein Delphi, ich weiß - aber Opengl ist ja unabhängig von der Programmiersprache.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 20, 2006 20:02 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Soweit ich das jetzt verstehe hast du einen Array von Normalen und für jeden Normalvektor einen dazugehörenden Vertex. Ein Vertex kann aber von mehreren Normalen verwendet werden. Also der typische Würfel mit Flat-Shading hat dadurch 8 Vertices (für jeden Eckpunkt einer), aber wenn er mit Quads gezeichnet wird 4*6 = 24 Normalvektoren. Seh ich das richtig so?

Generell kannst du wenn du einen Array renderst ein Array-Element nur doppelt verwenden wenn _alle_ Daten gleich sind, also gleiche Vertexposition, gleicher Normalvektor und bei Bedarf auch gleiche Texturcoordinate(n) und Farbe. Möglicherweise gibts eine Extension die was anderes erlaubt aber bei der OGL 1.1 Funktionalität ist das nicht drinnen.

Also mal Pseudocode wie du aus deinem oben angegebenen render-Code einen renderbaren array machen kannst:

Code:
  1.  NormalenArray = float-Array der größe tri.indices-count * 3
  2.  VertexArray = float-Array der größe tri.indices-count * 3   // beide beinhalten gleich viele (verwendete) Elemente, das ist mal Grundvoraussetzung
  3.  
  4.  for(c from 0 below tri.indices-count)
  5.    let i = tri.indices[c];
  6.    NormalenArray[ c * 3 ] = tri.normals[c * 3];
  7.    NormalenArray[ c * 3 + 1] = tri.normals[c * 3 + 1];
  8.    NormalenArray[ c * 3 + 2] = tri.normals[c * 3 + 2];
  9.    VertexArray[ c * 3 ] =  tri.vertices[i * 3];
  10.    VertexArray[ c * 3 + 1] =  tri.vertices[i * 3 + 1];
  11.    VertexArray[ c * 3 + 2] =  tri.vertices[i * 3 + 2];
  12.  end for;


NormalenArray und tri.normals unterscheidet sich hier natürlich nicht, hab es nur gemacht weil dann beide ähnliche Namen haben :-). Da du jetzt die indices nicht mehr verwendest, machst du das auch nicht mehr über DrawElements, sondern über DrawArrays, also
Code:
  1.  
  2.   glNormalPointer($GL-FLOAT, 0, NormalenArray);
  3.   glVertexPointer(3, $GL-FLOAT, 0, VertexArray);
  4.  
  5.   glDrawArrays( draw-mode, 0, tri.indices-count );
  6.  


Indizes machen wie gesagt nur dann einen Sinn wenn Normale und Vertex des öfteren exakt gleich sind. Wenn deine Daten für Flat Shading gedacht sind, dann wird das so gut wie nie der Fall sein, bei Smooth-Shading hingegen sehr oft. Wenn du Smooth-Shading haben möchtest wundert mich jedoch deine Datenstruktur ein bisschen ...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 21, 2006 00:36 
Offline
DGL Member

Registriert: Mo Mär 20, 2006 18:24
Beiträge: 2
Ah vielen Dank, das hat schon viel geholfen.
Der Kniff war schon die Methode drawArrays statt drawElements, bzw, das Aufdröseln der Vertcies. Mit dem Shading muss ich noch probieren - muss zugeben, dass ich na noch nicht so firm bin. Bisschen weiter in die Materie einlesen.

Also ich sag Danke, und melde mich nochmal, wenns was zu berichten gibt.


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


Wer ist online?

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