Hi!
We're got some large v2 meshes (60MB~120MB) and want to reduce their sizes with MeshLodGenerator. It crashes in 32-bit version because for a mesh with 2286390 vertices failed to allocate 134217728 bytes of memory.... We're working on a 64-bit version but the real question is... after MeshLodGenerator successfully generated all LOD levels, how to remove the LARGEST (original) LOD level and keep lower levels only?
I know that for "normal" use cases LODs are for reducing unneccesary vertex shader pressure when looking at objects are distant, but with such big meshes, we need to cut down the TOTAL MEMORY (CPU/GPU) first. I know there are mesh simplification softwares, but we already have working v2 meshes and we already have a good MeshLodGenerator, the only missing piece is: how to remove the largest LOD?
[2.1+] Removing largest LOD level on a large mesh
-
rujialiu
- Goblin
- Posts: 296
- Joined: Mon May 09, 2016 8:21 am
- x 35
-
dark_sylinc
- OGRE Team Member

- Posts: 5560
- Joined: Sat Jul 21, 2007 4:55 pm
- Location: Buenos Aires, Argentina
- x 1403
Re: [2.1+] Removing largest LOD level on a large mesh
I can't remember if the MeshLodGenerator worked via reindexing (only creates new index buffers; all LODs share the original vertex buffer), or if it created new geometry (all LODs are independent).
If the former:
If the latter:
If the former:
- For each LOD create a new vertex buffer that only contains the vertices used by LOD1's index buffer
- For each LOD create a new index buffer and reindex the old index buffer
- For each LOD create a new VertexArrayObject and replace the old ones in SubMesh::mVao
- Destroy the old Vaos and old vertex & index buffers
Code: Select all
//Find out which indices are in use in LOD1
indexBuffer = downloadTicketIndex->map();
std::set<uint32> usedVertices;
for( i< numIndices )
{
usedVertices.insert( indexBuffer[i] );
}
//Copy vertexBuffer to newVertexBuffer
newVertexBuffer = new vertex[usedVertices.size()];
std::map<uint32, uint32> oldIndexToNewIndex;
uint32 nextVertex = 0;
vertexBuffer = downloadTicketVertex->map();
for( i < oldNumVertices )
{
if( usedVertices.find( i ) != usedVertices.end() )
{
newVertexBuffer[nextVertex] = vertexBuffer[i];
oldIndexToNewIndex[i] = nextVertex;
++nextVertex;
}
}
//Copy and remap indexBuffer to newIndexBuffer
newIndexBuffer = new uint16[numIndices];
for( i< numIndices )
newIndexBuffer[i] = oldIndexToNewIndex[indexBuffer[i]];
- Drop the first Vao in SubMesh::mVao[0]. Just delete it (via VaoManager->destroyVertexArrayObject)
- Remember to delete the vertex & index buffers that belonged to that Vao too