Absturz mit Vertex Arrays
-
Ich habe ein kleines Problem mit V-Arrays.
Wenn ich versuche einen Würfel Testweise damit zu malen, dann bekomme ich einen Absturz.
Ich habe mal die Funktionen gepostet die bei mir für das Zeichnen zuständig sind.
Wenn ich dagegen mittels glVertex3f zeichne, funktioniert das Rendering korrekt. Ich verstehe echt nicht, was ich falsch gemacht haben könnte.int SceneGraph::initGL() { glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Reset The Projection Matrix glViewport(0, 0, m_iScreenWidth, m_iScreenHeight); // Calculate The Aspect Ratio Of The Window gluPerspective(45.0f,(GLfloat)m_iScreenWidth/(GLfloat)m_iScreenHeight,0.1f,50000.0f); glMatrixMode(GL_MODELVIEW); glShadeModel(GL_SMOOTH); // shading mathod: GL_SMOOTH or GL_FLAT glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 4-byte pixel alignment // enable /disable features glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); //glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_TEXTURE_2D); // makes the colors appear darker too glEnable(GL_VERTEX_ARRAY); glEnable(GL_TEXTURE_COORD_ARRAY); // track material ambient and diffuse from surface color, call it before glEnable(GL_COLOR_MATERIAL) glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); glEnable(GL_COLOR_MATERIAL); glClearColor(0, 0, 0, 0); // background color glClearStencil(0); // clear stencil buffer glClearDepth(1.0f); // 0 is near, 1 is far glDepthFunc(GL_LEQUAL); return 1; }
void SceneGraph::RenderGraph() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glColor3f(1.f, 1.f, 1.f); m_pCamera->setPerspective(); if(m_Scene != NULL) m_Scene->RenderScene(); SDL_GL_SwapBuffers(); }
in der RenderScene() wird diese Funktion aufgerufen, dabei kommt es zum Absturz wenn die markierte Funktion erreicht wird.
// vertex coords array static GLfloat vertices[] = {1,1,1, -1,1,1, -1,-1,1, 1,-1,1, // v0-v1-v2-v3 1,1,1, 1,-1,1, 1,-1,-1, 1,1,-1, // v0-v3-v4-v5 1,1,1, 1,1,-1, -1,1,-1, -1,1,1, // v0-v5-v6-v1 -1,1,1, -1,1,-1, -1,-1,-1, -1,-1,1, // v1-v6-v7-v2 -1,-1,-1, 1,-1,-1, 1,-1,1, -1,-1,1, // v7-v4-v3-v2 1,-1,-1, -1,-1,-1, -1,1,-1, 1,1,-1}; // v4-v7-v6-v5 // normal array static GLfloat normals[] = {0,0,1, 0,0,1, 0,0,1, 0,0,1, // v0-v1-v2-v3 1,0,0, 1,0,0, 1,0,0, 1,0,0, // v0-v3-v4-v5 0,1,0, 0,1,0, 0,1,0, 0,1,0, // v0-v5-v6-v1 -1,0,0, -1,0,0, -1,0,0, -1,0,0, // v1-v6-v7-v2 0,-1,0, 0,-1,0, 0,-1,0, 0,-1,0, // v7-v4-v3-v2 0,0,-1, 0,0,-1, 0,0,-1, 0,0,-1}; // v4-v7-v6-v5 // color array static GLfloat colors[] = {1,1,1, 1,1,0, 1,0,0, 1,0,1, // v0-v1-v2-v3 1,1,1, 1,0,1, 0,0,1, 0,1,1, // v0-v3-v4-v5 1,1,1, 0,1,1, 0,1,0, 1,1,0, // v0-v5-v6-v1 1,1,0, 0,1,0, 0,0,0, 1,0,0, // v1-v6-v7-v2 0,0,0, 0,0,1, 1,0,1, 1,0,0, // v7-v4-v3-v2 0,0,1, 0,0,0, 0,1,0, 0,1,1}; // v4-v7-v6-v5 inline void draw3() { // enable and specify pointers to vertex arrays glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); glNormalPointer(GL_FLOAT, 0, normals); glColorPointer(3, GL_FLOAT, 0, colors); glVertexPointer(3, GL_FLOAT, 0, vertices); glPushMatrix(); glTranslatef(2, 2, 0); // move to upper-right glDrawArrays(GL_QUADS, 0, 24); // ABSTURZ glPopMatrix(); glDisableClientState(GL_VERTEX_ARRAY); // disable vertex arrays glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); }
-
welche fehlermeldung sagt dir opengl wenn du sie abfragst?
-
ich kriege keine ausgabe weil das programm gleich abstürzt, sobald es die besagte funktion erreicht.
allerdings habe ich mal trotzdem so eine fehlerausgabefunktion geschrieben:inline void DisplayErrorMessage() { GLenum error = glGetError(); if(error == GL_INVALID_ENUM) std::cout<<"ERROR: GL_INVALID_ENUM"<<std::endl; else if(error == GL_INVALID_VALUE) std::cout<<"ERROR: GL_INVALID_VALUE"<<std::endl; else if(error == GL_INVALID_OPERATION) std::cout<<"ERROR: GL_INVALID_OPERATION"<<std::endl; else if(error == GL_STACK_OVERFLOW) std::cout<<"ERROR: GL_STACK_OVERFLOW"<<std::endl; else if(error == GL_STACK_UNDERFLOW) std::cout<<"ERROR: GL_STACK_UNDERFLOW"<<std::endl; else if(error == GL_OUT_OF_MEMORY) std::cout<<"ERROR: GL_OUT_OF_MEMORY"<<std::endl; }
ich kriege auch keine fehler wenn ich die absturzfunktion weglasse oder mit einer glbegin(Quads) ersetze.
Das heißt im Prinzip, dass mein Programm absolut fehlerlos ist, zumindest solange ich nicht versuche über Vertex Arrays zu zeichnen.
Hat jemand eine idee, warum glDrawArrays() abstürzt. muss ich noch irgendwas definieren?
-
das ergibt doch gar keinen sinn, dass dieser kram abstürzt. es muss doch theoretisch funktionieren?!
-
Also:
Der Fehler scheint NICHT in der Definition des Würfels oder der Zeichenfunktion zu liegen, denn ich kann folgendes ausführen, wenn ich es in mein Programm kopiere:
static GLfloat vertices[] = {1,1,1, -1,1,1, -1,-1,1, 1,-1,1, // v0-v1-v2-v3 1,1,1, 1,-1,1, 1,-1,-1, 1,1,-1, // v0-v3-v4-v5 1,1,1, 1,1,-1, -1,1,-1, -1,1,1, // v0-v5-v6-v1 -1,1,1, -1,1,-1, -1,-1,-1, -1,-1,1, // v1-v6-v7-v2 -1,-1,-1, 1,-1,-1, 1,-1,1, -1,-1,1, // v7-v4-v3-v2 1,-1,-1, -1,-1,-1, -1,1,-1, 1,1,-1}; // v4-v7-v6-v5 // normal array static GLfloat normals[] = {0,0,1, 0,0,1, 0,0,1, 0,0,1, // v0-v1-v2-v3 1,0,0, 1,0,0, 1,0,0, 1,0,0, // v0-v3-v4-v5 0,1,0, 0,1,0, 0,1,0, 0,1,0, // v0-v5-v6-v1 -1,0,0, -1,0,0, -1,0,0, -1,0,0, // v1-v6-v7-v2 0,-1,0, 0,-1,0, 0,-1,0, 0,-1,0, // v7-v4-v3-v2 0,0,-1, 0,0,-1, 0,0,-1, 0,0,-1}; // v4-v7-v6-v5 // color array static GLfloat colors[] = {1,1,1, 1,1,0, 1,0,0, 1,0,1, // v0-v1-v2-v3 1,1,1, 1,0,1, 0,0,1, 0,1,1, // v0-v3-v4-v5 1,1,1, 0,1,1, 0,1,0, 1,1,0, // v0-v5-v6-v1 1,1,0, 0,1,0, 0,0,0, 1,0,0, // v1-v6-v7-v2 0,0,0, 0,0,1, 1,0,1, 1,0,0, // v7-v4-v3-v2 0,0,1, 0,0,0, 0,1,0, 0,1,1}; // v4-v7-v6-v5 // enable and specify pointers to vertex arrays glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); glNormalPointer(GL_FLOAT, 0, normals); glColorPointer(3, GL_FLOAT, 0, colors); glVertexPointer(3, GL_FLOAT, 0, vertices); glPushMatrix(); glTranslatef(2, 2, 0); // move to upper-right glDrawArrays(GL_QUADS, 0, 24); // ABSTURZ glPopMatrix(); glDisableClientState(GL_VERTEX_ARRAY); // disable vertex arrays glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_NORMAL_ARRAY);
Ich sehe dann einen Würfel mit Farbverläufen, wobei jede Ecke ne andere Farbe hat. Es gibt hierbei auch keine Fehlermeldungen.
Es muß also weiter oben an deiner Initialisierung liegen.