This forest scene has acted as a 'technical test' for my skills: it has combined my knowledge of PBR materials, CryEngine's asset pipeline, and performance focus while also introducing me to proper foliage creation techniques, as well as in depth knowledge of the lighting system and a few other advanced rendering techniques.
From an artistic standpoint, I think the scene turned out quite well. The lighting is believable, the assets are of good quality and the scene composition seems natural. However, from a technical standpoint, this scene represents quite a bit.
Rendering
If you've never used CryEngine, then the display info command may seem a bit overwhelming at first; but let me explain some of the crucial and interesting aspects. Firstly, on the second line you can see some information on the spec the engine is running at: in this case, it's rendering in DirectX 11 at maximum settings, with a form of 'SMAA' (an anti-aliasing type) enabled and 'SVOGI' enabled as well. While the first 3 settings may appear normal to anyone interested in game-rendering technology, it is that 4th setting which is quite interesting. 'SVOGI' is a voxel based global illumination system which actually runs in real-time; obviously, this is quite a powerful tool for creating realistically lit scenes.
Below this, the 3rd and 4th lines give standard scene information: in this case, the scene has 751 object draw calls, 1083 shadow draw calls (total of 1834), while the entire frame consists of some 124,918 polygons.
Objects and Textures
As for objects, they are all quite simple. In the scene there are a total of 9 unique objects:
A Large grass patch (28 polygons)
A Small grass patch (30 polygons)
A Fern plant (276 polygons)
2x Rock objects (629 and 775 polygons)
4x Tree objects (149 to 365 polygons)
In terms of polygon usage, all of these objects are quite low in count, with the exception of the Fern which could likely be reduced to around half the current size. The trees are obviously very basic, considering they only appear in the distance and behind a fair amount of depth blur.
These 9 objects are then varied with scale and rotation changes while using shared texture maps and materials to further reduce memory and draw calls. For example, the large and small grass patches share the exact same 1024x1024 diffuse grass texture as well as the same shader based material. The trees also work on a similar principle, meaning that there is only 1 tree material (containing 4 sub materials) in the entire scene, heavily utilizing combined texture maps as well as shaders. This tree material contains the usual diffuse/specular/normal/gloss textures (all 1024x1024) for the trunk material, but the leaves, branches and other foliage come from just two textures, one being 1024x1024 and the other 512x512. everything else on the trees is based entirely on shaders.
The only truly "unique" assets in the scene are the rocks and distant ferns. The rocks utilize the usual diffuse/specular/normal/gloss textures (all 1024x1024) whereas the fern is again heavily shader based, utilizing a single 1024x1024 diffuse texture. In addition, there are 5 terrain textures present, all of which are 1024x1024 in size.
In general, it is likely that I could further reduce texture quality to save on memory. The grass could likely be dropped to 512x512, as could the fern, without sacrificing much in the way of quality. The terrain textures could also likely be simplified, since it is barely visible, to a single material type with a few color variations.
Conclusion
In general, I think this scene uses most of the optimization tricks I could think of (or find), and as a result, is quite efficient. As usual, there are likely further things which could be improved, but at some point, the time invested simply won't match the performance gained (at some point, I would be saving fractions of milliseconds). I may post a future update if I find that anything major can be accomplished in terms of optimization, or if I find any interesting tricks, but I feel like this scene is essentially complete.