My name is Nikolay Marinov. I am 21, currently studying at the University of Ruse learning Computer Engineering. My friend Dian Donchev is also 21 and studies at Game Art at Falmouth University. We’re both from Ruse, a small city on the Danube river in northern Bulgaria.
We both got into game design 3 years ago when we were in high school. With a couple of friends, we were planning to study Game Design but due to some complications, I couldn’t go with them and had to stay behind and learn whatever I could on my own. At that time, another friend and I formed a small team and started working on personal Unreal projects which quickly transformed into projects for different competitions. Shortly after that, we were hired by a small software company in our city called Velocity Ventures where we spent the next couple of years developing our work habits and strengthening our team as a whole.
We were tasked with creating apps that provided virtual reality solutions to real estate agents. Other interesting things we’ve worked on included a small VR app that made us the local regional winners of NASA’s Space Apps Challenge 2018 and most recently, a concept for a “real-time spectral analysis on the moon” that gave us this year’s first place of NASA’s Space App Challenge 2019 and classified us for the world finals.
Banicharnitsa Forest Environment: Goals & General Details
For this environment, we had a couple of things that we wanted to do. We were busy working on VR apps, so we didn’t have much time to make any big personal projects.
The goal was to set a realistic deadline while being able to learn and deliver quality content like the one that’s expected from someone working in the industry. We wanted to split the work equally so that we both had a chance to try various techniques. The point was to dive deep into the production pipeline including everything from modeling to sculpting, baking, texturing, Unreal shaders, composition, and lighting.
The initial goal was to do a tight well-made real-time environment. The idea of creating a food truck that depicted a post-apocalyptic version of a bakery (Banicharnitsa – Баничарница) that makes traditional Bulgarian cuisine (Banichki – Банички) came from our desire to create something humoristic with Bulgarian motives. We wanted to catch attention of people from eastern Europe because unfortunately a lot of the people here don’t have a clue about CGI and Game Development and we want to gradually change that.
Before we started creating the environment we wanted to gather as much reference as possible. PureRef is an awesome free tool that helped us establish the style and overall feel of the scene. We didn’t want it to be photorealistic but to feel alive in its way, to feel like a game that tells its own visual story. We used the low poly/high poly workflow and used a lot of different software solutions to learn as much as we could and save the production time. Using only one or two software choices doesn’t mean that you’ll save time or that you’ll do it better just because you're confident with using it. Often, you have to jump out of your comfort zone because sometimes other programs can achieve the result you're looking for in a similar manner, but faster and more efficient.
I use 3ds Max as my main modeling software and Dian uses Maya. This was a problem because sharing files between those two programs often breaks or corrupts them. That’s where we used Blender. Blender is awesome because it can handle a lot more pressure and open and fix almost everything.
As much as we wanted the assets to look good, we also wanted them to be game-ready by industry standards. Most of the assets are super low poly and all the details are baked into the normal map. Some of the assets share their UVs with other assets so that we can save some texture memory and Texel density while still getting a good look at 1024x1024 texture resolution. Only those assets that were going to be closer to the camera/player used 2048x2048 texture resolution, but they still share the same UV space with other props. The magic happens in the baking and texturing stage which we’ll talk about in a bit.
The food truck that served as the hero asset of the scene is based on a concept from “Star Academy". We did a quick sketch on top of the concept so that we could draw in details we wanted to add as well as quickly share our ideas.
We used a lot of real truck references so that we could make the individual parts of it to feel like they could work in the real world.
Then we added a lot of details to the high poly asset and sculpted all sorts of different little features on them. ZBrush allows you to add a lot of "life" to a mesh with some simple strokes and brushes.
The terrain is made with the basic UE4 terrain tool. We created a bunch of alphas so that we could add details that feel more natural instead of using the default brush. The terrain uses a Landscape material that utilizes 6 layers in total.
The background mountains were quite fun to make. We don’t have a World Machine license, so we had to figure an alternative. We stumbled upon Gaea which is a procedural terrain generator much like World Machine but with a free version where you can export up to 1024x1024 textures. Perfect! We watched a few tutorials and knew what we had to do. We created a mountain that would suit the background of the level and exported the maps in 512x512 resolution. Then, we used the heightmap as an input for another terrain that was created with as few segments as possible. The mountain uses just a normal map and 3 different colors masked with various alphas. And voila there you have it – a background mountain. Of course, it doesn’t look great up close but we only needed it as a silhouette and if the camera/player won’t ever get close to it, it doesn’t need to be so detailed. As a result, you’ll also save yourself some memory that can be utilized elsewhere.
The materials are something we really wanted to nail and make stand out.
The main materials made in Substance Designer are the Grass, Forest Ground Material, Mud, Bark, and Moss. We utilize tips and tricks from Daniel Thiger’s Substance Fundamentals series. We first started with the Mud which combines a lot of warped, blurred and overlay noises for the most part. We then reused the base noise pass from the Mud in the other materials as a ground layer to speed up the workflow. After that, we got a lot of reference for the grass and created 6 different types of grass clumps that are essentially a combination of 12 different individual grass blades to add to the realism of the material. We later use similar shapes for the grass alpha cards to keep the style consistent over the scene. After that, we layer pebbles, sticks and twigs, pine tree branches, pine needles, pinecones, leaves, and other small details on top. A good tip for blending things naturally without making them look like they just stick out of the ground is to 1) use a histogram scan on the shape 2) plug it into the blur map of a non-uniform blur node 3) plug a slightly blurred background in the grayscale input 4) then blend the original shape on top. That will make your material pop a little bit more.
For the bark, we used a simple tile sampler to scatter some basic warped shapes that were the base of our material. We utilized a cool little node called Histogram Select which allowed us to select a height level from the height map to mask it with different colors. That’s how we get a layered effect.
The moss is made with the same method as the grass plane but has a little bit of a different structure. We vertex paint it on top of the bark and use it in a shader to have it on the Z-axis on rocks whenever we rotate them.
The school locker material is one that I had made a couple of months back for my portfolio and I was itching to use it somewhere. The cool part is that it was used on a cube made from 4 polygons and it looks great.
The “Banichki” material is where the tricky part comes. We knew from the get-go that such material didn’t exist, and we had to make it on our own. We initially thought of photo scanning with Agisoft PhotoScan and extracting the texture data from the scan but we quickly realized that it would take a lot of time and wouldn’t be efficient for our production pipeline and time scope. That’s where Substance Alchemist steps in.
We went to a local bakery, bought some pastry, and took a bunch of photos with a full-frame camera. We then made some color correction in Lightroom and made some cutouts in Photoshop. After that, we imported those cutouts in Substance Designer to make the tiles in a tile sampler and have some variation (this could be easily done in Photoshop, too). Then, we converted them into a grayscale image and with a bit of tweaking with the histogram and highpass nodes, we had a semi-decent result that we plugged into a normal map. We then exported the normal map and the diffuse map in 8k because we wanted to preserve the detail and the bad thing about Alchemist is that it’s rather destructive. The main reason we used Alchemist was that it creates a super accurate and good heightmap out of normal maps. We then created a new normal map out of the new heightmap, used the delightful features for the diffuse and exported it back to Designer. There, we plugged everything wherever need and created a roughness map out of the heightmap and some blended noises with a histogram select node.
That’s how we "cheated" our material with Alchemist. We also used it for previewing and tweaking existing materials. I believe that you need to make the best out of your tools even if you are not using them exactly as they are designed to be used. If something is going to save you time and effort, do it.
All the assets we textured in Substance Painter use a similar technique. What I like to do is blend a lot of almost identical colors with different alpha masks which makes my meshes pop a bit. On top of the stack, we add a semi-translucent Fill Layer to add a weathered effect.
The rock material was entirely created in Substance Painter because we wanted to use the baked normal and AO from the sculpted high poly and we built a material that suited our needs.
We were looking for a good and time-efficient technique for vegetation. Furthermore, we wanted something that is industry-standard and behaves well in Engine. That's why we decided to go with the planes approach. Despite the little bit heavy alpha calculations, it is still a quite "cheap" method for the engine. It allows us to change a lot of things fast and add a simple wind effect easily.
For the actual creation of the planes, we wanted to try different techniques. For the tree branches, everything is created in 3ds Max with a method learned from amazing Tim Simpson. The pines are done in 3ds Max and placed all over the branch itself. Then, everything is baked (projected) onto a 2D plane, again in 3ds Max. We repeated this process a couple of times to produce several different branches and then placed them on the trees. Looking for reference was especially crucial here. The ways in which the pines bend and the branches position on the tree are much more crucial than the actual details on the surface. This is because the branches and the tree overall is seen from a distance, so creating a believable silhouette in the first place is important.
For the bushes, we learned a lot of useful techniques from the LevelUpDigital Tutorial "Creating Foliage in Substance Designer" by Bogodar Havrylyuk. Amazing work. We created all the leaves for bushes in Substance Designer. First, a basic leaf is created, then some color and size variations are added. All of this is created in one graph. In other graphs, I did simple grass stacks and flowers. Again, the main shape comes first, some color and size variations - second. All of these outputs are combined into one texture set in Substance Designer. As we mentioned, in gamedev, it is important to optimize your process and use your "space" most efficiently.
This, I believe, was the simple part. We wanted the scene to take place in a forest so we had to populate the whole terrain with vegetation. There are a couple of tools in Unreal to make this easier, however, every tool is different and requires a different approach. I will try to explain these tools in short, so you can decide which one suits you best.
- Painting with the terrain material. UE4 gives you the option to paint meshes on certain terrain material layers. You can control the spread, random size, and other parameters. It's called Grass Tool and as the name suggests it is mainly used for grass. This is a nice quick approach but there was a problem: when I tried to add other parts of the foliage they simply collided. The only way to remove the grass is to add another layer that does not spawn grass - doing this for all the bushes, rocks, etc. was not ideal for me. I do not say that it is impossible but it would require a more complicated system or a lot of layers.
- Painting with the foliage tool. This is a nice quick tool as well. You simply add all the things you want to spawn to a brush and draw. It is a good tool for bigger objects and gives you a lot of freedom. However, I find it a little bit unpredictable and hard when trying to create something more natural-looking.
- Procedural foliage tool. First of all, this is an experimental tool so keep this in mind. This tool takes more time to set up. It has quite a lot of options and "laws" since it tries to simulate a more realistic vegetation growth and placement. It uses different spreads and shadow distances to populate vegetation more organically. I find this tool powerful and since it's procedural, you can change the terrain and simply re-simulate the whole thing again.
In conclusion, I used the Procedural Foliage Tool to simulate the forest (with rocks, grass, trees, bushes) along with the whole map. Then, I added despawners around the hero asset, used the other two tools and manually placed some elements to enhance the main composition. This way, we have a forest with a realistic feel to it and a beautiful main focus.
I want to mention here that for us, it was important to create some procedural tools to help us build the environment faster. Assembling everything by hand usually takes more time than researching into creating a specific UE4 construction script. Apart from the foliage that was placed procedurally, we created a procedural power line. Our electric poles are placed on the spline and cables are automatically attached to each end. This was quite a simple construction script that used UE4's native cable system. We added a few variations to the cables and gravity so that they looked more natural.
We also added a few particle effects to make everything look a little more alive. Fog sheets, god rays, and birds were taken from other Unreal projects - these were the only things we didn’t make on our own. We also made some alphas that were used to make simple dust particles, plus we animated the diesel generator. Finally, we found some sounds online that we added to our trailer to bring everything together.
To be honest, the hardest part for us was coming up with the exact composition of the scene. We had an idea of what we wanted to do but not that much of how we were going to assemble it. But our interests in photography and graphic design taught us something about composition and we eventually figured it out at the end (though it is probably not the best approach). I would advise people to have a more solid idea and an in-engine blockout before starting making the scene. Some other quick and quite basic tips would be to work in a uniform scale especially when working in a team, use similar versions of the software (preferably source control for the Engine), give a lot of feedback, read and watch tutorials from developers with a lot of practice, try different tools to see which one gives you the best result, spend more time and effort only on the objects of the main focus, and optimize, optimize, optimize.
Another challenge for us was the lighting - we had some experience with it, but rather with indoor and realistic lighting. For this project, we did a lot of research on different god rays and overall techniques for open-world lighting. Most of the lights should be dynamic because of the huge number of foliage and "create mesh distance fields" should be enabled. For the overall mood, we asked our Romanian friend Lucian Stroiny to give us some critical feedback and advice. We are thankful to him and to anyone who advised us along the way.
It was definitely a challenge and a very educational experience assembling this scene. Young developers like us could never be prepared for something like this. You need to dive in and tackle all the problems along the way. There are always challenges following the strict gamedev pipeline that requests a lot of optimizations, jumping between different software or fixing bugs. However, I want to say that the biggest problem is finding inspiration and a reason to continue when you feel down because some things aren’t working the way you anticipated. Even this small project taught us that there are some ups and downs along the way. As artists, we often "lack" the inspiration but this is work. And work must be done.