2016-04-22 10 views
1

Dieser Code funktioniert wie es angenommen hat, zu arbeiten, macht richtig (nicht jedes Stück zugehörigen Code schreiben, da ich mit diesen Teilen etwas falsch ist denken):C++ VBO Rendering-Ausgabe

std::vector<GLuint> vboId; 
std::vector< std::vector<GLfloat> > verts; 

... init:

verts[num].push_back(x); 
verts[num].push_back(y); 
//verts[num].push_back(0); 
// texture offset 
verts[num].push_back(0); 
verts[num].push_back(offset); 

verts[num].push_back(x + TILE_SIZE); 
verts[num].push_back(y); 
//verts[num].push_back(0); 
// texture offset 
verts[num].push_back(1); 
verts[num].push_back(offset); 

verts[num].push_back(x + TILE_SIZE); 
verts[num].push_back(y + TILE_SIZE); 
//verts[num].push_back(0); 
// texture offset 
verts[num].push_back(1); 
verts[num].push_back(offset + zsize); 

verts[num].push_back(x); 
verts[num].push_back(y + TILE_SIZE); 
//verts[num].push_back(0); 
// texture offset 
verts[num].push_back(0); 
verts[num].push_back(offset + zsize); 
... 
glBindBuffer(GL_ARRAY_BUFFER, vboId[num]); 
glBufferData(GL_ARRAY_BUFFER, verts[num].size() * sizeof(GLfloat), verts[num].data(), GL_STATIC_DRAW); 

... machen:

glBindBuffer(GL_ARRAY_BUFFER,vboId[num]); 

glTexCoordPointer(2,GL_FLOAT,sizeof(verts[num]),(void*)(sizeof(GLfloat)*2)); 
glVertexPointer(2,GL_FLOAT,sizeof(verts[num]),0); 

glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glEnableClientState(GL_VERTEX_ARRAY); 

glDrawArrays(GL_QUADS, 0, verts[num].size()); 

glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

Aber wenn ich versuche, durch Änderung des Code, alles rende Z-Wert hinzufügen rs verkorkste:

... init

verts[num].push_back(x); 
verts[num].push_back(y); 
verts[num].push_back(0); 
// texture offset 
verts[num].push_back(0); 
verts[num].push_back(offset); 

verts[num].push_back(x + TILE_SIZE); 
verts[num].push_back(y); 
verts[num].push_back(0); 
// texture offset 
verts[num].push_back(1); 
verts[num].push_back(offset); 

verts[num].push_back(x + TILE_SIZE); 
verts[num].push_back(y + TILE_SIZE); 
verts[num].push_back(0); 
// texture offset 
verts[num].push_back(1); 
verts[num].push_back(offset + zsize); 

verts[num].push_back(x); 
verts[num].push_back(y + TILE_SIZE); 
verts[num].push_back(0); 
// texture offset 
verts[num].push_back(0); 
verts[num].push_back(offset + zsize); 
... 
glBindBuffer(GL_ARRAY_BUFFER, vboId[num]); 
glBufferData(GL_ARRAY_BUFFER, verts[num].size() * sizeof(GLfloat), verts[num].data(), GL_STATIC_DRAW); 

... machen:

glBindBuffer(GL_ARRAY_BUFFER,vboId[num]); 

glTexCoordPointer(2,GL_FLOAT,sizeof(verts[num]),(void*)(sizeof(GLfloat)*3)); 
glVertexPointer(3,GL_FLOAT,sizeof(verts[num]),0); 

glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glEnableClientState(GL_VERTEX_ARRAY); 

glDrawArrays(GL_QUADS, 0, verts[num].size()); 

glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

Kann jemand erklären, was ich falsch hier? Warum funktionieren die ersten Codes, aber die letzten nicht?

+0

von BEPS geschrieben hinzufügen, bearbeiten von KEBS – plasmacel

Antwort

1

Ich glaube, ich es gelöst .. Dieser Code macht es wie es soll:

glTexCoordPointer(2,GL_FLOAT,sizeof(GLfloat) * 5,(void*)(sizeof(GLfloat) * 3)); 
glVertexPointer(3,GL_FLOAT,sizeof(GLfloat) * 5,(void*)0); 
... 
glDrawArrays(GL_QUADS, 0, verts[num].size()/5); 

Aber ich bin nicht sicher, ob es wirklich richtig ist, ich sehe keine Artefakte, aber nicht wirklich wissen, Was passiert hinter den Kulissen? Danke für Hilfe, wenn jemand bestätigen kann, dass der Code korrekt ist bitte tun

Aber was ich hier verstehe ist, dass glTexCoordPointer (* 5, * 3) von dritten Array-Index (die erste Textur Koordinate) und erhöht sich um jeweils 5 (Index * 5) Elemente vorwärts. Und glVertexPointer (* 5, 0) beginnt mit Array-Index 0 und erhöht sich jedes Mal um 5. Deshalb:

verts[num].push_back(x); // index 0 
verts[num].push_back(y); // index 1 
verts[num].push_back(0); // index 2 
// texture offset 
verts[num].push_back(0); // index 3 
verts[num].push_back(offset); // index 4 

Ich kann zurück zu mehr Sachen heh http://i.imgur.com/Iemih6d.png

0

Ich glaube, Ihr Original wird nur korrekt gerendert, weil die Vertices zufällig auf relevanten Koordinaten landen. Ich denke, das Problem liegt in deinen Schritten und anfänglichen Orten.

Da Ihr Array sieht aus wie

x-y-z-u-v

Die verticies wird Schritt auch haben, da sie haben zwei Schwimmer springen die nächste Koordinate zu erreichen. Die Texturkoordinaten haben auch eine anfängliche Zeigerposition.

glTexCoordPointer(2, GL_FLOAT, sizeof(GLfloat) * 3, sizeof(GLfloat) * 3); 
glVertexPointer(3, GL_FLOAT, sizeof(GLfloat) * 2, 0); 

Das heißt, für die Texturen, bei Index 3 (u) starten, lesen Sie zwei Elemente (u und v), dann drei Elemente bewegen voraus, die die nächste u sein wird, wie es x überspringt , y und z.

Beginnen Sie bei der Vertices bei 0 (x), lesen Sie drei Elemente, x, y und z, und überspringen Sie zwei, um beim nächsten x zu beginnen.

+0

Ich habe versucht, aber es macht immer noch falsch: [link] (http: //i.imgur .com/4M40aDx.png) vielleicht gibt es irgendwo anders was falsch – beps

+0

@beps Es könnte sein, dass es Mülldaten außerhalb des Puffers rendert. Ihr glDrawArrays-Aufruf sollte die Anzahl der Vertices, nicht die Anzahl der Floats darstellen.(Versuchen Sie, es in verts [num] .size()/5) zu ändern. Können Sie einen Link dazu angeben, wie es aussehen soll? – Waddles

+0

Größe()/5 sieht jetzt so aus [link] (http://i.imgur.com/MBBqnXs.png), es soll so aussehen, xy 0,0 ist in der oberen linken Ecke [link] (http://i.imgur.com/GMnEtmn.png) das ist mit dem ursprünglichen Code gerendert – beps

Verwandte Themen