I put a lot of profiling code in Ogre’s SceneManager::manualRender() function and in SceneManager::_setPass() as well as in the GL_RenderSystem::_render() function etc. Turns out my profiling code in GL_RenderSystem seems to have skewed my profile results.
Profiling the code wasn’t giving me many optimization ideas so I took another approach. You know how when you have slow code sometimes you just cut parts of it out till you find out what is slow about it – not the best way to optimize but it can give you some insight when you don’t fully understand the design and implementation of libraries you are using (Ogre3d in my case). I could see from the profiling results that it would be good to focus on the Render To Texture(RTT) code so I started removing all the texture look ups in my RTT shader except one and the timing/stuttering issues improved noticeably. I started by adding back in each texture look up one by one to see if adding a certain texture brought back the stuttering/slowness.
It seems that some of my terrain textures were 1024×1024 while the rest were 512×512 (I have 16 terrain textures that get blended in the RTT shader). So I converted those to 512×512 and that helped – and it seems that going above ~8 512×512 textures gives unacceptable slowness and more stuttering. For some reason this is only an issue with OpenGL Render System not DirectX Render System which seems to handle 16 blends fine with no stuttering and faster render times. I may look into this more later because I think I need at least 12 terrain textures.
I might try having several large shared height maps and slope maps – one per cube face to start – instead of one small height map and slope map per terrain patch. I just like the simplicity of the current approach, but it is probably going to be too slow.
Also, I’ve moved up to the latest Ogre release v1.6.3
Lastly, I tried GLIntercept which was very nice and easy to use and can output textures, all the OpenGL calls and lots more. Did I mention it’s free?
At some point I need to start saving rendered terrain textures and height maps and normal maps to disk then reading them back from disk instead of generating them every time.