OGRE -- HardwareBuffer创建Mesh

在OGRE中,动态创建Mesh一般有两种方法:其一,通过ManualObject的ConvertToMesh,创建ManualObject是中间过程,ConvertToMesh过后,此创建的ManualObject就可以Remove掉了;其二,通过HardwareBuffer直接创建Mesh。第一种方法相对来说比较简单(就不多说了),下面具体说说第二种方法:

 

1. 创建Mesh:MeshPtr mesh = MeshManager::getSingleton().createManual("MeshName", "General");

第一个参数:mesh的名称,第二个参数:Mesh所属的组

2. 创建submesh:SubMesh * submesh = mesh->createSubMesh();

3. 创建好了Mesh和SubMesh后,就可以填充VertexBuffer和IndexBuffer了:

1). 需要分配一段内存区间:如float * cube = new float[num],然后填充这段内存:

注意: A.分配区间一定要足够大;B、填充区间的时候可以根据Position、Normal和Coordination(或者SpecularColor,DiffuseColor...)的顺序依次填充每一个定点;也可以分别每一个分配一个单独的buffer区间!

2). 定义VertexDeclaration,如:VertexDeclaration * decl = mesh->sharedVertexData->vertexDeclaration;

然后就可以AddElement:

size_t offset = 0;

decl->addElement(0, offset, VET_FLOAT3, VES_POSITION);

offset += VertexElement::getTypeSize(VET_FLOAT3);

.......

.........

(此处省略号代表要添加的Element的类型,如果需要添加多个Element就可以照上面的顺序依次添加)

3). 创建VertexBuffer:vertexBuffer = HardwareBufferManager::getSingleton().createVertexBuffer(offset, vertexCount, ......);

4). 添加数据到VertexBuffer中:vertexBuffer->writeData(..........);

5). 如果需要分别添加Element,可以重复1-4部;

6)。创建IndexBuffer,方法同VertexBuffer相似,不多说了

4. 填充相关数据:sub->useSharedVertices = true;
    submesh->indexData->indexBuffer = ibuf;
    submesh->indexData->indexCount = ibufCount;
    submesh->indexData->indexStart = 0;

 

到此步骤,mesh就创建出来了。就可以和OGRE提供的Mesh资源一样使用了^_^

 

值得一提的是:

创建好的mesh资源,在程序退出(或者重新创建相同名称的Mesh)的时候,务必要通过MeshManager::getSingleton().Unload("MeshName")和Remove("MeshName")将其删除掉。虽然程序退出的时候,系统会自动去掉,不过有时候也会出现相关的错误!!!!

你可能感兴趣的:(OGRE)