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

Aktuelle Zeit: Fr Jul 18, 2025 16:34

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Interleaved Arrays
BeitragVerfasst: Sa Sep 08, 2007 16:56 
Offline
DGL Member

Registriert: Fr Aug 31, 2007 07:25
Beiträge: 12
Hallo!Ich bins schon wieder,aber diesmal hoffe ich mit ner leichten Frage,ich würde gerne aus den folgenden Daten ein einziges Array machen,hab schon eins gemacht,wo farbe normale vertex immer schön abwechselnd hintereinander liegen(also eine Farbe,eine Normale und ein Punkt),aber ich hätte gerne,dass z.B. erst die komplette Farbe,dann Normalen,dann Vertices sind!Hier mal die drei Arrays,muss ich dann bei glinterleaved bestimmt auch noch was ändern,oder?
Code:
  1. GLfloat vertices[] = {1,1,1,  -1,1,1,  -1,-1,1,  1,-1,1,        // v0-v1-v2-v3
  2.                       1,1,1,  1,-1,1,  1,-1,-1,  1,1,-1,        // v0-v3-v4-v5
  3.                       1,1,1,  1,1,-1,  -1,1,-1,  -1,1,1,        // v0-v5-v6-v1
  4.                       -1,1,1,  -1,1,-1,  -1,-1,-1,  -1,-1,1,    // v1-v6-v7-v2
  5.                       -1,-1,-1,  1,-1,-1,  1,-1,1,  -1,-1,1,    // v7-v4-v3-v2
  6.                       1,-1,-1,  -1,-1,-1,  -1,1,-1,  1,1,-1};   // v4-v7-v6-v5
  7. // normal array
  8. GLfloat normals[] = {0,0,1,  0,0,1,  0,0,1,  0,0,1,             // v0-v1-v2-v3
  9.                      1,0,0,  1,0,0,  1,0,0, 1,0,0,              // v0-v3-v4-v5
  10.                      0,1,0,  0,1,0,  0,1,0, 0,1,0,              // v0-v5-v6-v1
  11.                      -1,0,0,  -1,0,0, -1,0,0,  -1,0,0,          // v1-v6-v7-v2
  12.                      0,-1,0,  0,-1,0,  0,-1,0,  0,-1,0,         // v7-v4-v3-v2
  13.                      0,0,-1,  0,0,-1,  0,0,-1,  0,0,-1};        // v4-v7-v6-v5
  14. // color array
  15. GLfloat colors[] = {1,1,1,  1,1,0,  1,0,0,  1,0,1,              // v0-v1-v2-v3
  16.                     1,1,1,  1,0,1,  0,0,1,  0,1,1,              // v0-v3-v4-v5
  17.                     1,1,1,  0,1,1,  0,1,0,  1,1,0,              // v0-v5-v6-v1
  18.                     1,1,0,  0,1,0,  0,0,0,  1,0,0,              // v1-v6-v7-v2
  19.                     0,0,0,  0,0,1,  1,0,1,  1,0,0,              // v7-v4-v3-v2
  20.                     0,0,1,  0,0,0,  0,1,0,  0,1,1};             // v4-v7-v6-v5
  21.  
  22.  
  23.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 08, 2007 21:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also wie du daraus ein großes Array erzeugst kann ich dir nicht genau sagen. Das einfachste wäre wohl es eben auch als ein Array zu definieren. Wobei so etwas wie die Farben auch mal ganz bequem auch nur bytes sein können und damit könnte man es so nicht mehr machen. Wie in dem VBO Tutorial auch gezeigt könntest du auch ein Array von Structs erzeugen. Damit könntest du verschiedene Typen mischen und wärst auch glInterleaved kompatibel.

Wenn du die Daten so ablegst wie du es jetzt vor hast wirst du mit glInterleaved nicht weit kommen. Denn Interleaved setzt es zwingend vorraus, dass die Daten eines Vertex am Stück kommen. Aber das maht auch nichts. Du kannst auch mit den Methoden glVertexPointer, glColorPointer und glNormalPointer (etc.) arbeiten. Du musst dann nur für stride eine 0 angeben. Bzw der Pointer ist bei einem VBO der Offset innerhalb des Buffers. Also NULL (0) für den Anfang des Buffers. Damit definierst du alle Elemente die du benutzen möchtest und aktivierst diese mit glEnableClientState. Und das war es auch schon.

Das glInterleaved macht intern auch nichts anderes nur, dass es ein paar gebräuchliche Schemen vordefiniert. Allerdings sobald man etwas machen möchte was geringfügig anders ist muss man es alles per Hand machen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 09, 2007 08:21 
Offline
DGL Member

Registriert: Fr Aug 31, 2007 07:25
Beiträge: 12
Das habe ich schon verstanden und finde es mit glvertexpointer etc ja auch viel besser,trotzdem würde ich gerne herausbekommen,ob es möglich ist,z.B. nur Farben für jeden einzelnen Punkt und die Vertices einfach hintereinander in das Array zu packen.Ein Array mit Farbe Punkt Farbe Punkt Farbe Punkt und das 24 Mal für einen Würfel habe ich schon gemacht,und dann mit glinterleavedarrays(GL_C3F_V3F,0,interleaved)aufgerufen!Das funktioniert auch!Nun möchte ich aber lieber 24 Farben dann 24 Vertices definieren!Hier mal das Vertex mit abwechselnd Farbe und Vertex:
Code:
  1. GLfloat interleaved[] = {       1,1,1, 1,1,1,  1,1,0, -1,1,1,  1,0,0, -1,-1,1, 1,0,1, 1,-1,1,              // v0-v1-v2-v3
  2.                                 1,1,1, 1,1,1,  1,0,1, 1,-1,1,  0,0,1, 1,-1,-1,  0,1,1, 1,1,-1,              // v0-v3-v4-v5
  3.                                 1,1,1, 1,1,1,  0,1,1, 1,1,-1,  0,1,0, -1,1,-1,  1,1,0, -1,1,1,              // v0-v5-v6-v1
  4.                                 1,1,0, -1,1,1,  0,1,0, -1,1,-1,  0,0,0, -1,-1,-1,  1,0,0, -1,-1,1,              // v1-v6-v7-v2
  5.                                 0,0,0, -1,-1,-1,  0,0,1, 1,-1,-1,  1,0,1, 1,-1,1,  1,0,0, -1,-1,1,              // v7-v4-v3-v2
  6.                                 0,0,1, 1,-1,-1,  0,0,0, -1,-1,-1,  0,1,0, -1,1,-1,  0,1,1, 1,1,-1};

Und hier wie ich das Array gerne hätte,weiss aber nicht wie der Aufruf lauten würde,falls es so einen gibt:
Code:
  1. GLfloat neu[] =      {1,1,1,  1,1,0,  1,0,0,  1,0,1,              // v0-v1-v2-v3
  2.                     1,1,1,  1,0,1,  0,0,1,  0,1,1,              
  3.                     1,1,1,  0,1,1,  0,1,0,  1,1,0,              // Die Farben
  4.                     1,1,0,  0,1,0,  0,0,0,  1,0,0,              
  5.                     0,0,0,  0,0,1,  1,0,1,  1,0,0,              
  6.                     0,0,1,  0,0,0,  0,1,0,  0,1,1,
  7.                     1,1,1,  -1,1,1,  -1,-1,1,  1,-1,1,        
  8.                       1,1,1,  1,-1,1,  1,-1,-1,  1,1,-1,        //Vertex-Array
  9.                       1,1,1,  1,1,-1,  -1,1,-1,  -1,1,1,        
  10.                       -1,1,1,  -1,1,-1,  -1,-1,-1,  -1,-1,1,    
  11.                       -1,-1,-1,  1,-1,-1,  1,-1,1,  -1,-1,1,    
  12.                       1,-1,-1,  -1,-1,-1,  -1,1,-1,  1,1,-1};
[/quote]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 09, 2007 09:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
void InterleavedArrays( enum format, sizei stride,
void *pointer );
efficiently initializes the six arrays and their enables to one of 14 configurations.
format must be one of 14 symbolic constants: V2F,
V3F, C4UB_V2F, C4UB_V3F, C3F_V3F, N3F_V3F, C4F_N3F_V3F, T2F_V3F,
T4F_V4F, T2F_C4UB_V3F, T2F_C3F_V3F, T2F_N3F_V3F, T2F_C4F_N3F_V3F, or
T4F_C4F_N3F_V4F.

UB = Unsigned Byte

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 09, 2007 10:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
WhiteHunter: Was möchtest du damit sagen?

framueller: Also. Für die Daten in einem VBO hast du 2 generelle Möglichkeiten.

1. Du packst die Daten der einzelnen Vertices hintereinander in den Speicher. Das würde dann so aussehen.
Code:
  1. VERTEX | COLOR | VERTEX | COLOR | ...
Dann kannst du mit glInterleaved arbeiten.

2. Du kannst auch zu erst alle Vertices und dann alle Farben in den Buffer packen.
Code:
  1. VERTEX | VERTEX | ... | COLOR | COLOR | ...
Dann musst du deine Daten aber mit gl*Pointer deine Daten beschreiben.
Das Problem hierbei ist aber, dass du das so nur bedingt direkt im Code definieren kannst. Da es sich um ein Array handeln müsste und dabei müssten alle Felder den gleichen Typen haben. Wenn du für die Farbe auch GLFloat benutzt geht das. Aber eine Farbe braucht so 12 bzw 16 Bytes und sonst nur 3 bzw 4. Aber es hat dann einen anderen Typen.

Und beim Übergeben der Daten an das VBO hast du verschiedene Möglichkeiten.
1. Du übergibst mit glBufferData den kompletten Buffer.

2. Du reservierst mit glBufferData Speicher (Richtige größe aber NULL als Daten) und füllst Teilbereiche des Buffers mit glBufferSubData.

3. Oder aber du reservierst mit glBufferData den Speicher und rufst glMapBuffer auf um selber direkt in den Speicher schreiben zu können.

Du könntest es also so machen, dass du deine Arrays mit Daten einzeln definierst. Also eines für die Vertices und eines für die Farben. Damit können diese unterschiedliche typen haben. Und dann übergibst du die einzelnen Arrays jeweils mit glBufferSubData. Somit würden die dann zwar insgesammt im selben Buffer landen könnten aber bei dir weiterhin getrennt definiert sein. Du müsstest dann mit gl*Pointer die Daten beschreiben und alles wäre gut.

Falls dir das nicht hilft, dann beschreibe mal bitte genauer wo es hängt. Ich bin mir da nämlich gerade nicht so ganz sicher.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 09, 2007 12:17 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Lossy eX hat geschrieben:
WhiteHunter: Was möchtest du damit sagen?

Seltsam, vorhin hat sich die Frage noch anders gelesen. :roll:
Wobei an derselben Stelle ist auch erklärt, was InterleavedArrays() eigentlich an gl*Pointer etc. aufruft, von daher lohnt sich vielleicht doch ein Blick dorthin.

Was haltet ihr von dieser Idee: Man könnte sich ein GLfloat[] oder GLchar[] erstellen und Selbiges dann so zuweisen (sprich Vertex-Color-Vertex-Color), sodass man es direkt an glInterleavedArrays() übergeben könnte. Das sollte im entsprechneden Fall zwar im RAM nicht den Speicher sparen, dafür aber (eventuell) auf der Graka.

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 09, 2007 12:35 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Oder so:

Zitat:
typedef struct
{
float pos[3];
float normal[3];
float color[4];
} Vertex;


Vertex vertexdata[100];

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);

glVertexPointer(3,GL_FLOAT,sizeof(Vertex),&vertexdata[0].pos);
glNormalPointer(GL_FLOAT,sizeof(Vertex),&vertexdata[0].normal);
glColorPointer(4,GL_FLOAT,sizeof(Vertex),&vertexdata[0].color);



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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 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.008s | 16 Queries | GZIP : On ]