2011-01-01 8 views
1

Mein Problem wirklich einfach zu sein scheint, aber ich kann einfach nicht den Grund dahinter bekommen:OpenGL ES: glBufferSubData füllt Maschen in VBO/IBO, dann glDrawElements macht nur die erste Masche statt alle von ihnen

  • Ich habe einen Vertex und einen Index-Puffer, die mit glBufferSubData ausgefüllt werden. Es gibt ein paar Maschen, die in einer Eins-zu-eins in diesem großen VBO und seine entsprechenden IBO
  • Dann füllte werde ich versuchen, diese kleinen Maschen mit glDrawElements one-by-one

Problem ist zu machen, nur das erste Netz wird - und mehrfach - an Stellen gerendert, an denen jedes dieser verschiedenen Netze sein sollte !!!

Folgende Informationen können nützlich sein:

Ich schaffe VBO auf diese Weise

gl.glGenBuffers(1, buffers_, 0); 
gl.glBindBuffer(GL11.GL_ARRAY_BUFFER, buffers_[0]); 
gl.glBufferData(GL11.GL_ARRAY_BUFFER, sizeInBytes, null, GL11.GL_DYNAMIC_DRAW); 

Dann wird jede Masche in die VBO wie diese gefüllt ist

gl.glBindBuffer(GL11.GL_ARRAY_BUFFER, name); 
gl.glBufferSubData(GL11.GL_ARRAY_BUFFER, startOffsetInBytes, numBytesToCopy, nioBuffer); 

Und Maschen sind in diesem fasion gemacht

  • binden VBO/IBO und stellen entsprechende Client heißt
  • dann gesetzt Vertex, normal und texcoord "Zeiger" - sie zu Beginn des VBO und deren Versatz in Vertex "Struktur"
  • und rufen gl.glDrawElements(GL10.GL_TRIANGLES, indicesNum, GL10.GL_UNSIGNED_SHORT, startIndexOffsetInBytes);
  • dann zeigen schließlich unbind VBO/IBO und deaktivieren Sie den Client heißt

ich den Code auf Fehler und ich bin sicher, dass sizeInBytes, startOffsetInBytes, numBytesToCopy und startIndexOffsetInBytes richtigen Werte (in Bytes :))) sind und indicesNum ist die Anzahl der Indizes/Scheitelpunkte im Netz (zum Rendern).

Ein verdächtiger Ort ist Vertex/normal/Texcoord Zeiger setzen - sie werden nur einmal gesetzt - und auf den Anfang des VBO gesetzt. Vielleicht muss ich sie jedes Mal vor dem Aufruf von glDrawElements einstellen?

Antwort

1

: D Dieser Grund gefunden. Alles, was ich beschrieben habe, ist in der Tat korrekt. Problem ist in der Art und Weise wie Meshes in den VBO/IBO eingefügt werden - die Indizes für jedes neue Mesh wurden von 0 an neu gestartet !! Also wurde nur das erste Mesh in VBO gerendert.

+1

Ich hatte ein ähnliches Problem, aber meine Entschlossenheit war anders, ich musste sicherstellen, den Offset in den VAOs mit glVertexAttribPointer hinzuzufügen. Andernfalls würde nur das erste Netz hinzugefügt werden. Ihre Antwort gab mir einen Hinweis darauf, was es sein könnte, also danke ich dir dafür allein :) – dcousens