Hi folks,

I'm setting up my vertex array object and I'm having troubles drawing anything on the screen.

I have checked with a simple triangle of 3 vertices and everything works as intended but I am now trying something more complex and it doesn't work.

This is how my VAO is setup

Code :
	// Generate and bind VAO
	glGenVertexArrays(1, &m_vao);
	glBindVertexArray(m_vao);
 
	// Vertex Buffer
	GLuint vbuffer;
	glGenBuffers(1, &vbuffer);
	glBindBuffer(GL_ARRAY_BUFFER, vbuffer);	
 
	// Vertex Attributes
 
	// Position
	glEnableVertexAttribArray(0);		// layout(location = 0) [GLSL]
	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexPositionTexture), (void*)BUFFER_OFFSET(0));
 
	// Texture UV
	glEnableVertexAttribArray(1);		// layout(location = 1) [GLSL]
	glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(VertexPositionTexture), (void*)BUFFER_OFFSET(12));
 
	// Index buffer
	GLuint ibuffer;
	glGenBuffers(1, &ibuffer);
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuffer);
 
	// This only needs to be done once as the indices never change
	glBufferData(GL_ELEMENT_ARRAY_BUFFER, maxIndices * sizeof(GLushort), &m_indices[0], GL_STATIC_DRAW);
 
	glBindVertexArray(0);

The indices are generated with this method, they account for the maximum number of quadrangles I can draw in one draw call.

Code :
        int numIndices = 0;
 
	for (int i = 0; i < maxQuadrangles; i++)
	{
		// CW Winding [0, 1, 2] [1, 3, 2]
		m_indices[numIndices++] = 0 + i;
        m_indices[numIndices++] = 1 + i;
        m_indices[numIndices++] = 2 + i;
 
        m_indices[numIndices++] = 1 + i;
        m_indices[numIndices++] = 3 + i;
        m_indices[numIndices++] = 2 + i;
	}

The array for vertices is also initialised to the maximum size possible for each draw call

Code :
std::array<VertexPositionTexture, maxVertices> m_vertices;

If I wish to draw a quadrangle then I copy the appropriate vertices for each quadrangle to draw

Code :
	// Copy the vertex data to the drawer's large vertices array
	std::array<VertexPositionTexture, 4> v = quadrangle.getVertices();
	std::copy(v.begin(), v.end(), m_vertices.begin() + (m_numQuadrangles * 4));
        m_numQuadrangles++;

Now for the part that doesn't appear to work.

Code :
	// Bind VAO (restores all buffer bindings and attribute settings that were previously set up)
	glBindVertexArray(m_vao);
 
	// Update the vertex buffer with the new data (Copy data into the vertex buffer object)
	glBufferData(GL_ARRAY_BUFFER, maxVertices * sizeof(VertexPositionTexture), &m_vertices[0], GL_DYNAMIC_DRAW);
 
	glDrawElements(GL_TRIANGLES, m_numQuadrangles * 2, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0));	
 
	// Unbind VAO
	glBindVertexArray(0);
 
	// Reset number of quadrangles
	m_numQuadrangles = 0;

What I am trying to do with the code above is copy the entire vertices array m_vertices to the vertex buffer.

Then depending on the number of quadrangles added for this batch I wish to only use part of the index and vertex buffers.

So m_numQuadrangles * 2 means I wish to use 2 triangles per quadrangle in the batch.

I have also tried

Code :
glDrawRangeElements(GL_TRIANGLES, 0, m_numQuadrangles * 6, m_numQuadrangles * 2, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0));

BUFFER_OFFSET is defined as

Code :
#define BUFFER_OFFSET(i) ((char *)NULL + (i))

Why am I getting nothing drawn to the screen?