I'm having trouble rendering some geometry using the vertex buffer object. I intend to draw a plane of points, so basically one vertex at each discrete position in my space. However, I cannot display this plan, because every time I call glDrawElements (...), an application crash causes an access violation exception. It must be an initialization error, I think.
This is what I have so far:
#define SPACE_X 512
#define SPACE_Z 512
typedef struct{
GLfloat x, y, z;
GLfloat nx, ny, nz;
GLfloat r, g, b, a;
} Vertex;
typedef struct{
GLuint i;
} Index;
GLuint vertexBufferObject;
glGenBuffers(1, &vertexBufferObject);
GLuint indexBufferObject;
glGenBuffers(1, &indexBufferObject);
const int numberOfVertices = SPACE_X * SPACE_Z;
const int numberOfPrimitives = numberOfVertices;
Vertex* vertexArray = new Vertex[numberOfVertices];
Index* indexArray = new Index[numberOfPrimitives];
int index = -1;
for(GLfloat x = -SPACE_X / 2; x < SPACE_X / 2; x++) {
for(GLfloat z = -SPACE_Z / 2; z < SPACE_Z / 2; z++) {
index++;
vertexArray[index].x = x;
vertexArray[index].y = 0.0f;
vertexArray[index].z = z;
vertexArray[index].nx = 0.0f;
vertexArray[index].ny = 0.0f;
vertexArray[index].nz = 1.0f;
vertexArray[index].r = 1.0;
vertexArray[index].g = 0.0;
vertexArray[index].b = 0.0;
vertexArray[index].a = 1.0;
}
}
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject);
glBufferData(GL_ARRAY_BUFFER, numberOfVertices * sizeof(Vertex), vertexArray, GL_DTREAM_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject);
glEnableVertexAttribArray(0);
glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), vertexArray);
glEnableVertexAttribArray(1);
glVertexAttribPointer((GLuint)1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), &vertexArray[0].nx);
glEnableVertexAttribArray(2);
glVertexAttribPointer((GLuint)2, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), &vertexArray[0].r);
for(GLunit i = 0; i < numberOfPrimitives; i++) {
indexArray[i].i = i;
}
glBindBuffer(GL_ELEMENET_ARRAY_BUFFER, indexBufferObject);
glBufferData(GL_ELEMENET_ARRAY_BUFFER, numberOfPrimitives * sizeof(Index), indexArray, GL_STREAM_DRAW);
glBindBuffer(GL_ELEMENET_ARRAY_BUFFER, indexBufferObject);
glDrawElements(GL_POINTS, numberOfPrimitives, GL_UNSIGNED_INT, indexArray);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glDeleteBuffers(1, &vertexBufferObject);
glDeleteBuffers(1, &indexBufferObject);
delete[] vertexArray;
vertexArray = NULL;
delete[] indexArray;
indexArray = NULL;