glDrawElements verursacht Exception



  • Hallo zusammen,

    ich versuche einen Tetraeder mittels Vertex-Arrays zu rendern.
    Zunächst habe ich folgende Datenstrukturen:

    GLfloat m_x1[3];
    GLfloat m_x2[3];
    GLfloat m_x3[3];
    GLfloat m_x4[3];
    GLfloat m_arrayVertices[12];
    GLubyte m_arrayIndices[7];
    

    Diesen weiße ich dann Werte zu und mache das Vertex-Array OpenGL bekannt.

    int j = 0;
    for(int i=0; i<3; i++)
    	m_arrayVertices[j++] = m_x1[i];
    for(int i=0; i<3; i++)
    	m_arrayVertices[j++] = m_x2[i];
    for(int i=0; i<3; i++)
    	m_arrayVertices[j++] = m_x3[i];
    for(int i=0; i<3; i++)
    	m_arrayVertices[j++] = m_x4[i];
    
    // Vertex-Array Indizes
    m_arrayIndices[0] = 0;
    m_arrayIndices[1] = 1;
    m_arrayIndices[2] = 2;
    m_arrayIndices[3] = 2;
    m_arrayIndices[4] = 3;
    m_arrayIndices[5] = 3;
    m_arrayIndices[6] = 1;
    
    // Anordnen der Vertexdaten		
    glVertexPointer(3, GL_FLOAT, 0, m_arrayVertices);
    

    Zuletzt rufe ich folgende Zeile auf, welche dann auch die Exception wirft:

    glDrawElements(GL_TRIANGLE_FAN, 7, GL_UNSIGNED_BYTE, m_arrayIndices);
    

    Kommischerweise gibt es keine Exception, falls ich statt ubyte int für die Indizes verwende.

    Wo liegt da der Hund begraben 😕

    //EDIT:

    0xC0000005: Access violation reading location 0x00000000.
    

    Sieht nach Zugriff auf nicht allokierten Speicher aus. Allerdings kann ich mir den auch nicht erklären!

    Danke



  • Du sagst OpenGL dass deine Vertices vom Typ GL_FLOAT sind. Später dann sagst dass die Vertices vom Typ GL_UNSIGNED_BYTE sind...
    Und hast Du den State auch gesetzt mit glEnableClientState()?
    Beispiel für ein Quad:

    m_vertices[0].x = 0.0f;
        m_vertices[0].y = 0.0f + m_size.y();
        m_vertices[0].z = m_zorder;
    
        m_vertices[1].x = 0.0f + m_size.x();
        m_vertices[1].y = 0.0f + m_size.y();
        m_vertices[1].z = m_zorder;
    
        m_vertices[2].x = 0.0f + m_size.x();
        m_vertices[2].y = 0.0f;
        m_vertices[2].z = m_zorder;
    
        m_vertices[3].x = 0.0f;
        m_vertices[3].y = 0.0f;
        m_vertices[3].z = m_zorder;
    
        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    
        glTexCoordPointer(2, GL_FLOAT, 0, &m_texCoords[0]);   
        glVertexPointer(3, GL_FLOAT, 0, &m_vertices[0]);
        glDrawArrays(GL_QUADS, 0, 4);
    
        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
        glDisableClientState(GL_VERTEX_ARRAY);
    

    rya.



  • Scorcher24 schrieb:

    Du sagst OpenGL dass deine Vertices vom Typ GL_FLOAT sind. Später dann sagst dass die Vertices vom Typ GL_UNSIGNED_BYTE sind...
    Und hast Du den State auch gesetzt mit glEnableClientState()?

    glDrawElements() verlangt den Typ des Index-Arrays, nicht den des Vertex-Arrays. Den State habe ich auch aktiviert.

    Mittlerweile habe ichs gefunden. Es lag daran, das ich auch
    glEnableClientState(GL_COLOR_ARRAY)
    drin hatte, obwohl ich noch kein Color-Array definiert hatte.

    Danke für Deine Antwort


Anmelden zum Antworten