Insight into Game-Ready Asset Workflow for Baldur's Gate 3

Insight into Game-Ready Asset Workflow for Baldur's Gate 3

Jeroen Toma discussed his approach to creating game props for Baldur's Gate 3: modeling in Maya and geometry optimization, UVs, texturing in Substance Painter, and more.

Introduction

Hi, my name is Jeroen Toma and I am a recently graduated 3D Environment Artist. I’ve always liked to draw and do arts and crafts as a little kid, which I mostly kept on doing well into high school. But just as many other teenagers, my interests started to shift once I discovered video games. In our final year of high school, we were asked to look into what job we’d like to do and I stumbled upon video game art. I immediately started looking into this further and tried to find a way how I could turn my hobbies into a profession.

I enrolled in the Breda University of Applied Sciences in the Netherlands, a study that tries to simulate the game industry. They have art, programming, and design students working together on various game projects set up by the teachers. I got to work on platformers, first-person shooters, and even a VR horror game. They also have individual modules and projects for students to improve their skills. I was practically a beginner with zero knowledge about 3D or game art once I started, so the study and the people there taught me a lot.

In my final year, I got to work on Larian Studios’ Baldur’s Gate 3 as part of my internship and later under a summer contract. This was an eye-opening experience since I could truly experience what working in the industry was like.

This article explains the workflow I went through while working at Larian Studios. This is my own experience and process and therefore it might differ from other studios or your own experience.

1 of 6
1 of 9

Baldur's Gate 3: Start of the Project

I always start all of my tasks by gathering references. For most of my assigned assets, there was no concept art available, so I would gather enough reference for various ideas and designs, out of which I could mix and match and make an interesting final product. If there was concept art made for the asset I was assigned to do, I would closely study it and already think ahead of how I would approach the asset and how to model it.

It is important to gather reference even with concept art available. Not always are all sides of a prop concepted, meaning some parts are left to the imagination. Having concept art allows you to target your reference gathering in a way that it supports the available concept, so it fills in the blanks like missing details and use of materials.

You should not just gather reference before starting a project, but continue searching for it throughout the entire pipeline. You can never know everything you will need beforehand and you might come up with new ideas along the way.

Modeling in Maya

After I gather all the necessary references, I start modeling in Maya. I learned how to model in Maya and have always used it, plus it is the preferred modeling software used by Larian Studios.

To make sure the scale and proportions were right and didn’t look off, I would keep a human game character model next to my assets at all times while modeling  Since the game has realistic proportions, it is easy to see whether my scale is off or not. For example, a book that turns out to be the size of a human torso is not ideal. Something which sounds obvious but is easy to overlook. The later you realise your errors, the harder it might be to change them.

With Baldur’s Gate 3, for example, realistic proportions are not always the way to go. Since it started out as a top-down game, a lot of small assets or even things like the character's hands are scaled up to look good from the camera angle. It’s always good to implement your models as early as possible into the engine and check it in-game, to spot problems early on.

I made a couple of small decorative props that don’t require a blockout. Other assets, however, are interactable and need to conform to certain rules set up by designers. In those cases, I would be in close communication with the designer or programmer in charge of the interactions and implement it early-on into the engine to make sure everything is up to standard.

Baldur’s Gate 3 is mostly a top-down game, therefore assets can’t be too detailed because of performance and you can’t see those details anyway because of the camera angle. Some assets had a simple shape, so the low-poly models would be detailed enough. For bigger more complicated assets I had to find ways to reduce the polycount and optimize the asset.

Take, for example, these vines. I made the high poly of these by making a set of 2-4 very long thin cylinders, using the twist deformer to make them curl around each other and lattice deformers to bend and twist the sets. 

Obviously, once done, it resulted in a massive polycount. I couldn’t remove too many edge loops because you would start seeing the curves being very blocky, so I tried out baking it on planes. Baking it all on a single plane looked too simple, so I decided to bake each set of twisting vines on its own plane. Since you can move the camera in-game, baking on flat planes doesn’t work well because it easily breaks the illusion once you rotate the camera. Baking it on curved planes, however, turned out to distort the vines.

In the end, I baked them on flat planes and then turned the flat planes into curved ones, maintaining the UVs. This way I had a good bake and curved planes. The curved planes are to prevent the illusion from breaking when rotating around the asset. The vines were going to be placed against walls and the planes were made double-sided, so it wouldn’t create too much of a problem if players rotate their cameras around. 10k tris is usually not an optimal polycount, however, these vines are 18 meters high in-game, in which case it’s fine.

This cage made out of similar vines faced the same initial problem of a too high polycount with the added problem that players can see it from all angles, meaning I couldn’t make it fully out of planes. Therefore, I manually reduced the polycount of the bigger and longer vines by removing edges and edge loops without creating too many blocky curves. The smaller vines and leaves are double-sided alpha planes so I was able to add more vines in a cheaper way.

Most assets I made were decorative and could be placed practically everywhere without causing issues. But larger assets that have to be placed in multiple different areas require modularity. For example, the curtains needed to be able to fit on differently shaped and sized walls. Making separate meshes for each differently sized wall isn’t very efficient. I, therefore, made modular pieces for them, allowing world builders to use them in every situation without having to create new curtains whenever new walls were placed.

Once I finish modeling an asset – or the low poly version in case of an asset that needs baking – I look for errors in the model. Things like n-gons, locked normals, zero edge lengths, concave faces, etc. I use the Mesh > Cleanup option to highlight and find the errors in my meshes and then mostly correct them by hand. Once that is done, I make sure the pivot is placed correctly, the history deleted and the transformations frozen. The last step is to import this model into the engine to see if there are any remaining errors or scaling issues with the model before moving on.

Sculpting in ZBrush

Once the model is practically done, I check if some parts need a lot of details that are too complex to model, like ornaments, for example. I then use ZBrush to sculpt those details in.

For example, on top of these curtains, I decided to make an ornament. I imported a base model for that specific part into ZBrush, so I could start sculpting upon it. I usually use the Decimation Master to reduce the polycount a little bit and retain the details, before I move it back into Maya and use Quad Drawing for the final retopology. The newly made mesh will function as the low poly and the original sculpt – as the high poly, which I then bake using Substance Painter or xNormal.

In the case of the curtains, it wasn’t necessary to use Quad Drawing since the original base model proved to be good enough for baking. 

UVing

Next comes the UVing of the low poly, which I do in Maya as well. Almost always I like to start with a Camera-based unwrap. I then look at what parts of the model should be separate shells and start to cut the UVs in pieces by selecting the edges of the mesh and cutting, usually on hard edges. If possible I cut the seams in places where you cannot usually see them, like underneath an asset or behind another mesh, so you have to worry less about them when texturing. For each created shell I do separate unwrapping; usually, automatic unfolding does the trick if the shell isn’t too complicated and planar unwrap works for more flat geometric shaped shells.

I always try to straighten UV shells as much as possible provided it doesn’t cause too much distortion. In extreme cases where automatic unfold doesn’t work, I use the Tools > Smooth option in the UV editor of Maya to straighten out the shell.

Once all shells are properly UVed, I make sure they all have a 90-degree angle and then use the Layout option to ensure shells have the right proportion relative to each other to maintain the same texel density between shells. 

I then start puzzling the pieces together within the UV space to make sure I use the maximum available space and get the biggest possible shells. The bigger the shell, the higher and clearer the resolution of the textures will be and the more details you can put on it. So, for example, if a shell has a hole in the middle or a gap in its side, I try to fill it up with smaller shells. I also try to keep shells from specific parts together, so that during the texturing stage it's easier to figure out what shell belongs to what part of the asset.

Texturing in Substance Painter

After modeling, sculpting, retopology, UVing, and cleaning, it is time for texturing, for which I use Substance Painter and a PBR approach. Generally, I start texturing by defining what material each part of the asset needs to have and then assigning general Substance Painter materials to those parts. This gives me a quick overview of how the final product will look like or what looks off and needs to be adjusted. I then start tweaking each material to make it fit better with the other materials and the asset itself. Seams are not a problem as long as the material you used has a tri-planar option. If that is not the case, I check if there are any very obvious seams and manually paint over them to make them less obvious.

I usually start with the main material that defines most of the asset and is situated at the bottom of the map hierarchy, and then move onto the other parts. I like to group all maps that are related to a specific part of an asset so that my hierarchy doesn’t become a giant wall of maps and I can easily find what I need.

Baldur’s Gate 3 has a realistic art style, so models must look as close to reality as possible. This is the moment where reference gathering is most important. Your texturing game will improve tremendously once you start gathering references for everything you want to recreate. For example, when texturing a metallic instrument with a wooden portion, you need references for the metal and wood, the area where they connect, the way metal rusts and degrades, the wear and tear on the wood, etc. References of only that specific object you are working on are enough, but you can find interesting examples of how metal rusts, for example, in a multitude of other objects; this can make your final prop look a lot more appealing.

Another obvious and important way to make assets look more realistic is to add wear and tear. There are no objects out there, not even brand new ones, that are completely perfect. And in a fantasy medieval setting like in Baldur’s Gate 3, everything will be old and rusty. It’s easy to add a decent level of wear and tear in Substance Painter, by using their generic smart and grunge masks. But the wear and tear do need to look realistic, so it requires more than just a generic mask thrown on everything. I try to look where dust or rust would form on the object in real life and place it there. Also, keep the roughness in mind. Dust and rust usually have a higher roughness than the material underneath.

One thing you learn while working at a game studio is that efficiency is key. Reusing assets and textures from other props is a common practice. It was highly recommended to use existing assets or textures similar to the asset I was trying to create whenever time could be saved. This helps reduce the production time and makes it easier to make all assets fit together even though they’re made by different artists. 

A tip I got was to always work with a higher texture resolution. It is easier to scale a texture down afterwards, compared to scaling it up. This way, you can get some more details you might not have been able to put in when working on lower resolutions. A quick way to decide what the texture resolution needs to be was by comparing my asset to existing assets of similar size and copy what resolution they had.

Once I finished a texture, I imported it into my test level in the game engine to check if there were any problems that needed fixing, like a too high or low resolution, a too low roughness, or textures that were too dark or too bright. There are settings within Substance Painter that allowed us to bring the viewport closer to what it'd look like in the Larian engine, but once you import it, there is always a slight difference so I made sure to check the results each time. 

Importing and Rendering

Once an asset is modeled and textured, it can already be imported into the engine, however, it won’t be functional or interactable. Larian Studios made their own tools and plugins to help the artists with adding physics to their assets. Only after a model is textured, has physics, and is approved, can it be called finished and ready to be placed in-game. 

However, for my portfolio, I decided to render each piece using Marmoset Toolbag, as it would allow me to create more interesting lighting without restrictions of game performance or camera angles. I made use of a pretty simple setup. I placed my asset on top of a shadow catcher and added a single point light, or a directional light for bigger assets, to determine the key light. Once I have a nice angle, I add another light with a warmer colour to make the lighting a bit more realistic and less flat. The second warmer light also makes the harsh shadows from the key light less dark. Most of the time that’s enough, especially for smaller assets, but if needed I add extra smaller lights to light up darker areas or accentuate details. This is my usual setup for rendering all of my props.

Challenges

The biggest challenge I faced was the optimization of assets. I have always struggled with optimization and tended to go overboard during the modeling phase. Working on Baldur’s Gate 3 really challenged me in that regard and gave me an opportunity to work on my weaknesses. I had to carefully think about how to approach each asset and make sure it would be as optimized as possible, as to not compromise the game performance.

When given tasks, like the vines or these nests, I had to come up with solutions that would look the best but use the lowest polycount possible. Most of the time that resulted in a lot of baking and making use of alpha planes.

Afterword

Thanks for reading this article! I’ve learned a lot during my time at Larian Studios and even though this article has some pretty generic information, I hope you were able to pick up a thing or two. If you wish to see all the assets I made for Baldur’s Gate 3, you can check out the original ArtStation post here

Jeroen Toma, 3D Environment Artist

Interview conducted by Ellie Harisova

Keep reading

You may find this article interesting

Join discussion

Comments 0

    You might also like

    We need your consent

    We use cookies on this website to make your browsing experience better. By using the site you agree to our use of cookies.Learn more