VBOs funktionieren nicht?



  • naja, so, hab mal code 1:1 von einem anderen project kopiert, jedoch funktionier das nicht. Immer einen runtime error

    static const GLsizeiptr PositionSize = 6 * 2 * sizeof(GLfloat);
    static const GLfloat PositionData[] =
    {
       -1.0f,-1.0f,
        1.0f,-1.0f,
        1.0f, 1.0f,
        1.0f, 1.0f,
       -1.0f, 1.0f,
       -1.0f,-1.0f,
    };
    
    static const GLsizeiptr ColorSize = 6 * 3 * sizeof(GLubyte);
    static const GLubyte ColorData[] =
    {
       255,   0,   0,
       255, 255,   0,
         0, 255,   0,
         0, 255,   0,
         0,   0, 255,
       255,   0,   0
    };
    
    static const int BufferSize = 2;
    static GLuint BufferName[BufferSize];
    
    static const GLsizei VertexCount = 6;
    
    enum
    {
        POSITION_OBJECT = 0,
        COLOR_OBJECT = 1
    };
    
    void Opengl::display()
    {
    
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
        glLoadIdentity();
    
        Glext::getInstance().glGenBuffersARB(BufferSize, BufferName);
        Glext::getInstance().glBindBufferARB(GL_ARRAY_BUFFER, BufferName[COLOR_OBJECT]);
        Glext::getInstance().glBufferDataARB(GL_ARRAY_BUFFER, ColorSize, ColorData, GL_STREAM_DRAW);
        glColorPointer(3, GL_UNSIGNED_BYTE, 0, 0);
    
        Glext::getInstance().glBindBufferARB(GL_ARRAY_BUFFER, BufferName[POSITION_OBJECT]);
        Glext::getInstance().glBufferDataARB(GL_ARRAY_BUFFER, PositionSize, PositionData, GL_STREAM_DRAW);
        glVertexPointer(2, GL_FLOAT, 0, 0); //[b]Unhandled exception at 0x690c3a1c in Basic.exe: 0xC0000005: Access violation reading location 0x00000000. [/b]
    
        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_COLOR_ARRAY);
    
        glDrawArrays(GL_TRIANGLES, 0, VertexCount);
    
        glDisableClientState(GL_COLOR_ARRAY);
        glDisableClientState(GL_VERTEX_ARRAY);
    
       glutSwapBuffers();
    }
    

    Glext is einfach ein Singleton. Hoffe, das sagt alles. Ich hab auch keine ahnung, welche methode auf die adresse zeigt, wo der fehler hervorgerufn wird. Weder irgendeine Glext-funktion, noch die glVertexPointer-funktion is auf dieser adresse gespeichert. Vielleicht weiss einer rat



  • Habe das Problem gefundn. Naja, hab dann einfach doch nochmal das von nehe kopiert, weil da hats einigermassen gefunkt. Jetzt hab ich auch fast alles hinbekommen, was vorher nicht gefunkt hat. Habe aber trotzdem noch ein Problem. Irgendwie malt er die Dreiecke nicht richtig. Komme einfach nicht drauf, aber vielleicht seht ihr den Fehler:

    Mesh::Mesh()
    {
    	... //hier nur inizialisierungen und so weiter
    	m_pVertices[0].x = 0.0f;
    	m_pVertices[0].y = 0.0f;
    	m_pVertices[0].z = -2.0f;
    	m_pTexCoords[0].u = 0.0f;
    	m_pTexCoords[0].v = 0.0f;
    
    	m_pVertices[1].x = 2.0f;
    	m_pVertices[1].y = 0.0f;
    	m_pVertices[1].z = -2.0f;
    	m_pTexCoords[1].u = 1.0f;
    	m_pTexCoords[1].v = 0.0f;
    
    	m_pVertices[2].x =  2.0f;
    	m_pVertices[2].y =  2.0f;
    	m_pVertices[2].z =  -2.0f;
    	m_pTexCoords[2].u = 1.0f;
    	m_pTexCoords[2].v = 1.0f;
    }
    
    void Mesh::BuildVBOs()
    {
    	// Generate And Bind The Vertex Buffer
    	Glext::getInstance().glGenBuffersARB( 1, &m_nVBOVertices );							// Get A Valid Name
    	Glext::getInstance().glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nVBOVertices );			// Bind The Buffer
    	// Load The Data
    	Glext::getInstance().glBufferDataARB( GL_ARRAY_BUFFER_ARB, m_nVertexCount*3*sizeof(float), m_pVertices, GL_STATIC_DRAW_ARB );
    
    	// Generate And Bind The Texture Coordinate Buffer
    	Glext::getInstance().glGenBuffersARB( 1, &m_nVBOTexCoords );							// Get A Valid Name
    	Glext::getInstance().glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nVBOTexCoords );		// Bind The Buffer
    	// Load The Data
    	Glext::getInstance().glBufferDataARB( GL_ARRAY_BUFFER_ARB, m_nVertexCount*2*sizeof(float), m_pTexCoords, GL_STATIC_DRAW_ARB );
    }
    
    void Mesh::draw()
    {
    	if (isSet == false)
    	{
    		BuildVBOs();
    		isSet = true;
    	}
    
    	glEnableClientState( GL_VERTEX_ARRAY );						// Enable Vertex Arrays
    	glEnableClientState( GL_TEXTURE_COORD_ARRAY );				// Enable Texture Coord Arrays
    
    	Glext::getInstance().glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nVBOVertices );
    	glVertexPointer( 3, GL_FLOAT, 0, (char *) NULL );		// Set The Vertex Pointer To The Vertex Buffer
    	Glext::getInstance().glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nVBOTexCoords );
    	glTexCoordPointer( 2, GL_FLOAT, 0, (char *) NULL );		// Set The TexCoord Pointer To The TexCoord Buffer
    
    	// Render
    	glBindTexture(GL_TEXTURE_2D, Texture::getInstance().getTexture("data/pictures/grass1.png"));
    	glDrawArrays( GL_TRIANGLES, 0, m_nVertexCount );	// Draw All Of The Triangles At Once
    
    	// Disable Pointers
    	glDisableClientState( GL_VERTEX_ARRAY );					// Disable Vertex Arrays
    	glDisableClientState( GL_TEXTURE_COORD_ARRAY );				// Disable Texture Coord Arrays
    }
    

    Nicht nur, dass die Textur nicht stimmt, das Dreieck schaut so aus: \| also Punkte sind oben links, oben rechts, unten rechts. und bei oben links geht das Dreieck nach vorne...
    z ist aber überall gleich. sieht vielleicht jemand den fehler?



  • Problem gelöst:

    Vertex und TextureCoordinate müssen struct sein. Anscheinend kann der das sonst nicht richtig auslesen...


Anmelden zum Antworten