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