Like most large expansive worlds, I've broken my game's terrain into equally divided tiles. But one thing I have come to realize is that each tile uses the same x/y coordinates for each vertex, its just that for each tile those coordinates are offset by the grid position of that tile.
That said, I have been wondering whether it would be faster to construct a single VBO with the common x,z vertex pattern and pass to the vertex shader a few parameters such as the tile's x/z offset and a heightmap texture that I would sample to get the height. The idea is to try and minimize the video memory used for terrain, saving it for models and other objects in a large scene.
Any thoughts or ideas? Would that be feasible or would just passing the Vector3 to the shader with the full X/Y/Z already resolved the best way?
Terrain Mesh Performance
-
- OGRE Contributor
- Posts: 203
- Joined: Sat Jul 16, 2011 8:29 pm
- Location: UK
- x 51
Re: Terrain Mesh Performance
Yes, this is very much feasible in my eyes. It's a form of instancing where you have 1 tile that is reused over and over and all the manipulation is done in the vertex shader.
I used this technique for instanced grass to some good results. Basically I make either 1 or a few different tiles of grass and reuse them in the pages. This saves a lot of memory as each tile can be instanced and uploaded in a single draw call.
In the vertex shader, I then adjust the heights, shadows and remove the vertices using a depth map, and everything else required to make then render correctly.
This method leads to extremely fast grass patches that you can zoom across an entire area without any pops or stutters. It does have the downside of having a slight repeated look but rotations and different tiles could work.
I know you asked about terrain but I have only used the technique for grass.
Ogre 2.x terra system runs on GPU, is fast and uses little memory, perhaps have a look at that. I don't use terra though and instead have our own terrain system based on CPU which does use a lot of memory for larger worlds with higher resolution but it much easier for manipulating height data and painting.
Hope this helps
I used this technique for instanced grass to some good results. Basically I make either 1 or a few different tiles of grass and reuse them in the pages. This saves a lot of memory as each tile can be instanced and uploaded in a single draw call.
In the vertex shader, I then adjust the heights, shadows and remove the vertices using a depth map, and everything else required to make then render correctly.
This method leads to extremely fast grass patches that you can zoom across an entire area without any pops or stutters. It does have the downside of having a slight repeated look but rotations and different tiles could work.
I know you asked about terrain but I have only used the technique for grass.
Ogre 2.x terra system runs on GPU, is fast and uses little memory, perhaps have a look at that. I don't use terra though and instead have our own terrain system based on CPU which does use a lot of memory for larger worlds with higher resolution but it much easier for manipulating height data and painting.
Hope this helps

Lead developer of the Skyline Game Engine: https://aurasoft-skyline.co.uk
-
- OGRE Team Member
- Posts: 2151
- Joined: Sun Mar 30, 2014 2:51 pm
- x 1156
Re: Terrain Mesh Performance
actually this is pretty much what Ogre1 Terrain does, if you enable "Vertex Compression"crancran wrote: Tue Jul 02, 2019 4:08 am That said, I have been wondering whether it would be faster to construct a single VBO with the common x,z vertex pattern and pass to the vertex shader a few parameters such as the tile's x/z offset and a heightmap texture that I would sample to get the height.