Abies Alba

Environment Breakdown

Quentin Rapicault

thumbnail_03
261

Quentin Rapicault

Vegetation Artist

Introduction

Bonjour! I'm Quentin Rapicault, a French environment and Vegetation Artist currently in my fourth year of graduation.
I'm very excited to share here what I've learned and how I think when I work.

Goals

I’ve tried to allocate time to work on personal projects alongside my graduation requirements, specifically focusing on vegetation. I aim to progress in this direction by challenging myself each time by creating new species, and this time I chose the Albis Alba, a type of fir that looks very natural.

The challenge was to create a realistic, game-ready tree while finding a new, interesting way to do so. I spent around two months refining my work, experimenting, and testing various approaches.

This process helped me find a more efficient way to create with faster turnaround times and higher quality. Overall, it was a side project I worked on during my free time, which allowed me to take a step back from my main work.

Software

  • Maya: Cleaning, optimization
  • Speedtree: Modeling, UVs, Texturing
  • Substance Designer: Texture pass
  • Unreal Engine 5: Game Engine

I have a specific workflow for vegetation involving Speedtree, Designer, and Maya.

I begin by creating the tree with basic shapes, placeholder leaves, and sometimes hand-drawn atlases to visualize what I’ll need.

Then, I add the necessary details and ensure the tree looks appealing from multiple angles. Afterward, I create the texture atlas, either from scratch or using pre-existing atlases from Speedtree.

Before applying the textures, I clean them in Substance Designer to avoid issues like black outlines or incorrect streak color. Research plays a crucial role in my workflow, as nature often presents beautiful inspiration.

References

I learned from Jobye Karmaker’s conference the importance of searching for plants by their scientific names. Before selecting a fir type, I researched various options.

For a previous project based on The Division 2, where I recreated the Rockefeller Center Christmas tree, I used the Norway spruce (Picea Abies).

After further research, I found its cousin, the Silver Fir (Abies Alba), which I found particularly interesting and challenging as I had never worked with it before.

image1

Texturing

Speedtree

Here are my polished placeholder textures. I always start with this step before modeling, just because, well, why not?

To create the fir atlas, I researched how it’s done in different video games and tried to figure out how to replicate that in Speedtree.

I used to draw the atlas on paper, which helped me visualize the layout. I also came across a tip advising against creating branches with high density to ensure they can be easily separated with the cutout in Speedtree.

So, I took that into consideration when creating my textures.

image2

One challenge I encountered early on was with thorns. Initially, I thought I would use thorn atlases to create my own atlas, but it ended up looking too flat.

So, I decided to generate everything as meshes instead. It requires some flexibility with your PC, but it allowed me to have branches with a rendering closer to what I needed, especially considering the colors of the branches were less prominent.

Looking back, I can see that the texture space wasn’t very optimized, as there were a lot of empty parts on the texture.

So, if you need to create an atlas, pay attention to that (unlike me here).

Designer

Before applying my textures to the tree, I need to clean them to avoid the black outline effect. That’s where Substance Designer comes in.

I export four textures from Speedtree:

Base Color, Normal (OpenGL), Subsurface, and Mask RGB. The last one on the list is a method I found to tweak the texture procedurally in Substance Designer.

image5

I create a graph where I can control the Flip Y normal (to export Normal(DirectX)), the Diffuse Color parameter (whether I can use the opacity directly or not as a mask), and a roughness part, which I might use for a custom roughness map.

I used to store it in the alpha of the Subsurface, but I don’t use it here. Additionally, I can create a subsurface with my RGB mask in case the subsurface from Speedtree is broken.

Overall, the RGB mask is the main element of this graph, as it allows me to create a gradient or color variation on the branches.

image6

The main function of this graph is to diffuse the base color.

Why? Because if you don’t diffuse the base color, by default in Speedtree, the texture background is a solid color. With texture compression, an outline with this background color will appear.

So, to avoid that, I just diffuse the color with the diffuse color node. After that, I’ve also added some tweaks to add brown color spots to avoid having a big green flat color.

image7

Make sure to export your base color in 8-bit and not 16-bit if you don’t want to end up with a lighter texture in Unreal.

Now I have my base color, normal, and subsurface textures ready.

Modelling
Speedtree

For my first attempt, I tried the classic approach for fir or pine trees, which involves using fronds growing directly from the trunk.

I added some extra fronds to give it a fluffier appearance, but even with the texture, it was just okay, not quite good enough for me. So, I decided to try something else.

Whether with or without the extra fronds, it looked either too flat or too dense.

I thought about how fronds grow in real life, remembering the fir trees from my parents’ yard in winter.

I recalled that underneath the leaves or needles, there are branches, so I added a level before the pine fronds, resulting in a tree that looked like this.

This is why I believe it’s always useful to include a branch part in the atlas

Now, I had to add the pine needles on it with other fronds and make them grow more naturally than just having one frond. The polycount with this method was slightly heavier, but not excessively so, and it made the fronds look more realistic.

For the top of the tree, I divided it into two levels to avoid extreme downscaling of the texture.

I used the small branches of my atlas for the top part and small branches and dead branches for the bottom part.

image14

I used two ways to create fronds, but each time, I aimed for the most organic result, avoiding the unique frond/spline construction.

After this, I spent a lot of time manually moving some branches and making the overall shapes more neutral but not boring. I needed to maintain some holes and irregularity in the silhouette.

These trees are destined to create a forest, so I couldn’t give them a remarkable character like hero trees.

Now, I could export, but before that, we needed to check some things. Firstly, I checked the normals to ensure that the fronds had their normals facing up, as we didn’t want the fronds’ normals facing in the wrong direction.

Sometimes, on other kinds of trees, it can be cool not to smooth every normal and keep them like a group sphere.

For that, you just have to select a mode other than “Global” in the Lighting anchor settings.

Secondly, I checked the triangle count, as these trees needed to be game-ready.

In Speedtree, you can see the global and per-node triangle counts, which is very useful for identifying which parts need optimization.

With optimization come LODs. In Speedtree, it’s pretty simple to use the frond LODs; you simply need to create a linear decay curve in the LOD settings. As for the trunk, you just adjust the segment curves.

Okay, now I could export the mesh. The scale was set in centimeters, and I unchecked the texture export.

Before using this mesh in Unreal, we needed to fix some things in Maya or any other 3D software we had.

image21

Maya

The normals were already world-up, so they didn’t need fixing.

The LOD export from Speedtree was broken, so I had to create a LOD group, and I froze the transform (reset Xform in 3ds Max). Additionally, I could also delete the superfluous UVs created by Speedtree.

image22

This workflow with Designer and Maya was smooth for me, and it’s something very important because to get the result I needed, I had gone through this process many times.

My tip is to test your assets in Unreal Engine as soon as possible, especially foliage made with Speedtree because the render issues are avoidable.

I believe the modeling part is over, and now we will talk about what happens in Unreal Engine.

Unreal Engine
Materials

For my personal work, I’ve typically used only three textures (sometimes only two): Base Color, Normal, and Subsurface. So, I’ve created a material pattern for the vegetation that I can use across all my projects.

The wind functionality is still a work in progress, and it’s important to note that it adapts to my work, so it’s not the ultimate vegetation material.

image23

Let’s dive into my Master Foliage Material. For those interested in stats, the base pass shader consists of 291 instructions, which is pretty okay. Starting with the base color, I first add a gradient made with the vertex color.

I usually use the blue channel for the gradient (or trunk sometimes). Then I add the color variation. This time, I put the vertex color channel in a parameter to make it modular with any other type of foliage, like grass.

The red channel is used for the wind mask but can also be useful for color variation.

I also include an option for Wind Noise. On the fir tree, it isn’t very visible, but for other kinds of trees or grass, it can be very nice.

This part ends with the Snow Color. The snow mask is simply made with blended vertex colors and a noise.

image24

For the normals, I have a parameter for normal intensity and a lerp to fade the normal where it’s supposed to have snow. The same goes for the subsurface and opacity.

The roughness is derived from the green channel. I put it in a remapValueRange node to get the value I want, but I don’t cut them like a clamp can do.

I’ve also included options for Pixel Depth Offset and Opacity Dithering. These parameters are for adjusting the rendering and sometimes also lightening the opacity cost.

Now, let’s talk about the Wind! I use a material function I created. I continue to use the simple grass wind, but I try to differentiate it from my wind.

So, I have a noisy wind constant made by the SGW, and I also have a noise scrolling to generate wind waves. I basically add them and play with some mathematics to have control over their intensity and direction.

I’ve made a widget to play with the wind, but I’ll show you that in my next post.

image25

It’s important to know that the texture I use for wind waves is just grayscale, but you can stock three (or four with alpha) noises in it, which can create a really good wind effect.

Also, keep in mind that this material is made for my render, so it may not be adapted to what you need. Don’t hesitate to look at many tutorials to find the best way for yours.

You may have noticed that I use Parameter Collections. It’s very useful to control settings like wind or snow with it because it’s a world parameter and it influences everything in your scene in the same way.

Plus, it’s more efficient to tweak your level with this kind of setting.

image26

Lighting

If you’re an artist and you need to showcase your work, lighting can either be your most terrible enemy or your greatest ally. Regardless, the most important aspect is how you present it.

While mine isn’t perfect, I believe I’ve found some pretty cool settings to render my trees.

Firstly, I want to show you my shadow caster mesh that accompanies me in every project. I’ve created a special render post with the final assets and ambiance, but it’s also good to have a “neutral” render where your work is the main focus.

These kinds of meshes are perfect for providing a background with a nice lighting setup.

I also take examples from the posts of Adrien Paguet-Brunella and Jobye-Kyle Karmaker.

I need to create a basic lighting setup for this scene, maybe just to provide a small mood to it.
I simply tweak my directional light, skylight, and post-process volume.

I’m accustomed to tweaking the color adjustments in the post-process volume. I’ve also added a vignette effect and a bit of sharpness.

Rendering

I set up nine cameras: two main shots, two close shots, one thumbnail shot, and three for the top view of the field. Then, I’ve used a Sequencer for the video export with these cameras.

image27

Now, let’s talk about the export part, especially the screenshots. The first thing to do is to force the screen percentage to 100 or above (+125 will take your computer some hard time).

Next, make sure to be in fullscreen (F11) and go to the High-Resolution Screenshot menu, setting the multiplier to a minimum of 2. For foliage, higher is really better because small details risk being crunched by compression.

image28

After that, I pass the screen in my Artstation PSD to add a watermark if needed or just resize it to 1080p to get a correct (and lighter) image format.

image29

Conclusion

Vegetation art is such a comprehensive branch of game art. We need to be familiar with the entire pipeline, and it always presents challenges, which is why I’m drawn to it.

I aim to showcase this intention in my portfolio. I also hope that what I’ve shared here can be helpful. I’m constantly working on new foliage assets and experimenting with different techniques and approaches.

This ongoing process allows me to discover new methods and refine my skills every day. If you have any questions or feedback, I’m open to discussion, particularly via my ArtStation.

Currently, I’m preparing a large realistic environment and a scene to showcase foliage inspired by Zelda: TOTK!

I want to express my gratitude to Game Artist for providing me with the opportunity to share my work and explain its technical and creative processes.

It’s always rewarding and inspiring to engage with others in the industry.