OpenGL Problem bei glDrawArrays()
-
Hallo,
habe ein kleines Programm mit dem ich verschiedene OpenGL Sachen ausprobiere. Dabei werden Modelle in ein Fenster geladen und können manipuliert werden.
Um die Orientierung zu behalten wird für das Globale Koorinatensystem ein Kreuz gezeichnet.
Das funktioniert auch alles ganz gut. Nur auf meinem Laptop kommt es immer bei dem glDrawArrays() des Koordinatensystem zum Segfault.
Die Modelle werden (mit der gleichen Funktion glDrawArrays und vbo) einwandfrei gezeichnet. Und ich finde den Fehler einfach nichtvoid initCoordCross() { glShadeModel(GL_FLAT); glEnable(GL_NORMALIZE); glFrontFace(GL_CCW); if (!glGenBuffers || !glBindBuffer || !glBufferData) { qDebug()<<"VBOs are not supported by your graphics card"; exit(0); } vector<Vertex> m_vertices; vector<Color> m_colors; //x m_vertices.push_back(Vertex(-10.0f,0.0f,0.0f)); m_vertices.push_back(Vertex(+10.0f,0.0f,0.0f)); //Y m_vertices.push_back(Vertex(0.0f,-10.0f,0.0f)); m_vertices.push_back(Vertex(0.0f,+10.0f,0.0f)); //Z m_vertices.push_back(Vertex(0.0f,0.0f,-10.0f)); m_vertices.push_back(Vertex(0.0f,0.0f,+10.0f)); glGenBuffers(1, &CoordCrossVertBuffer); glBindBuffer(GL_ARRAY_BUFFER, CoordCrossVertBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) *m_vertices.size(),&m_vertices[0], GL_STATIC_DRAW); //X m_colors.push_back(Color(1.0f,0.0f,0.0f)); m_colors.push_back(Color(1.0f,0.0f,0.0f)); //y m_colors.push_back(Color(0.0f,1.0f,0.0f)); m_colors.push_back(Color(0.0f,1.0f,0.0f)); //Z m_colors.push_back(Color(0.0f,0.0f,1.0f)); m_colors.push_back(Color(0.0f,0.0f,1.0f)); glGenBuffers(1, &CoordCrossColorBuffer); glBindBuffer(GL_ARRAY_BUFFER, CoordCrossColorBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(Color)*m_colors.size(),&m_colors[0], GL_STATIC_DRAW); } void renderCoordCross() { glPolygonMode(GL_FRONT_AND_BACK, GL_LINES); glEnable(GL_LINE_SMOOTH); glEnableClientState(GL_VERTEX_ARRAY); glBindBuffer(GL_ARRAY_BUFFER, CoordCrossVertBuffer); glVertexPointer(3, GL_FLOAT, 0, 0); glEnableClientState(GL_COLOR_ARRAY); glBindBuffer(GL_ARRAY_BUFFER, CoordCrossColorBuffer); glColorPointer(3, GL_FLOAT, 0, 0); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glPushMatrix(); glDrawArrays(GL_LINES, 0, 6); glPopMatrix(); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_ARRAY_BUFFER); }
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb652e710 (LWP 22892)]
0xb514fcf7 in radeon_bo_ref () from /usr/lib/libdrm_radeon.so.1
(gdb) bt
#0 0xb514fcf7 in radeon_bo_ref () from /usr/lib/libdrm_radeon.so.1
#1 0x081294d8 in ?? ()
#2 0x00000056 in ?? ()
#3 0x08129530 in ?? ()
#4 0xb514f698 in radeon_cs_space_add_persistent_bo () from /usr/lib/libdrm_radeon.so.1
#5 0x08715860 in ?? ()
#6 0x00000000 in ?? ()
(gdb) qAls Treiber für meine mobility Radeon9700 verwende ich x11-drivers/xf86-video-ati (6.12.4), mesa 7.7 und xorg-7.4.1, xServer-1.7.3.902
Hat von euch Jemand eine Idee woran das liegen könnte? Auf meinem Desktop mit NVidia-Karte funktioniert das wie gesagt einwandfrei.
Grüße
Mattes
-
schaut ok aus, irgendwelche errorreports von opengl? http://www.opengl.org/wiki/GL_error_codes
-
Hallo,
direkt vor der kritischen Zeile gibt glGetError() 0 zurück.
Edit: Und ich lese das in jeder Renderschleife aus, immer 0.Grüße
Mattes
-
Okay, 0 sagt aus, dass es keinen Fehler gab. Es gibt aber auch keinen Fehlercode für fehlendes OpenGL.
Die Frage die ich jetzt habe: Hast du auch OpenGL-Support auf deinem Laptop?
Findet man glaub mitfglrxinfo |grep dri
raus.
Generell hat man an der Stelle einen sigsegv wenn eben OpenGL auf NULL zugreift. Entweder fehlt hier an früheren Stellen eine Abfrage ob OpenGL erfolgreich initialisiert wurde, oder OpenGL verliert die Daten. Genaues kann ich aber aus der Entfernung so nicht sagen. Der Code schaut in Ordnung aus so weit.Nochmal edit:
Welche OpenGL Version läuft bei dir? gldrawarrays gehört eigentlich seit Version 1.2 zum Core, man muss also keine Extensions laden. Als Wrapper für Extensions nutze ich immer glew. Vllt mal damit probieren? Es ist nur nach dem erstellen des RenderContextes ein glewInit() nötig. Und die Headerdatei muss vor OpenGL.h inkludiert werden. Wäre also einfach zu integrieren.
http://glew.sf.net
rya.
-
Scorcher24 schrieb:
Die Frage die ich jetzt habe: Hast du auch OpenGL-Support auf deinem Laptop?
Findet man glaub mitfglrxinfo |grep dri
raus.
Ja, wie gesagt funktioniert ja das Rendern des Modells auf die gleiche Art einwandfrei, nur das Zeichnen des Koordintenkreuzes geht nicht.
Scorcher24 schrieb:
Generell hat man an der Stelle einen sigsegv wenn eben OpenGL auf NULL zugreift. Entweder fehlt hier an früheren Stellen eine Abfrage ob OpenGL erfolgreich initialisiert wurde, oder OpenGL verliert die Daten. Genaues kann ich aber aus der Entfernung so nicht sagen. Der Code schaut in Ordnung aus so weit.
Die Abfrage ist drin, und alles OK.
Scorcher24 schrieb:
Welche OpenGL Version läuft bei dir? gldrawarrays gehört eigentlich seit Version 1.2 zum Core, man muss also keine Extensions laden. Als Wrapper für Extensions nutze ich immer glew. Vllt mal damit probieren? Es ist nur nach dem erstellen des RenderContextes ein glewInit() nötig. Und die Headerdatei muss vor OpenGL.h inkludiert werden. Wäre also einfach zu integrieren.
http://glew.sf.net
rya.das probier ich mal, danke!