Axel Blin, aka Zhyrafa, showed us the workflow behind the Valorant environment project, explained how he worked with tileable textures, and shared the vertex painting process.
Introduction
Hello! My name is Axel Blin, aka Zhyrafa. I’m currently entering my third and final year of study at ArtSide focusing on becoming a full-time 3D environment artist.
I have always been fascinated by the scenery in video games I've played, and my interest was sparked when I received my first God Of War art book. I began learning 3D at an animation school, where I was introduced to Maya, Substance 3D Painter, and ZBrush. It became clear to me that curiosity would be essential to progress in this field. Upon joining ArtSide, I started learning Blender and Unreal Engine.
So far, I have only been involved as a freelance environment artist in some projects, but I would like to work for a studio to learn from others and experience teamwork in the industry.
The Valorant Place Project
I started this project for my school milestone. We were given a month to make a 3D game-ready environment based on the concept of our choice. I’ve been inspired by a lot of talented artists at Riot Games for a while, especially on Valorant, and decided to give it a try.
Instead of simply replicating an existing map, I explored the early game concept arts on ArtStation and found Pengzhen Zhang's concept for Ascent.
Image credit: Pengzhen Zhang
Composition and References
I always made stylized organic projects and I thought Italian architecture was matching this. However, I wanted to challenge myself further. So, I decided to add more hard-surface props and buildings to help me add more “Valorant'' vibes with the iconic green boxes and mechanic door. To organize my ideas, I created a Miro board alongside the project, gathering all the relevant concepts and references.
I spent an entire day wandering around the different maps in Valorant using the ghost mode in custom games. I took screenshots of textures and assets from various locations. I then started my first block out on Blender, following the original concept for the main building, and incorporating in-game building layouts for the second one. I like to import my blocking very early on Unreal Engine, even if proportions can look good in Blender, the in-game feeling can be very different. Here I planned to make this corner playable in first person, but everything looked smaller, so I was able to upscale my whole scene very early on. Importing on Unreal also helps me find the final shot I want with quick lighting, I can then determine where my focus point will be and where I will have to push my details.
Vegetation
Once I complete the blockout, I like to focus on the vegetation to quickly have an organic feel to the scene.
I opened Photoshop and painted various leaf and flower shapes, selecting the ones I liked to create an atlas.
I like to determine the alpha first and then paint on clipped layers. At the export, I disable the clipping to have automatic padding.
I then applied my texture with the alpha on a plane on Blender and cut out each leaf creating different ivy sizes and shapes. Although this process increased the topology, I aimed to recreate the Valorant feel while prioritizing detail over-optimization.
Roof Tiles
One of the optimization challenges I encountered was with the roof tiles. In the game, they are represented by textured planes with modeled tiles along the edges to create the illusion of volume.
So I tried to create a modular kit keeping topology as low as possible. And for that, Blender Modifiers are really great for managing tiles and repetitive objects! I like to define my shape on planes that I then Solidify and Array to get the repetition and procedural workflow. For example, if I see that my tiles are too thin I can just increase the Solidify value and they’ll all thicken.
From here, I like to duplicate the mesh in two parts. One will be subdivided to create a high-poly baking asset, while the other one is retopologized or cleaned on the vertex amount to serve as the final low-poly version. Here on the tile I also made corner versions of it to be able to use them on every building roof shape. Seam it, UV, and it’s ready to be cooked!
Texturing
In Substance 3D Painter, I prefer working in Unlit for most of my process. This allows me to make color adjustments using a single parameter, rather than constantly juggling between albedo and roughness values.
I start with a base color, then add occlusions using complementary colors in the Multiply blending mode, and add fully contrasted Curvature to have a guideline for my painting on the edges.
Almost all my other blending modes from here are in Passthrough with a color variation setup using the HSL filter. This ensures that when I modify the base color, the other layers automatically adjust accordingly.
As I start to add Roughness and other maps, I frequently load the asset into Unreal Engine to validate how lighting affects the objects.
Tileable Textures
When working on tileable modeling, I adopt a slightly different process. After creating a rough blockout in Blender, I quickly switch to ZBrush to sculpt the tiles. The most important thing here is to have a lot of tilting and depth variation on every tile, even if it looks like a terribly impassable pavement on which you would sprain your ankle with each step, it facilitates the generation of a more variable Height map at the baking. This will help gain painting information during the Vertex Paint part in Unreal.
For the Dirt plane under, there is a simple trick to paint tileable in ZBrush. On each brush you’ll use on the plane, you just have to enable the WrapMode in the Brush settings. The more value you add, the more the pattern will repeat.
Before the ZBrush export, I separate every tile by polygroup so I can generate a great Object ID map for the texturing and easily select each tile to do some color variations.
For the texturing part, I like to work on the TilingMaterial Sample, which is native in Substance 3D Painter. It allows me to visualize the pattern directly and avoid painting excessive focus on details that might result in noticeable repetition in-game. The painting process is quite the same: two procedural layers and the rest in Passthrough. I like to take my time on this part, it’s one of the rare times when you can really paint as a 3D artist. I usually use two brushes to paint, the KnifePainting and the BasicHardPressure, where I adjust the softness for blending. Additionally, the BlurSlope filter can be very handy but I try not to use it too much because it can easily be too dirty or noisy on the paint.
Apart from color variations, I almost always add a roughness value to my layers. I determine the starting roughness value on the Base Color layer, depending on the material I’m painting. I never go too far from the median value to ensure some more variations easily. Here I started at a .6 value. I usually like to assign my occlusion a higher value and my edges a lower. Additionally, I create a roughness map in Photoshop, which I apply to certain assets in the Difference blending mode to have a more geometric and painted look matching Valorant's art style. Again, here, blending modes can be very great to play with every layer.
To easily switch between modes and see which one is the better on your layer, you can use the mouse wheel after selecting one!
The LinearDodge mode is particularly useful for adding additional value without overwriting the others. You can also use the Inverse Subtract mode on a white layer to see your Glossiness map, it sometimes helps to better understand how the light acts on the material.
Vertex Painting
When texturing larger-scale objects, doing it on a single map would be time-consuming and impact performance. In such cases, I like to use multiple tileable textures and blend them using vertex painting within the shader.
Each tileable object is assigned a texel density value at the beginning of the project to ensure consistent tiling and levels of detail in-game.
In Blender, you can easily set texel density in the UVs thanks to this great free add-on made by Ivan Vostrikov.
Here I set my TD at 1024.0 px/m.
For the topology of the object, I like to keep the edge loops I made for my windows to gain more precision on the vertex painting.
Whenever you need to add or adjust edge loops or vertices without affecting the UVs, you can check the "Correct UVs" option in the panel after creating the loop and move the vertices by pressing "G" twice or thrice!
For the shader settings, there are various approaches to setting up vertex painting. What I usually like to do is assign each material in a SetMaterialAttribute node and use a BlendMaterialAttribute node to Lerp them using the VertexPaint as the Alpha, avoiding the need to Lerp each map individually. At the end of the graph, I add a GetMateriaAttribute node to split all my maps and do some parameters on the global Albedo and roughness to tweak all the textures at the same time!
The VertexPaint mask I used is the Height map from my baking multiplied with the AO to add more noise to the painting.
The less Strength and Falloff you set up in the painting settings, the more you can play with the mask. For each texture, I set a single color channel of the VertexPaint node and switch between them on the painting to add them. You can switch between paint and erase with the X shortcut – and voilà!
I then took some of the bricks I sculpted and used them as “caps” on the wall to add some volume at the edges or the intersection of another object. I created a Smart Material from my brick texture to add the same one to the single bricks. Then I place them on certain places on the walls.
Painting the Sky
For the sky sphere, I painted the clouds in Photoshop using simple tricks.
Starting with a simple Blue Azur background, I played with some blending modes with purple gradients to add more volumetric color to the sky.
Next, I painted some simple volumes that would determine the cloud positions with some ColorDynamic on the brush parameter to add some variations.
I then merged my layers and blurred the volumes with the Smudge tool with a DryBrush shape to blend the clouds in the sky and give them a more ethereal appearance.
I added shadows using the Multiply blending mode.
Then I placed my sun as a simple dot with an OuterGlow filter for the shiny aura.
I then could add some more volume with a sun rim-light on the clouds with a Lighten blend.
At this point, I was not satisfied with the color variations, so I added an orange layer in ColorBurn to add more contrast in the shadows.
I wanted my sky sphere to work at 360° so I had to make my painting tileable on the sides. For that, you have an easy setting in Photoshop! In the View panel, you can enable Pattern Preview which will repeat your canvas like a tileable so if you paint on one side of the canvas it will also paint on the other!
Composition and Storytelling
I first started my composition based on the reference I had, but the more I added final assets, the less I liked it. As I changed some of the building's material and composition it just couldn’t work. I tried to find some other camera shots but it was not working as I wanted.
So I decided to ask one of my Concept Artist friends Arthur Gaubert to help me get a fresh look at my scene.
We changed the orientation of the second building a bit to have the Valorant door and the fans better in the shot, took a screenshot, and painted over the things that were not working in the composition, that were catching the eye for no reason or the guiding lines which could help the viewer’s gaze in the image. I even repainted the sky a bit to create more space for the tower.
As it was a school project, I had a short deadline but still, I always like to take time on how to give life to a scene. Rendering in Unreal Engine greatly assists me with this. With the Shaders settings that give a lot more procedural possibilities, Blueprints allowing for custom effects, and Post Process Volume parameters that can be tweaked, I can easily manage to have the best render!
In the Shader, for example, the SimpleGrassWind node is great for simply giving movement to vegetation and grass assets.
I also really like to create some simple FX, like sparkles mimicking fireflies or animated smoke for chimneys. In this scene, I made animated smoke using a trail that I painted in Photoshop and made it move using a Panner node in the shader.
Rendering
For the lighting process, I try to get a first mood at the beginning of the integration so I know I won’t affect my colors too much.
In every scene I always have:
- A Directional Light that will be my main and only light source (excluding emissive elements)
- (Because by two they come) A Sky Light and Atmosphere to reduce my shadow intensity and brighten darker areas.
- A Volumetric Cloud to enhance atmospheric effects, directly interacting with the directional light based on its orientation.
- And a Post Process Volume to clamp my exposure. I adjust the parameters as if I was tweaking the render in Photoshop, including color grading, shadow settings, and exposure.
In general, I don’t change a lot of parameters for the render, as the default settings in Unreal Engine 5 are quite effective once the correct directional light orientation and exposure are established.
In this project, I primarily adjusted the color of the directional light and changed the global saturation and contrast through the color grading settings in the Post Process Volume.
The Detailed Lighting View mode is a great way to set up your lighting without the influence of the base color of the assets.
Conclusion
This scene was a great challenge! I know I didn’t perfectly match the Valorant art style but for the first time, I’m quite happy with the result!
The project aimed to test my autonomy and ability to handle larger-scale projects within a school environment, which proved to be a valuable exercise in managing pressure until project completion. I also encountered some extra challenges, such as falling ill for a week in the middle of the project, resulting in only three weeks to accomplish the same tasks.
Throughout the process, I faced various issues, some of which were due to oversight, like mistakenly baking my brick tile Normal map at a 90° angle. I also redid the vegetation assets twice, initially attempting to create them in SpeedTree before realizing they didn't match the style I intended. But in the end, I managed to have a decent result.
This was also the first time I could experiment with the techniques I learned with tileable textures and vertex paint. It was so fun that I really think I’ll try to do some more as personal projects in the future!
If I could offer advice to beginner 3D artists, I would encourage them to explore new techniques, even if they feel uncertain about them. It's essential to step out of your comfort zone from time to time, but don't hesitate to return to the basics if you encounter difficulties! If a particular scene or project captivates you, give it a try! Even if the process may be challenging, overcoming them will ultimately save time on future projects. Additionally, there are countless tutorials available, along with a supportive community that can offer guidance when facing difficulties.
Gathering great concepts and references for any project is crucial. While it's beneficial to create your own concepts and work on shape and silhouette design, professional concepts provide invaluable resources, exposing you to unfamiliar drawings. Doing paint-overs, analyzing techniques to improve your workflow, and gaining a fresh perspective on concepts will sharpen your skills over time.
Always rely on references for textures and objects. Reality is the ultimate reference. Same thing for your sculpt and lighting! Why not look at great digital sculpts and try to understand why they work helping you improve on your projects?
Lastly, don't hesitate to seek feedback. I am immensely grateful to all the people who have helped me on various projects, providing fresh perspectives and invaluable advice. From amazing teachers to friends and professional artists who take the time to offer tips, their guidance has been invaluable. In this project, I received feedback from my teachers, as well as external professionals and friends, including Romain Durand and Sao My Morel. Thank you again!
And that’s all from me! Thank you, 80 Level, for this opportunity to share and help other artists.
Thank you to all the readers! I hope my advice proves helpful to someone. If you have any further questions, feel free to reach out to me on ArtStation.
Axel Blin, Environment Artist
Interview conducted by Theodore McKenzie
Keep reading
You may find these articles interesting