You know what else, Patrice?

We must certainly do something about those huge 32-bit grayscale AO maps we're using. There are so many of them that the model simply refuses to load in my ATi Radeon box that has only 2GB of VRAM. If I disable mipmapping, the model does load. But 15 extra mipmap levels add exactly as much VRAM footprint as level 0 alone, and at some point during model load my Radeon complains I've requested more VRAM than it can offer, and then aborts ObjReader altogether.

I think we should add a texture preparation stage whereby all the grayscale maps the model uses (AO, specular, displacement, metalness, roughness, etc. in various combinations) would be combined in memory as separate grayscale "channels" into one or more 32-bit auxiliary textures to be loaded and optionally mipmapped for subsequent use in our shaders on a per-"channel" basis. It would save us
a lot of VRAM and also some time it takes OpenGL to mipmap our current grayscale textures separately into an absolutely unnecessary "fruit salad" of 32-bit images each.
Secondly, 16 levels of GLU default mipmapping are far too many for our current ZFAR depth field of less than 100.0f. My Objector texture loader and renderer implement selective choice of mipmap levels to create and render (

). I'm actually creating 6 smaller mipmap levels besides level 0 and I have never seen any need to generate more of them. We should also add a similar option to ObjReader, I think.