Overgrowth

Environment Breakdown

Rey Zhong

mainthumb
234

Rey Zhong

Environment Artist

Introduction

Hi everyone! My name is Rey Zhong, and I'm an Environment Artist.
In recent years, I’ve been working on Forza Motorsport and Halo Infinite. As a young artist in the game industry, I’m excited to share my experiences.

Project

In this post, I’ll describe my process for creating the overgrown vegetation for Forza Motorsport. For this game, I designed the overgrowth and flowers in all 20 tracks launched on the first day.

I want to express my gratitude to Turn 10 Studios and our amazing environment team for their outstanding work.

I hope that by sharing my experience, I can help people gain a better understanding of vegetation art in the game industry.

Due to the rich variety of vegetation across all 20 tracks, I will provide an example from both flowers and weeds to illustrate the SpeedTree pipeline for creating game vegetation assets.

image9

Reference

The Circuit of Spa-Francorchamps is a forest track with rich vegetation. From what we see in real life, places with dense vegetation usually have a predominant green color scheme.

However, for a driving simulation game, having the same colors throughout can be dull. To make it more visually appealing for players when speeding through natural landscapes, I’ve added some floral elements to Spa to provide a sensory break.

image21

Using flower assets as an example, I picked real-life photos as a reference. The pictures are from different angles, which include:

  • Photos of the plant field scene: These types of photos provide an idea of the size and how to integrate this vegetation into the game.
  • Close-ups of the plant’s leaves or petals: This helps in understanding the plant structure better and aids in selecting suitable textures from the library.
  • I also gathered photos showing how the plant looks in different lighting conditions. When incorporating these assets into the engine, we need to refer to these images to adjust the AO and Subsurface maps to achieve a more realistic appearance.

Structure

After completing the reference collection, my next step will be to analyze the structure of the vegetation.

image19

Despite the seemingly chaotic appearance of vegetation in nature, we can still identify patterns by observing their flowers, stems, and leaves sequentially. This image is a drawing I created based on the reference on the left.

Firstly, it’s a type of large-sized flower with an unbranched stem, where all the leaves grow on a single trunk. The leaves are thin, flat, and curved like a crescent moon.

All the flowers bloom at the top third of the plant. The lower flowers bloom first, revealing their stamens, while the upper ones remain closed and appear smaller and younger.

The color of the entire plant stem gradually transitions from purple-red at the top to green at the bottom. Analyzing these shapes is crucial as it will assist us in organizing nodes in the subsequent SpeedTree production process.

Preparing textures for SpeedTree high-poly model

Once we’ve completed the analysis of its structure, we can start working on creating the plant. Before we delve into SpeedTree, let’s prepare the necessary texture maps ahead of time. 

You can freely search for suitable textures in Quixel or any CG texture library. However, please pay attention to finding separate textures for petals and leaves.

We will combine them in SpeedTree, which will result in a higher quality Ambient Occlusion map. AO maps and Normal maps are crucial for vegetation in games.

When creating large areas of forests or dense vegetation in a game, it’s necessary to significantly reduce the poly count for each plant to ensure the health of the GPU cache and smooth gameplay.

In such cases, high resolution clear AO maps and normal maps can still help us achieve realistic visuals.

image1

Building flower high-poly in SpeedTree

Using this type of flower as an example, I’ll start creating the plant and divide it into 2-3 different Zones at the base partition. The purpose of doing this is that when we need to create different variants of the same vegetation to increase diversity, we can easily obtain different results by rotating or changing the position between Zones.

image24

Afterwards, we establish Branches based on the Zone. From reference analysis, it’s apparent that flower stems in nature are not smooth and perfect curves; they are typically irregularly twisted.

I usually use the “Early” function in Noise to make them point in different directions.
I use “Late” in Noise to give them a slight curl. This technique can also be applied when you want to create some vines.

Next, I’ll create leaves. As I mentioned earlier, finding separate leaf textures is very helpful. We can choose any 2-3 individual leaves.
They can be high-poly so that we can avoid any jagged edges when curling them.

Don’t worry about them being heavy; we’ll bake them into textures later on.

image36

Then, by increasing the “Curl” value, I make the leaves curl slightly, as mentioned in my previous analysis of the reference. Capturing the outline of the leaves is crucial.

Just as I do when creating Branches, I give leaves different orientations and some twists to achieve a natural result.

Once I’ve completed the branches and leaves, it is time to move on to creating the flowers.
I adjust the values of “First” and “Last” to make the flowers cluster at the top of the branches.

Increasing the value of “First” will make the flowers gather towards the top.

image40

An interesting trick is that when you want to change the size of the flowers, adjusting the curve editor to the right of the Scale value allows you to control how this value affects flowers at different positions.

If you want the flowers at the top to be smaller, use this method.

image20

Next, I create another branch at the top to serve as a closed flower bud. Since flower buds are typically inverted cone-shaped, I need to adjust the diameter of the Skin.

By controlling the curve editor of the radius value, we create points on the curve. This allows me to easily change the shape by adjusting these points.

image41-ezgif.com-optimize

I use the same method when selecting petals as I do for leaves.

image8

Since the shapes of flowers are non-repetitive, and I wanted them to differ in size and orientation to achieve a more realistic appearance, I divided the flowers into two groups.

The ones marked in red represent the group where the flowers grow upward, constituting the main part of the bouquet.

The ones marked in blue represent the group where the flowers droop downward, serving as embellishments in the bouquet. This kind of grouping enriches the overall outline. It’s a common splitting method I use when creating many other plants as well.

As I mentioned when introducing the reference, the branches of this plant have a gradient color. Its base is green, gradually transitioning to red at the top. The “Shell” node can help us achieve this.

We create a material with a gradient opacity. The bottom of the opacity map should be white, and the top should be black. This way, the material will have a gradual fading effect.

We set the color of this material to dark green and attach the Shell carrying this material to the branches to achieve the following effect.

The following image shows the result after completing the High Poly model.

image22

Building weed high-poly in SpeedTree

Foxtail grass is a common type of weed. It and its variants appear on most tracks. Similarly, analyzing reference images before we begin is crucial. Foxtail grass is clustered with weed-like grass, which is not difficult to understand.

The most important part is the foxtail itself, where seed clusters are densely packed together and surrounded by numerous filamentous structures. I divide the foxtail into three parts: two different shapes and orientations of seeds and one type of filament.

But don’t worry; we won’t need to prepare any additional materials. All components of the foxtail, including the filament, can be directly created in SpeedTree.

image37

First, let’s start with the simpler part at the bottom. I created three different Zones to distinguish between different heights of grass. The early one is the main group, which contains the most grass.

I applied some gravity to make them droop. However, now they look too regular, like they were planted by humans. To make them look more like weeds, I added more groups. I added shorter grass and taller grass to make the overall appearance more chaotic.

image34

Next, I create the “tails” for the foxtail grass. Similar to creating flower buds earlier, we control the curve editor to make the shape of the Skin elliptical.

Then, we increase the quantity to cover the entire top of the branches. Afterward, we duplicate this node and slightly change the shape of the Skin to make it distinct from the previous group.

Finally, we use branches to create filaments, reducing their diameter and significantly increasing their quantity. We also adjusted the “Early” value to make the filaments look fluffier.

Compared to the reference image, my filaments are slightly longer because I want them to be more noticeable in the game. Under the influence of AO and subsurface, these filaments will appear fluffy in the sunlight.

image43
image23

The following image shows the result after completing the High Poly model.

image13

Low poly baking in SpeedTree

I will use SpeedTree’s “Export Material” to bake textures. Before that, I need to switch the view to the front view and make some adjustments to the outline of the plant.

Taking foxtail grass as an example, I want to leave some negative space in the weed cluster. This way, when these Flat meshes are stacked together, it will create better layering.

After completing the outline, I need to Compute AO.

The image below explains the effect. Because Computing the AO calculates lighting and shadows between objects, it captures more information.

image12

Thanks to the intricate details of the High Poly model, I still managed to obtain very clear and high-quality textures even at a resolution of 2K.

Here is the final result of the Low Poly model. The next step is to place them into the engine, and then we’re done!

Result & Conclusion

Forza Motorsport is a large-scale game featuring numerous famous tracks from around the world. Some of these tracks occupy vast areas. To alleviate optimization pressure, all vegetation in the flower fields and fields in the image below are Flat meshes.

Using as cost-effective vegetation models as possible enables extensive layouts, allowing us to witness vast expanses of fields and grasslands in this generation of the game.

Shortly after I started this job, I was informed that my main task would be to create overgrowth vegetation for each track.

It was a daunting task; I needed to create models and then design them to complement each other in different environments. It took me 18 months to complete all of this work.

I think it’s the coolest thing I’ve done since entering this industry. I hope the experiences I’ve shared in this article will be helpful to your work.