VBO not displaying

Hi guys - I’m just starting out using VBOs (using SDL/glew). I’m trying to start out using the simple example of a cube - actually at the moment just the one face of a cube - but I can’t get anything to display

my vertex structure is defined as follows:


struct Vertex
{
float x, y, z;          //Vertex coords
float tx, ty;           //Texture coords
float nx, ny, nz;       //Normal coords
};

The cube is then generated like so:


        Vertex temp;

        //NOTE: Perspective is from looking at the cube from the outside
   //Just trying to display one face for the moment to simplify
        //Back face ------------------------------------------------------------------------------------------
        temp.x = 0.f; temp.y = 0.f; temp.z = 0.f;       //Bottom Right  - 0
        temp.nx = 0.f; temp.ny = 0.f; temp.nz = 1.f; // This stays the same for the rest of the face
        temp.tx = 1.f; temp.ty = 0.f;
        m_vertices.push_back(temp);
        
        temp.x = 0.f; temp.y = m_fHeight; temp.z = 0.f;         //Top Right - 1
        temp.tx = 1.f; temp.ty = 1.f;
        m_vertices.push_back(temp);

        temp.x = m_fWidth; temp.y = m_fHeight; temp.z = 0.f;    //Top Left      - 2
        temp.tx = 0.f; temp.ty = 1.f;
        m_vertices.push_back(temp);

        temp.x = m_fWidth; temp.y = 0.f; temp.z = 0.f;  //Bottom Left - 3
        temp.tx = 0.f; temp.ty = 0.f;
        m_vertices.push_back(temp);

        m_indeces.push_back(0); m_indeces.push_back(1); m_indeces.push_back(2);
        m_indeces.push_back(2); m_indeces.push_back(3); m_indeces.push_back(0);


        //Generate the vertex buffer
        glGenBuffers(1, &m_vertexBufferID);
        //Bind the vertex buffer                                                                                                
        glBindBuffer(GL_ARRAY_BUFFER, m_vertexBufferID);
        //Fill the vertex buffer - size is 24*sizeof(Vertex) bcs 6 faces with 4 corners
        glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * 4, NULL, GL_STATIC_DRAW);
        glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertex) * 4, &m_vertices); // Actually upload the data

        //Set up the pointers
        glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(12));
        glNormalPointer(GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(20));
        glVertexPointer(3, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(0));


        //Generate the index buffer
        glGenBuffers(1, &m_indexBufferID);                                      
        //Bind the index buffer                                                                                         
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBufferID);
        //Fill the index buffer- size is 36*sizeof(uint) bcs 6 traingle coords in 1 face * 6 faces
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLubyte) * 6, NULL, GL_STATIC_DRAW);
        glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(GLubyte) * 6, &m_indeces); // Actually upload the data


which is then sent to render in a seperate function:


        glBindBuffer(GL_ARRAY_BUFFER, vertexID);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexID);

        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        glEnableClientState(GL_NORMAL_ARRAY);
        glEnableClientState(GL_VERTEX_ARRAY);

        // Resetup the pointers. 
        glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(12));
        glNormalPointer(GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(20));
        glVertexPointer(3, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(0));

        //Draw the indexed elements
        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0));
        
        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
        glDisableClientState(GL_NORMAL_ARRAY);
        glDisableClientState(GL_VERTEX_ARRAY);

and BUFFER_OFFSET() is a simaple macro defined as:


// A helper macro to get a position
#define BUFFER_OFFSET(i) ((char *)NULL + (i))

But I just can’t get anything to display - applying the same texture etc. to a cube in immediate mode shows up fine.

The weird thing is that occasionaly something very strange will get displayed, which is different every time - so maybe it’s some sort of initialization error?

would be much appreciated if anyone could help me out with this.

cheers.

Probably because you are sending the location of an object, which in this case, the object is m_vertices.

glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertex) * 4, &m_vertices);

You are filling the VBO with some junk partway and then some vertices.

Huzzah!! Changing it to &m_vertices[0] worked!
(also &m_indeces becomes &m_indeces[0])

a-thank-yoh!