So, I've decided to switch my renderer over to vertex buffer objects, to help speed things up a bit.
I've formatted the arrays every which way, but for whatever reason, the thing isn't rendering.
Note: Code is in C++/CLI. The concept is the same. I can post a standard C++ version if you wish, just let me know.
In CModel:
Code:
//..//
public:
int vertexBufferID;
array<float> ^vertexBuffer;
//..//
CreateBuffers() [Member of CModel]:
Code:
void CModel::CreateBuffers(){
vertexBuffer = gcnew array<float>(numVertices*9);
int vertIndex = 0;
for(int i=0; i<numMeshes; i++){
for(int j=0; j<mesh[i].numTriangles; j++){
int triangleIndex = mesh[i].triangleIndices[j];
const Triangle *triPtr = &triangle[triangleIndex];
int index[3];
index[0] = triPtr->vertexIndices[0];
index[1] = triPtr->vertexIndices[1];
index[2] = triPtr->vertexIndices[2];
vertexBuffer[vertIndex+0] = vertex[index[0]].location[0];
vertexBuffer[vertIndex+1] = vertex[index[0]].location[1];
vertexBuffer[vertIndex+2] = vertex[index[0]].location[2];
vertexBuffer[vertIndex+3] = vertex[index[1]].location[0];
vertexBuffer[vertIndex+4] = vertex[index[1]].location[1];
vertexBuffer[vertIndex+5] = vertex[index[1]].location[2];
vertexBuffer[vertIndex+6] = vertex[index[2]].location[0];
vertexBuffer[vertIndex+7] = vertex[index[2]].location[1];
vertexBuffer[vertIndex+8] = vertex[index[2]].location[2];
vertIndex += 9;
}
}
int objectArraySizeOut;
int objectArraySize = vertexBuffer->Length*sizeof(float);
Gl::glGenBuffersARB(1, vertexBufferID);
Gl::glBindBufferARB(Gl::GL_ARRAY_BUFFER_ARB, vertexBufferID);
Gl::glBufferDataARB(Gl::GL_ARRAY_BUFFER_ARB, objectArraySize, vertexBuffer, Gl::GL_STATIC_DRAW_ARB);
Gl::glGetBufferParameteriv(Gl::GL_ARRAY_BUFFER_ARB, Gl::GL_BUFFER_SIZE_ARB, objectArraySizeOut);
if(objectArraySizeOut <= 0){
CUtility::Log("Buffer error.");
}
}
Rendering code:
Code:
Gl::glEnableClientState(Gl::GL_VERTEX_ARRAY);
Gl::glBindBufferARB(Gl::GL_ARRAY_BUFFER_ARB, vertexBufferID);
Gl::glVertexPointer(3, Gl::GL_FLOAT, 0, IntPtr::Zero);
Gl::glDrawArrays(Gl::GL_TRIANGLES, 0, numVertices);
Gl::glDisableClientState(Gl::GL_VERTEX_ARRAY);
CreateBuffers() is called on object init, after model data has been loaded.
I've probably done something terribly stupid, but I can't figure out what. I've also tried using a multi-dimentional array to hold the buffer data, with the first dimention being the vertex index, and the second being the x,y or z, but it didn't work either.
Thanks.