Very impressive work dude!
Meurisse Thomas did a breakdown of the amazing 3d scene, talking about the production of great open areas.
Hello everybody. First of all, I would like to thank you for giving me the opportunity to speak and share my visions and my workflow with all the amazing artists here.
The scene started as a huge playground set in the Yorkshire Dales to improve my knowledge of Unreal Engine 4 and to see what I could achieve with trying new techniques I never had the opportunity to test out. (ex: fully dynamic lighting, LPV (light propagation volumes), UE4 3D Imposter Meshes, Hierarchical Lod, Substance plugin.) But also a variety of tools I never had the opportunity to use in a project. Mainly SpeedTree, Zbrush, MayaPaintFx, and also the wonderful Substance Designer.
In the end, I only kept the elements and techniques that worked the best (switched to static lighting after trying fully dynamic lighting (with LPV technique), switched to SpeedTree, after trying Maya modeled tree with 3d imposter meshes). I also used some World Machine generated terrains (instead of the UE4 sculpting tool).
All these trials and failures were essential to raise the quality of the final environment, as well as helping me improve my overall knowledge.
So the final scene is composed of elements created with Zbrush, Substance designer, Photoshop, Autodesk Maya, SpeedTree, and World Machine.
Some elements were also grabbed from photogrammetry texture libraries (As it gave me amazing quality and a rather fast editing process, compared to a more classical texturing process).
Of course, one of the main goals was to obtain the most realistic result possible with my actual competences while staying reasonable about the technical constraints of modern video games and my little laptop horsepower (Gtx 960M, 16Gb RAM and an I7 6700 topping at 2.6 GHz).
While most of the assets were meticulously optimized, the number of elements rendered simultaneously was a huge performance drainer. Millions of grass blades were rendered at the scene time (and weren’t even called by a distance factor, or screen size), which was obviously overkilled). The scene composition didn’t help either as the whole level could be rendered at once from a lot of places in the level.
But also by the use of GPU killer techniques like the volumetric clouds (which were provided to me by MuMuMoMo) and the volumetric fog (which is very subtle).
The first iteration of the terrain landscape I did was created using static meshes, Those static meshes were built based on a world machine terrain height and converted to geometry. This huge terrain was then separated into 16 different parts which were tessellated and LODed. This technique gave more polygon density, thus sharper details on the terrain compared with the landscape one.
But I soon realized that it was not the way to go as the static mesh techniques had serious disadvantages compared to the UE4 landscape tool: by default the Unreal engine landscape system is already pretty well optimized and has an automatic and powerful use of LODing techniques and memory usage.
For generating huge terrain and world, the landscape tool is generally a better choice than using static meshes. (Also due to the way it stores data -4 bytes per vertex-, that is around 6 times less than a static mesh one (24 bytes per vertex).
I encourage you to read more about this on the UE4 landscape documentation page.
Switching to the UE4 landscape tool allowed me to have more editable possibilities as the usage of the sculpting tool and the powerful layers painting tool ( which I used to paint my 16 different terrain materials).
In the end, the polygon density reduction I had from changing method had pretty much no visual impact (You have to zoom very close to the terrain to see some more details popping), but the performance gain and the new possibilities I had were too great to come back to the static mesh.(I also realized that I forgot to include a distance based tessellation techniques in my landscape material, I was tesselating the whole terrain at once, I let you imagine the performance cost)
Rock and its bed of flowers
When switching to the Ue4 landscape tool, I already had the heightmap created, I only had to import it and generate the landscape.
I wanted to keep it simple, and not go too crazy with the playable area size, so I decided to stick to only one landscape within my level, no level streaming, no second landscape terrain in the level.
To extend the size of the environment, I proceeded with the creation of backgrounds elements: a terrain and a mountain mesh. Those elements weren’t designed to be walked on, so their texture size and triangles count were kept reasonably low.
A Sheep is enjoying the taste of a flower
Generating a huge environment is not an easy task, especially if you work alone, you can easily get lost in the process and be overwhelmed by the amount of work to accomplish to finish the scene with a good overall quality.
The rule I tried to stick to was to focus mainly on the big picture and the feeling of an immense landscape to explore; fewer details, less close-up, but mainly the wide angle and green as far as the eye can see.
As I focused on the big picture, I decided to get rid of some of my initial ideas: goodbye the abandoned tractor and its muddy track, goodbye the spiderweb and the butterflies trapped inside, goodbye the animated sheep jumping off the rocks fences…). Those were cool ideas but were completely out of the initial goal.
Stacking up the work, and biting more than you can chew is the perfect way to lose yourself in the process, be demotivated by the amount of workload and eventually never finish the project.
Of course, I can regret the lack of small details and interesting areas, but it was absolutely not the main goal I had for this project.
If I had to go more into details I would create a simpler scene with clearly established camera angles and points of interest, so I could focus more on all the individual elements that compose the shots.
The first iteration of the terrain textures was done using a complex set of splat maps and noise textures to blend between all my different materials (which were around 8 at that time). But when I switched to the UE4 landscape tool, I decided to take advantage of the amazing layer blending system and repaint absolutely all the terrain by hand using my (now)16 different materials layers.
The task was long and fastidious as opposed to the splat map techniques, But I felt like I had a bit more editing capabilities and personal control over the final result, that I couldn’t get using the splat map. In the end, I would suggest using a combination of both techniques, as it would be more time efficient and more interesting to use generated map (like erosion or slope map) which are harder to replicate by hand painting (even with custom alphas brushes ). And then paint some parts by hand like the paths or story related elements.
Into the infinite
After building the whole lighting of the scene (all the major elements that required lightmapping).
I used the foliage painting tool to place all the grass and flowers assets (It was quickly achieved by using the fill tool and then adjusting by hand the foliage density in the place where I wanted more or less foliage. I had to place all the foliage after each lighting baking because I couldn’t build the environment lighting with all the foliage placed (even when removed from the lighting computation).
Closer to the ground
In the following little tutorial, I explain how to quickly create and import Grass blades generated with Maya PaintFx. Note that I simplified a bit the tutorial and that it should be a bit more optimized in practice).
Tutorial: How to create grass blades in Maya using paintFX
Start by opening Autodesk Maya and open the Visor window located in <window< General Editors< Visor. Look for the grass menu. Try different types of grass before choosing the one that suits your needs the best.(I also use to hit the render current frame button to get an idea of what the final render will look like)
Once that’s done. I leave the perspective view and go for a side view, where I can get a better idea of what my final texture will look like (as I’m going to bake the effect to a texture). Now, it’s time to adjust all the parameters of the PaintFX grass (simply click on the grass and go in the attributes editors, you will find all kind of parameters to adjust its look).
When you are happy with the look of your grass clump, we will convert it to a 3d mesh, I will also create a square plane (make sure that UV’s are present and well setup) and place it right behind the grass object, you want the grass mesh to be projected into it.
Go to select Lighting/shading<Transfer mesh to open the tools that will help us bake the meshes data to different textures: in this case, we will bake the color (from the vertex color, the normal information, the opacity and the ambient occlusions map.
In the transfer map, place the grass in the source input and the square plane in the target. Set up all the maps you need (for the ambient occlusion make sure that mental ray is activated).
Select the output size and hit the bake button.
Once done we will use these rendered textures to create the remaining map (Roughness and translucency. These ones were created with photo scanned maps as a reference: Here is what I got:
Once this step is done and I have created all the textures I needed, I jump back into Maya and start applying the texture into my previously created plane and cut the unneeded blank space (geometry follow a bit more the shape of the grass mesh). I then place the mesh into grass clumps of different size and add vertex color so I will be able to give the grass some nice moving effects.
The next part concern the importing of the asset and textures in the UE4 engine, but a drag and drop is enough now a day to have everything set up, make sure you import the vertex color and uncheck the srgb tickbox for the roughness textures.
The final part concerns the creation of the grass material with some particular effect. I set up my material to a masked blend mode (using my alpha texture as the opacity mask) and the shading mode to two-sided foliage (which require a translucency map). I then connect all the map to their respective pin (as shown in the screenshot below).
The follow grass is not needed but can add a lot to the grass material, the first graph is connected into the base color slot and serve as a way to color the base of the grass with the landscape texture ( I created a top-down render of it).
And the second one is linked to the world position offset and is a simple wind effect using a simple vertex animation added with a noise texture that also deforms the vertex.
When the material is set up, all you need is place the mesh into the foliage painting tool and start placing your newly created grass where you want it to be.
When It comes to trees creation, SpeedTree is definitely one of the most efficient and essential software you can use.
It is well integrated with the unreal engine and the tool generates for you all the elements you need to create an optimized game ready asset (LODs, imposter, wind, vertex ambient occlusion, lightmaps optimizations).
Inside the tool, you have a great control over the final quality and optimization of the elements you are creating.
After finishing the design of my first tree, I started playing with the sliders to reduce the maximum amount of unneeded triangles to create the 3 LODs. I also easily and greatly optimized the lightmap to give a higher resolution on all the little leaves planes instead of the trunk. (which gave me in the end better lighting result without drastically increasing the lightmap size in UE4).
SpeedTree also automatically generates amazing imposter meshes that integrate perfectly well in the engine. The use of imposter greatly improved the performance of the scene. (Lots of Trees were visible at the same time).
Previously I tried the 3D imposter system in UE4 but quickly abandoned it after encountering several problems (with the foliage tool and the angle transitions). I also had a harder and longer time to render the imposter and makes everything works well, in this case, SpeedTree was the way to go.
The lighting has been an interesting part to create, and I really iterated a lot on it. Trying different lighting scenarios, evening, morning, cloudy. And playing with different lights/environment colors to get the result I wanted:
As you can see a small change can have a huge impact on the final image:
Here is the basic setup I used for the lighting, nothing fancy, what will really bring the level close to the most realistic render is the way all the materials interact with the lighting and with each other. How the grass color with the global illumination affects the nearby rocks or barrier color.
I started with a fully dynamic lighting scene using the Light Propagation feature to get the global illumination effect and get great bouncing light. Sadly, it was way too expensive performance-wise and the GI effect was losing a lot of precision to be worth using it in my final composition.
Thus I opted for a mix of baked lighting and dynamic one. As I couldn’t generate lightmaps for all the grass (which represent a lot of instances, around 500k). The scene is using cascade shadow map and volume lights samples.
The sunlight is also masked with a panning light function (that represents the cloud shadows). Those little details help to set the scene into a convincing and believable world.
Old house lost in the landscape
I wanted to be as close as possible as reality concerning the shapes and textures of my rocks, and it’s naturally that I started looking around on online photogrammetry libraries to find some great rock shapes that I could integrate into my level. I picked 6 of them, after importing them in a modeling program, I started with some small optimization work done pretty quickly by hand (removing backface, cleaning some bad geometry, avoiding texture stretching, redoing the Lightmaps Uv).
[Insert Picture Here]
Once that part was done I moved on the texturing part of the asset. The downloaded textures weren’t going to fit in the level so I proceeded with minor changes (Mainly color and luminance adjustment, retrieving some lost details).
The rocks were then integrated as if in the engine with a basic shader.
For the rock fences, I used one of the rock mesh and I built a small wall by stacking it up (like a bricklayer would do.) This wasn’t very lightmap optimized but it does a great job capturing the feeling of the stone wall we can encounter in the area.
Most of the static meshes used in the scene
The scene is pretty light in term of number of different assets, 5 types of foliages + their variations, 4 types of rocks/wall + their variations, 1 house and its variation , 1 tree and 4 variations, 1 fence and 2 variations, one rusted water tank, and a cute sheep with different poses.
The trees were created using Speedtree and the rest of the objects were sculpted in Zbrush and textured in substance designer/painter trying to get the most realistic feeling I could get.
Towards the mountain
The screenshots you are seeing right now are actually my second take on this environment.
The first one was done 7 months ago, when you asked me to be interviewed, I reopened the scene to capture some additionals screenshots, but what I saw didn’t satisfy me anymore, so I decided to rebuild most of the objects present in the scene, and switch the art direction to something more personal and full of emotion.
The first project I made was looking like this, next is the modified and more personal version.
The first version took me around 3 weeks of full-time work to complete. While my second iteration was spread out over a longer period of time (3 months) because I was working mainly on the weekend and around one hour per day.
The second version benefitted from a long list of additions and changes. I started by giving a slight boost to the color saturation and gave the scene a brighter look, as well as adjusting the color grading to better match my vision.Took advantage of the 4.18 new lighting features (volumetric lightmaps/fogs and the multibounce skylight) and reworked assets that weren’t visually appealing.
I also did a huge optimization pass on all the assets, It had a minor effect on the visual but a massive impact on the lighting building time and the rendering performance (I was able to render bigger screenshots and take videos without running out of memory or crashing the engine). I invite you to compare the two projects by following these links here and there.
And by giving your opinion in the comment section below.
With a small but qualified team, the creation of this kind of environment is something that’s easily doable. A small amount of assets and materials were created in the scene. For a team of 5 people, it wouldn’t take too much time to make. Adding an extra layer of details could increase a lot the amount of work needed to complete the level as it is directly linked to the size of the environment.
A team could invest a part of its budget in material and asset libraries to skip the asset creation and focus on the world building, but also on procedural placement tool, to quickly generate more believable environment and focus on the game stories and intrinsic elements.