Hello everyone
I am working at a terrain, which I have generated from a heightfield. In the beginning I used immediate mode rendering and then vertex arrays, which worked fine and now I passed to VBOs, but the problem is that it doesn’t render anything. I use a vector(vertexData) of VertexData structure which holds my position, color, normal and texture coordonates.
Here is my code: - initialize VBOs
void Terrain::buildTerrain()
{ glGenBuffers(6,bufferObjects);
// vertex
glBindBuffer(GL_ARRAY_BUFFER,bufferObjects[VERTEX_DATA]);
glBufferData(GL_ARRAY_BUFFER, nrVertices * 3 * sizeof(GL_FLOAT),vertexData, GL_STATIC_DRAW);
// color
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[COLOR_DATA]);
glBufferData(GL_ARRAY_BUFFER, nrVertices * 4 * sizeof(GL_FLOAT), (float*)vertexData + 3, GL_STATIC_DRAW);
// normals
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[NORMAL_DATA]);
glBufferData(GL_ARRAY_BUFFER, nrVertices * 3 * sizeof(GL_FLOAT), (float*)vertexData + 7, GL_STATIC_DRAW);
// 1'st texture coordinates
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[TEXTURE_DATA_1]);
glBufferData(GL_ARRAY_BUFFER, nrVertices * 2 * sizeof(GL_FLOAT), (float*)vertexData + 10, GL_STATIC_DRAW);
// 2'nd texture coordinates
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[TEXTURE_DATA_2]);
glBufferData(GL_ARRAY_BUFFER, nrVertices * 1 * sizeof(GL_FLOAT), (float*)vertexData + 12, GL_STATIC_DRAW);
//generate the index array
ptrIndexArray = new unsigned short[length * width * 2];
unsigned short *ptrTemp = ptrIndexArray;
for (int y = 0; y < length - 1; y++)
{
for (int x=0; x < width; x++)
{
*ptrTemp++ = y * width + x;
*ptrTemp++ = (y + 1) * width + x;
}
}
// index array
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObjects[INDEX_DATA]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, length * width * 2 * sizeof(GLushort), ptrIndexArray, GL_STATIC_DRAW);
}
- here I draw
void Terrain::renderTerrain()
{
glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[VERTEX_DATA]);
glVertexPointer(3, GL_FLOAT, sizeof(VertexData), vertexData);
glEnableClientState(GL_COLOR_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[COLOR_DATA]);
glColorPointer(4, GL_FLOAT, sizeof(VertexData), (float*)vertexData + 3);
glEnableClientState(GL_NORMAL_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[NORMAL_DATA]);
glNormalPointer(GL_FLOAT, sizeof(VertexData), (float*)vertexData + 7);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[TEXTURE_DATA_1]);
glClientActiveTextureARB(GL_TEXTURE0_ARB);
glTexCoordPointer(2, GL_FLOAT, sizeof(VertexData), (float*)vertexData + 10);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[TEXTURE_DATA_2]);
glClientActiveTextureARB(GL_TEXTURE1_ARB);
glTexCoordPointer(1, GL_FLOAT, sizeof(VertexData), (float*)vertexData + 12);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObjects[INDEX_DATA]);
for(int z = 0; z < length - 1; z++)
{
glDrawElements(GL_TRIANGLE_STRIP, width * 2, GL_UNSIGNED_SHORT, ptrIndexArray + z * width * 2);
}
}
Anyone knows what I'm doing wrong ?
Many thanks