Probleme mit Vertex Array in OpenGL



  • Hi,

    ich habe eine Funktion die mit glBegin...glEnd ein Modell in OpenGL zeichnet. Dazu habe ich eine Struktur (o wegen Objekt genannt), die für jede Fläche 3 Normale und 3 Vertexe Speichert. Außerdem gibt es zu jeder Fläche eine Farbe.

    for (int i = 0; i < Anzahl_Flaechen i++)
    	{
    
    		Color3f c = o.materials[o.Flaeche[i].Farbindex];
    
    		// Farbe setzen
    		glColor4f(col.r, col.g, col.b, 1.0);
    
    			glBegin(GL_TRIANGLES);
    
    				glNormal3fv((GLfloat*)&o.normals[o.faces[i].vertex[0]]);
    				glVertex3fv((GLfloat*)&o.vertices[o.faces[i].vertex[0]]);
    
    				glNormal3fv((GLfloat*)&o.normals[o.faces[i].vertex[1]]);
    				glVertex3fv((GLfloat*)&o.vertices[o.faces[i].vertex[1]]);
    
    			    glNormal3fv((GLfloat*)&o.normals[o.faces[i].vertex[2]]);
    				glVertex3fv((GLfloat*)&o.vertices[o.faces[i].vertex[2]]);
    			glEnd();
    
    	}
    

    Nun habe ich versucht dies mit Vertex Arrays zeichnen zu lassen.
    Dazu habe ich das Vertex Array so gebaut:

    vertexDaten = (Vertex3f *)malloc(7*o.Anzahl_Flaechen*sizeof(Vertex3f));
    
    	for (int i = 0; i < Anzahl_Flaechen ; i++)
    	{
    			vertexData[i]=      materials[o.Flaeche[i].Farbindex];
    			vertexData[i+1]=	normals[o.Flaeche[i].vertex[0]];
    			vertexData[i+2]=	vertices[o.Flaeche[i].vertex[0]];
    
    			vertexData[i+3]=	normals[o.Flaeche[i].vertex[1]];
    			vertexData[i+4]=	vertices[o.Flaeche[i].vertex[1]];
    
    			vertexData[i+5]=	normals[o.Flaeche[i].vertex[2]];
    			vertexData[i+6]=	vertices[o.Flaeche[i].vertex[2]];
    	}
    

    und so versuche ich es zu zeichnen:

    glEnableClientState(GL_COLOR_ARRAY);
    	glEnableClientState(GL_NORMAL_ARRAY);
    	glEnableClientState(GL_VERTEX_ARRAY);
    
    	glColorPointer(3,GL_FLOAT,sizeof(Vertex3f) ,(GLvoid*)vertexData);
    	glNormalPointer(GL_FLOAT,sizeof(Vertex3f) ,(GLvoid*)vertexData);
    	glVertexPointer(3,GL_FLOAT,sizeof(Vertex3f) ,(GLvoid*)vertexData);
    	glDrawElements(GL_TRIANGLES,obj.numFaces,GL_UNSIGNED_INT, Was_kommt_hier_hin);
    
    	glDisableClientState(GL_COLOR_ARRAY);
    	glDisableClientState(GL_NORMAL_ARRAY);
    	glDisableClientState(GL_VERTEX_ARRAY);
    

    Ich verstehe jedoch nicht was ich beim letzten Parameter von Draw Elements angeben muß. Außerdem weiß ich nicht genau wie ich bei gl..Pointer() den zweiten Parameter mit dem Abstand eingeben soll, da es zwar für jedes Dreieck 3 Vertexe und 3 Normale aber nur ein Farbwert gibt, so das es keinen einheitlichen Abstand zwischen den Normalen und Vertexdaten gibt.

    Ich meine wenn f=Farbe ,v=Vertex und n=normale ist ist die Reihenfolge ja:

    fnvnvnv fnvnvnv fnvnvnv ...

    (Oder ist dort der Abstand von einer Angabe (von 3 floats) zur nächsten gemeint?)

    Wie muß man also die Angaben machen?



  • Jeder Vertex muss den gleichen Aufbau haben.
    OpenGL macht bei jedem glVertex Kommando auch nichts anderes als einen "kompletten" Vertex aus den aktuell gesetzten Vertexattributen zu erzeugen.
    glDrawElements erwartet zusaetzlich einen Indexbuffer.
    Wenn Du drei unabhaengige Vertices pro Dreieck hast, kannst Du glDrawArrays benutzen.
    Den Offset der einzelnen Attribute gibt man einfach bei gl...Pointer an:

    struct Vertex
    {
       float x,y,z;
       float nx,ny,nz;
       unsigned int col;
    };
    
    Vertex *vertexBuffer= ...;
    
    glVertexPointer( 3, GL_FLOAT, sizeof(Vertex), vertexBuffer );
    glNormalPointer( GL_FLOAT, sizeof(Vertex), (float*)vertexBuffer + 3 );
    glColorPointer( 4, GL_UNSIGNED_BYTE, sizeof(Vertex), (float*)vertexBuffer + 6 );
    
    glDrawArrays(GL_TRIANGLES, 0, numTriangles);
    


  • Danke!

    Es funktioniert jetzt.


Anmelden zum Antworten