@Utsav singh, Yes. But a kind of lowpoly projection to have the best balance between poly count and alpha/quad overdraw.
Appreciate the shoutout!
your shader complexity is low because you used true polygon models instead of just a masked plane to prevent alpha overdraw?
Joakim Stigsson shared some details on the way he mixed open environments, hero assets and killer materials in his newest Golden Gasoline scene, created in Unreal Engine 4.
My name is Joakim Stigsson and I’m a senior environment artist living in Sweden Stockholm, currently working at EA DICE, which I’ve been doing for the last 3 years.
I just finished my latest personal project, a desert gas station I’ve called” Golden Gasoline” and I wanted to share a breakdown with some general thoughts about creating this kind of environment.
The whole idea started after I was finished with a gas pump I textured in Substance Painter to get to know the software better. I was using Unreal Engine 4 to render my gas pump and at first, I was thinking about building a small diorama together with my gas pump. But instead I decided to actually create a desert with a large-scale terrain and vegetation together with a gas station. Working with large terrains was something I’ve done before at work, creating environments for Battlefield, so I wanted to give it a try in UE4 as well. By searching for references, I found some interesting pictures that I used as inspiration for my environment. I had already created a cactus material in Substance Designer so I thought I should use it in the scene as well. That’s why I decided to base the desert on the Saguaro National Park in Arizona, known for the huge Saguaro Cactus growing in the area. I also wanted the gas station to have a retro 70’s look and decided to go with simple shapes with distinct colors.
There are different ways how you can create a terrain to be used for an environment. Houdini and World Machine have tools that allows you to procedurally generate a terrain heightmap but for my environment, I wanted to use real world lidar data for the terrain.
From there you can download free point cloud lidar data that you can convert into a hightmap.
To convert the downloaded lidar data to a heightmap, I used a program called Global Mapper. From Global mapper I exported both a heightmap and a matching colormap from the selected area. I managed to find an area in New Mexico that had some nice features that I liked. In the image, you can see the terrain heightmap together with the matching colormap.
Height and Color map
Next step was to import the height and my colormap in UE4. Since I wanted a large vista I created a 4x4km terrain in Unreal and imported my heightmap. I created a terrain master material and imported the colormap as a texture which I applied to my terrain material to create some large-scale features in the terrain. This colormap combined with the different terrain textures gave me some nice details up close and large details from further away.
Combined height and colormap in UE4
For my terrain master material, I added some instance parameters that allowed me to adjust the settings for my different terrain layers. This gave me more control once I had the all the terrain layers in place. I will go into more details on how I construct my terrain master materials and shaders later in this article.
Blockout and Iteration
Once I had the terrain in place I manage to find a spot for where I wanted to place my gas station. I started blocking out some simple shapes and added some textures and props I already had created before this project. I did a simple light setup with the default sky just to have something to work from. From this stage it was a really iterative process with blocking out new assets, adding them to the scene, creating high and low-poly, and texturing in Substance Painter. For this project I worked on tasks in the order of what I felt inspired. I jumped between working on assets, terrain, vegetation, lighting, shaders etc. I created a rough plan and an asset list of the things I needed for my scene. The most important thing for this project was to always try stay inspired since I was working on it during a longer time period and only on my spare time.
Early blockout in UE4
Work in Progress Timelapse
For texturing assets in this environment, I used Substance Painter and Substance Designer. Before I imported the highpoly and lowpoly in to Painter I prepared the asset in 3ds max by setting up a material structure to later be baked as a material color id in Painter. I created a master sub-id material in 3ds max that contained the different material I thought I would use in my environment. This sub-id material in 3ds max was something I used for all my assets to stay consistent. That way I knew that every time I assign blue as a color, it was going to be steel in Substance Painter.
I also created a smart material inside Painter that had the same setup as my sub-id material in 3ds max. So, whenever I was done with my baking in Painter I could just apply the smart material and it would assign the right base material depending on the baked colormap ID. This worked as a base and it did speed up the progress when it was time for me to add more details, dirt, scratches etc. I used this workflow on pretty much every asset in the scene.
Texture setup in 3ds max and Painter
Gas Pump in Marmoset (Marmoset Viewer)
Car Texture Setup in 3ds max
During my texturing process I always try to check my assets in UE4 with different lighting condition as often as possible. There is one thing looking at your asset isolated in Substance Painter, but there is a completely different thing when you place your assent in your scene next to other assets, with the right lighting. Some features might get lost or will look to noisy when its placed in the scene. Also depending where and how the asset is used in the scene the materials and details might look different. I also created an assets scene to easily have an overview of all the assets, materials, textures, etc.
Materials, Shaders & Textures
For all the assets in the scene, I created “master materials” with materials instances and parameters depending on how the assets where going to be used. For this I think it’s important to create a master shader that are optimized for it specific purpose instead creating one big shader that is going to solve all needs. My master materials for this scene where divided into MM_Terrain, MM_Props, MM_Decals, MM_Vegetation, MM_Glass etc. and all of them contained parameters where it was easy for me to tweak all the material instances later on.
I like to keep my shader graphs as clean and simple as possible, both for easy navigation, reusability and performance. For my terrain master material, I created a few different material functions that I where able to plug in to my shader to keep it nice and tidy. I see those material functions as “lego pieces” where I can add or delete them to make my shaders more simple or complex.
Terrain Master Material
In this example I’ll show how constructed my terrain with the master material included material functions. As you can see in the image for my MM_TerrainBlend I’m using three different terrainlayers that I’m blending together. I created each terrain layers as a material function that contained all the necessary parameters just for that specific layer, again just to keep it nice and tidy.
Terrain Layer Material Function
I also created material functions for thing I knew I would use over and over again, such as normal intensity, camera fade, terrainsparkle, colormapblend etc.
In the image,you can see how I added the large scale colormap as a material function with input and output that I plugged in to my terrain master material.
Colormap Material Function
Once I had all terrain layers and materials functions in place, I created a material instance of my terrain master material and applied it my terrain. They way of constructing the master material and functions gave me tons of parameters and option to tweak both for my individual terrain layers but also for the overall terrain. I was using similar setup when I created master materials for other types of assets as well which made it very easy to tweak once everything was in place.
Material Instances example for terrain and props
For textures on my terrain I packed them in a way where I only had to use 2 textures for each terrain layer and still use all the necessary maps, Color, Roughness, Normal, and Height. This would save me some texture memory and keep it a little bit more organized.
Normally you would have a normal map that are using all three channels (RGB) but instead I’m using the blue channel for height. Using this way of texture packing will result in some quality compression for my normal map. For me it wasn’t an issue since my terrain material where quite noisy and together with all the other thing in my scene, it was barely noticeable.
Terrainlayer with channel packing using 2 textures
To get this channel packing to work I need to “recreate” the blue channel for my normal map inside the shader in UE4. I made a material function that I plugged in to my normal map and then I was able to use the blue channel separately to my height.
Normal map unpack blue channel
To create the vegetation for this scene I used regular highpoly modeling in 3ds max that I baked down to a plane in Substance Painter. To scatter out leaves and twigs on branches I used 3ds max object paint tool. I baked the color from the highpoly meshes and added details in painter where I also created my roughness and translucency. Once I had the textures I constructed the different lowpoly meshes in 3ds max and added vertex paint to make the different assets to react with the wind. There is a lot of people using scanned textures such as megascans for creating foliage but I wanted to have full control over the shapes,
I created a master material inside UE4 with sub surface scattering and also added vertex and object sway to make the scene a little bit more dynamic. For the large cactus I created a tileable material in Substance Designer and applied it to a mesh. I did a breakdown of how I created the cactus whit spines a while ago that you can find here.
Vegetation Master Material
Lighting & Blueprint
Normally when I build environments in Unreal Engine 4 I create lightmaps and bake all the lighting. But for this scene I wanted all the lighting to be dynamic. This would save me some time since it would take some time to bake such a large environment. It also allowed me to be more flexible by switching between different lighting conditions, and not have to re-bake every time I move or tweak an asset. I also used light propagation volume to add some dynamic global illumination.
I used UE4 distance field ambient occlusion to get some large-scale shadows that replaced the baked lights. For the sky I used a HDRI-image that I mapped on a sphere and used as source for my skylight. I wanted my “hero-lighting” to be set on a late day with long shadows, warm colors and blue/purple sky. It really was a challenge to find a good balance between the sunlight and sky. I wanted the sun to be a little bit overexposed but still keep the details in the sky. The lighting process was something I tweaked during the entire project until the very last point to find something I was happy with.
Render passes in UE4
For my lights I added a blueprint to be able to turn them on/off or to make them flicker. By adding some simple instructions, I where able to create some variation in my scene. Since my lights where using emissive together with a light source I had to make sure to switch both the material and the light when changing light setting. I added a lightshaft to my lights to get some more atmosphere in the scene.
Ceiling Lights Blueprint
I also created a sky blueprint that allowed me to switch between different daytime by using four different HDRI-images and light-settings. This was also a good way of showing the assets and material features in different lighting and to spot issues. I created four settings that were quite unique from each other to get as much variation as possible. I also created four unique LUT color gradings for each lighting and switch them together with the lights in the blueprint.
Conclusion & Result
This project was really fun and challenging to work with. I got the chance to learn some new workflows and also spend some time with blueprints in UE4 which is something I’ve not don’t that much before. It was also challenging to archive that cinematic look which was something I aimed for. Getting all the materials and lighting to react in a natural way with the dynamic lighting.
To see more images and info from this project you can visit my Artstation. Hope you found this breakdown useful and don’t hesitate to contact me if you have any more questions or thoughts.
I hope you enjoyed this breakdown. Thanks for reading!