In OpenGL I got this ( shortened code )
void Mesh::CreateBuffer() {
glBindBuffer( GL_ARRAY_BUFFER, m_Buffers[POS_VB] );
glBufferData( GL_ARRAY_BUFFER, sizeof(Positions[0] /*vec3*/) * iVerticeNum, &Positions[0], GL_STATIC_DRAW );
glEnableVertexAttribArray( POSITION_LOCATION );
glVertexAttribPointer( POSITION_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, 0 );
// Fill index buffer.
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, m_Buffers[INDEX_BUFFER] );
glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices[0] /*unsigned int*/) * iIndiceNum, &Indices[0], GL_STATIC_DRAW );
}
void Mesh::Render() {
// bind vertex arrays here!
.....
glDrawElements( GL_TRIANGLES, this->NumIndices, GL_UNSIGNED_INT, 0);
....
}
The code above is working perfectly in my engine. But when I've decided to port it to Metal API I got some problems, - it just renders half of model using index data, there are NO groups in its mesh, it's just simple mesh. But when I try to render it using vertice data ( drawPrimitives ) it renders fine.
Here's Metal code I am using to initialize and render my mesh:
INIT
....
// Initialize mesh.
MetalMesh mesh;
mesh.vertexBuffer = [MetalDataBase->device newBufferWithBytes:Positions/* Vertice data */
length:sizeof(vec3) * iNumVertices
options:MTLResourceOptionCPUCacheModeDefault];
mesh.indexBuffer = [MetalDataBase->device newBufferWithBytes:Indices
length:sizeof(unsigned int) * iNumIndices
options:MTLResourceOptionCPUCacheModeDefault];
DRAW
// Drawing..
[MetalDataBase->commandEncoder setVertexBuffer:metalResource->metalMeshes[index].vertexBuffer offset:0 atIndex:0];
// DrawPrimitives renders mesh **fine**, as it should.
//[MetalDataBase->commandEncoder drawPrimitives:MTLPrimitiveTypeTriangle vertexStart:0 vertexCount:iVerticeNum];
// But it doesn't, it just renders half of model,
// while **iIndiceNum** is right number with its data.
[MetalDataBase->commandEncoder drawIndexedPrimitives:MTLPrimitiveTypeTriangle indexCount:iIndiceNum indexType:MTLIndexTypeUInt32 indexBuffer:metalResource->metalMeshes[index].indexBuffer indexBufferOffset:0];
Okay, I've managed what's wrong. Similar thread can be found here: http://www.gamedev.net/topic/544669-d3d9-only-1st-submesh-renders-w-indexed-vertexbuffer-solved/
Soo, firstly, I am using several sub meshes, in OpenGL I have something like this:
But after some raging and hair pulling I found a link I posted before, it helped me ( look into the last post ). So in Metal I have something like this now: ( notice the '+NumVertices' in the second line in 'for' loop )
Haha, thanks for 'indexes', 'vertexes' grammar tips.
Here's how I render it using Metal:
Soo, now I got fully loaded mesh ( and its sub meshes ):