2016-05-22 9 views
0

Ich arbeite an einer einfachen 3D-Engine. Ich habe derzeit ein funktionierendes Setup mit mehreren VAOs, zwischen denen ich während der Render-Schleife wechseln kann, aber alle verwenden keine Index-Puffer.Ordnungsgemäßer Gebrauch des indexierten VBO

Ich versuche nun, einen neuen VAO bestehend aus 4 VBOs hinzuzufügen: Vert Position, Farbe, Normal und Indizes.

Alles wird kompiliert und ausgeführt, aber die Zeichnungsaufrufe an den zweiten VAO (mit indizierten Scheitelpunkten) werden nicht gerendert. Ich bin mir sicher, dass irgendwo ein Problem mit meinem Setup besteht, daher habe ich diesen Code hinzugefügt, der alle VAO- und VBO-Generationen, Anrufe und Verwendungen enthält. Scheint irgendetwas in diesem Code falsch, und ist das der richtige Weg, um alles einzurichten?

VAO1 hat 3 Puffer: Position, Farbe, Normale

VAO2 hat 3 Puffer: Position, Farbe, Normale und Vertex-Indizes

//Initalize vaos and vbos 
GLuint vao1, vbo1[3]; 
GLuint vao2, vbo2[4]; 

//Generate Vertex arrays: 
glGenVertexArrays(1, &vao1); 
glGenVertexArrays(1, &vao2); 

//Generate Buffers: 
glGenBuffers(3, vbo1); 
glGenBuffers(4, vbo2); 

//Initalize Bufferdata vectors: 
vector<GLfloat> VertPosBuffer1Vector; 
vector<GLfloat> VertNormalBuffer1Vector; 
vector<GLfloat> VertColorBuffer1Vector; 

vector<GLfloat> VertPosBuffer2Vector; 
vector<GLfloat> VertNormalBuffer2Vector; 
vector<GLfloat> VertColorBuffer2Vector; 
vector<GLuint> VertIndexBuffer2Vector; 

//Fill Buffers: 
//(not included but all vectors are filled with data) 

//VAO 1 
glBindVertexArray(vao1); 

//Vertex position buffer: 
glBindBuffer(GL_ARRAY_BUFFER, vbo1[0]); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertPosBuffer1Vector.size(), &VertPosBuffer1Vector[0], GL_STATIC_DRAW); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 
glEnableVertexAttribArray(0); 

//Vertex color buffer: 
glBindBuffer(GL_ARRAY_BUFFER, vbo1[1]); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertColorBuffer1Vector.size(), &VertColorBuffer1Vector[0], GL_STATIC_DRAW); 
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 
glEnableVertexAttribArray(1); 

//Vertex normal buffer: 
glBindBuffer(GL_ARRAY_BUFFER, vbo1[2]); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertNormalBuffer1Vector.size(), &VertNormalBuffer1Vector[0], GL_STATIC_DRAW); 
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 
glEnableVertexAttribArray(2); 

//VAO 2 
glBindVertexArray(vao2); 

//Vertex position buffer: 
glBindBuffer(GL_ARRAY_BUFFER, vbo2[0]); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertPosBuffer2Vector.size(), &VertPosBuffer2Vector[0], GL_STATIC_DRAW); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 
glEnableVertexAttribArray(0); 

//Vertex color buffer: 
glBindBuffer(GL_ARRAY_BUFFER, vbo2[1]); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertColorBuffer2Vector.size(), &VertColorBuffer2Vector[0], GL_STATIC_DRAW); 
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 
glEnableVertexAttribArray(1); 

//Vertex normal buffer: 
glBindBuffer(GL_ARRAY_BUFFER, vbo2[2]); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertNormalBuffer2Vector.size(), &VertNormalBuffer2Vector[0], GL_STATIC_DRAW); 
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 
glEnableVertexAttribArray(2); 

//Vertex index buffer: 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo2[3]); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint)*VertIndexBuffer2Vector.size(), &VertIndexBuffer2Vector[0], GL_STATIC_DRAW); 
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 
glEnableVertexAttribArray(3); 

//unbind vao 
glBindVertexArray(0); 
//bind first vao 
glBindVertexArray(vao1); 

und

//RENDERLOOP 

//render objects from vao1 using: 
glDrawArrays(GL_TRIANGLES, start, size); 

//switch vao 
glBindVertexArray(0); 
glBindVertexArray(vao2); 

//render objects from vao2 using: 
glDrawElements(
    GL_TRIANGLES,   
    start,   
    GL_UNSIGNED_INT, 
    (void*)0   
); 

I überprüft haben, dass Die Daten in meinen Puffern sind korrekt.

Ist es richtig, dass der Shader keine Informationen von Indizes aufnimmt? Der Shader ist der gleiche wie wenn ich keinen Indexpuffer verwende?

Vielen Dank

Antwort

2

Die Indizes sind kein Vertex-Attribut. Also, was Sie tun müssen, ist diese beiden Zeilen entfernen:

glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 
glEnableVertexAttribArray(3); 

Ich habe auch bemerkt, dass Sie für glDrawElements die Variable „Start“ als Argument count verwenden. Ich kenne die Werte von Start und Größe nicht, aber ich nehme an, dass Sie "size" als zweites Argument in glDrawElements verwenden sollten.

+0

Danke, das klärte etwas auf, über das ich mir nicht sicher war. Aber ich habe es schon ausprobiert und es ändert nichts am Ergebnis. Ich bekomme immer noch nichts gerendert. Also, wenn der Rest des Codes scheint korrekt, der Fehler könnte sonst .. – remi000

+0

ein anderes mögliches Problem in Ihrem Code gefunden. siehe meine Bearbeitung – bofjas

+0

Leider war das Problem völlig unabhängig von den VBOs und VAOs. (Etwas stimmt nicht mit meinen Uniformen für Projektion und Modellmatrizen.) Aber was du geantwortet hast, könnte eine mögliche Antwort für jemand anderen sein, also werde ich deine Antwort akzeptieren! – remi000