My code is below:
void start3D()
{
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableVertexAttribArray(attribPointer);
}
void end3D()
{
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableVertexAttribArray(attribPointer);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
void Chunk::allocate()
{
glGenBuffers(1, &vBuffer); //positions
glBindBuffer(GL_ARRAY_BUFFER, vBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(float), NULL, GL_STATIC_DRAW);
glGenBuffers(1, &tBuffer); //texcoords
glBindBuffer(GL_ARRAY_BUFFER, tBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(float), NULL, GL_STATIC_DRAW);
glGenBuffers(1, &nBuffer); //normals
glBindBuffer(GL_ARRAY_BUFFER, nBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(float), NULL, GL_STATIC_DRAW);
glGenBuffers(1, &tanBuffer); //tangents
glBindBuffer(GL_ARRAY_BUFFER, tanBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(float), NULL, GL_STATIC_DRAW);
}
void Chunk::upload()
{
glBindBuffer(GL_ARRAY_BUFFER, tBuffer); //texcoords
glBufferData(GL_ARRAY_BUFFER, numtriangles * 6 * sizeof(float), texcoords, GL_STATIC_DRAW);
glTexCoordPointer(2, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, vBuffer); //positions
glBufferData(GL_ARRAY_BUFFER, numtriangles * 9 * sizeof(float), vertices, GL_STATIC_DRAW);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, nBuffer); //normals
glBufferData(GL_ARRAY_BUFFER, numtriangles * 9 * sizeof(float), normals, GL_STATIC_DRAW);
glNormalPointer(GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, tanBuffer); //tangents
glBufferData(GL_ARRAY_BUFFER, numtriangles * 12 * sizeof(float), tangents, GL_STATIC_DRAW);
glVertexAttribPointer(attribPointer, 4, GL_FLOAT, false, 0, 0);
}
void Chunk::draw()
{
glActiveTexture(GL_TEXTURE0);
glUniform1i(texture_location, 0);
glBindTexture(GL_TEXTURE_2D, bitmap);
glActiveTexture(GL_TEXTURE1);
glUniform1i(normal_texture_location, 1);
glBindTexture(GL_TEXTURE_2D, normap);
glActiveTexture(GL_TEXTURE2);
glUniform1i(height_texture_loc, 2);
glBindTexture(GL_TEXTURE_2D, heightmap);
glBindBuffer(GL_ARRAY_BUFFER, tBuffer); //texcoords
glTexCoordPointer(2, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, vBuffer); //positions
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, nBuffer); //normals
glNormalPointer(GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, tanBuffer); //tangents
glVertexAttribPointer(attribPointer, 4, GL_FLOAT, false, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, numtriangles*3);
}
Sample Usage:
chunk1.allocate();
chunk2.allocate();
chunk3.allocate();
start3D();
chunk1.upload();
chunk2.upload();
chunk3.upload();
end3D();
while(running)
{
start3D();
chunk1.draw();
chunk2.draw();
chunk3.draw();
end3D();
//do other stuff
}







