[OpenGL] glDrawArrays verursacht Access Violation



  • Hallo,

    ich habe mich in letzter Zeit mit OpenGL beschäftigt und steige auch so langsam durch.
    Nun wollte ich aber endlich mal mein erstes Polygon auf dem Bildschirm sehen, was mit OpenGL 3.2 ja länger dauert als mit 1.0, und habe deswegen versucht dieses Tutorial nachzuvollziehen.

    Im foldengen der Code, der fast komplett aus dem Tutorial stammt und nur etwas anders angeordnet wurde. Allerdings verwende ich eine eigene Shader- und Programmklasse, sowie SFML 2 und nicht SDL zum erzeugen des Fensters und des OpenGL Kontextes. Außerdem habe ich die Schleife am Ende entfernt, da sie nichts mit dem Fehler zu tun hat.

    // Define vertices and colors
    	const GLfloat diamond[4][2] = {
    		{  0.0,  1.0  }, /* Top point */
    		{  1.0,  0.0  }, /* Right point */
    		{  0.0, -1.0  }, /* Bottom point */
    		{ -1.0,  0.0  } }; /* Left point */
    
    	const GLfloat colors[4][3] = {
    		{  1.0,  0.0,  0.0  }, /* Red */
    		{  0.0,  1.0,  0.0  }, /* Green */
    		{  0.0,  0.0,  1.0  }, /* Blue */
    		{  1.0,  1.0,  1.0  } }; /* White */
    
            // Bind attributes		
    		glBindAttribLocation(TestProgram.GetProgramObject(), 0, "in_Position");
    		glBindAttribLocation(TestProgram.GetProgramObject(), 1, "in_Color");
    
    		// Link Program
    		TestProgram.Link();
    		TestProgram.Use();
    
    		GLuint vao, vbo[2];
    	    glGenVertexArrays(1, &vao);
    		glBindVertexArray(vao);
    
    		glGenBuffers(2, vbo);
    
    		glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
    		glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(GLfloat), diamond, GL_STATIC_DRAW);
    		glVertexAttribPointer((GLuint)0, 2, GL_FLOAT, GL_FALSE, 0, 0);
    		glEnableVertexAttribArray(0);
    
    		glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
    		glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), colors, GL_STATIC_DRAW);
    		glVertexAttribPointer((GLuint)1, 3, GL_FLOAT, GL_FALSE, 0, 0);
    		glEnableVertexAttribArray(1);
    
    		while (App.IsOpened()) {
    			sf::Event Event;
    
    			// Handle events
    			while (App.GetEvent(Event)) {
    				/* ... */
    			}
    
    			glClearColor(0.0, 0.0, 0.0, 1.0);
    			glClear(GL_COLOR_BUFFER_BIT);
    
    			glDrawArrays(GL_LINE_LOOP, 0, 4); // <-- Hier passiert es 
    
    			App.Display();
    		}
    

    Auch die Shader sind komplett aus dem Tutorial übernommen, weswegen ich sie nicht nochmal hier posten möchte.

    Wie der Threadtitel schon sagt, tritt eine Access-Violation in Zeile 47 auf.
    Wenn ich den count Parameter von glDrawArrays(GLenum mode, GLint first, GLsizei count) auf 1 reduziere, tritt kein Fehler auf, es wird aber auch nichts gezeichnet.

    Die Shader und das Program sind auf jeden Fall erfolgreich kompiliert und gelinkt.

    Ich hoffe, jemand sieht den/die Fehler und kann mir weiterhelfen, damit ich endlich mal was zu sehen bekomme. 🙂

    MfG,
    ScRaT



  • Ich weiss nicht ob es das gleiche tutorial ist das ich mal durchgeaarbeitet hab, aber in meinem wurde irgendwo die größe der Elemente des vertexarray oder so falsch angegeben (uint anstatt verctor3 oder so).



  • Scheint aber ein anderes tutorial zu sein.



  • Mh, erstmal danke für die Antwort.

    Die Arraygrößen sollten eigentlich stimmen. Für den Positionsarray wurde mit Hilfe von glVertexAttribPointer((GLuint)0, 2, GL_FLOAT, GL_FALSE, 0, 0); die Größe eines Elements auf 2 Floats festgelegt, macht also bei 8 Werten 4 Elemente.
    Für die Farben wurde das gleiche mit glVertexAttribPointer((GLuint)1, 3, GL_FLOAT, GL_FALSE, 0, 0); gemacht, nur eben auf 3 Floats, was bei 12 Werten auch in 4 Elementen resultiert.

    Ich beziehe mich hier mit dem Ausdruck "Element" übrigens auf die Dokumentation:

    The command
    void DrawArrays( enum mode, int first, sizei count );
    constructs a sequence of geometric primitives by transferring elements first through fi rst+count-1 of each enabled array to the GL.

    Demnach sollte es hier doch möglich sein auf 4 Elemente zuzugreifen, ohne eine Zugriffsverletzung zu bekommen, oder?

    Gibt es denn irgendeine Möglichkeit für mich zu sehen, wie diese Zugriffsverletzung entsteht? Kann man da mit dem Debugger irgendetwas machen (benutze MSVC 2010).

    MfG,
    ScRaT


Anmelden zum Antworten