24 July 2021

Norse Mug – Prop Breakdown – Vitor Moura

vitor-moura-vitor-moura-nm-godot1-scaled

Introduction

 

Hi, my name is Vitor Moura. I am a Senior 3d Artist working in the game industry since 2007 and a Principal 3d Artist at Aquiris Game Studio in southern Brazil.

 

Goals and references

 

Norse Mug project started when I was on Pinterest and saw a big wooden mug that caught my attention and I thought it would be a nice game prop to make.

At that time, I had finished God Of War (2018), and I was following the beautiful artworks from Assassins Creed Valhalla, so I started researching what kind of visual I would like to achieve.

I’m keen on fantasy art and I am a longtime fan of Blizzard games and art styles, as well as a huge fan of Darksiders and Dishonored series visual style, so I picked some references to use as a visual target.

Reference board

01_references

Software

 

When I started the project, I was at my parents’ house spending a week on holiday. I was using an old laptop that I usually travel with, which I had Linux installed because I had always been curious about. Thus, all this project was done on this old laptop from start to finish.

00_laptop

I started collecting references thinking about the project when something else came to my mind, “Why not doing this project using Linux and only open source and free software?”

With that in mind, I started researching what options I had and sorted them out.

PureRef was used to assemble the references

Blender for sculpture, retopology, UVs, and texture paint

Krita to edit the baked and painted textures

Material Maker to make the foam texture procedurally

Godot game engine to render and for the final game-ready prop

I have already been a Blender user for some years, but the other software was completely new to me, and I had to learn how to use them. It was a bit frustrating as expected as I was leaving my comfort zone.

Most software I used is on Steam and I just had to install Material Maker and PureRef from their respective website.

 

Blocking and Sculpting

 

I started with a base mesh to find the main shape using the photo references, making separated subdivided pieces already thinking about the sculpting process.

02_sculpt_1_basemesh

With the base mesh done, I started sculpting.

02_sculpt_02_mug

Here are some images of the subdivided meshes followed by the sculpture version:

02_sculpt_2_mug
02_sculpt_3_mjolnir
02_sculpt_4_Jormungandr

With all pieces together, I started detailing the wood parts trying to mix the reference details and to find a good balance between them.

02_sculpt_5_final-version

I did not use any custom brushes or alpha textures for sculpting because I just wanted to keep sculpting for as long as I could once I find it such a relaxing process, and I was not in a hurry.

I carried out this project in my free time working for around two hours a week for a few months.

Here are the brushes I used

02_sculpt_6_brushes

Low Poly and Retopology

 

For the Low Poly, I used the parts I already had from the subdivided base mesh version and started working on the topology.

After that, I separated the mesh according to the sculpted pieces to explode and then to make the bake.

03_mug-lowpoly-retopo_1
03_mug-lowpoly-retopo_2

The foam was made using Meta Balls, which were turned into the mesh, and then I made a topology polish.

03_foam-lowpoly

UV Mapping

 

The unwrapping process was very straightforward. First, I unwrapped every piece and then distributed the islands manually.

04_1_mug-uvs

The foam used a cylindrical projection for the vertical and a planar projection for the horizontal parts. By doing so, the texture scroll effect was easier to be made, where I would like to represent the foam going out of the mug. Unfortunately, I did not find a good tutorial about how triplanar projection works inside Godot, so I decided to go this way.

04_2_foam-uvs

Baking Textures

 

To start baking, I first exploded the High and Low Poly meshes. Then, I created a new material for the Low Poly mesh with an Image Texture node connected to it to receive the baked information.

05_bake_1_normal

Normal Map was the first texture baked, using 1 cm for Extrusion and Max Ray Distance.

05_bake_2_normal

The second texture baked was the Ambient Occlusion from High Poly.

05_bake_3_AO_High

Then I baked another Ambient Occlusion texture using the Low Poly mesh itself to have a contact shadow between the different mug parts. For this specific bake, I used a plane mesh at the bottom of the mug to cast some extra information.

05_bake_4_AO_Low

Curvature was the last bake done, and for that, I followed this Jayanam’s tutorial, where he shows how to have a nice contrast between the convex and concave parts of the mesh using the Color Ramp node.

Blender Texturing : Baking Curvature Map

05_bake_5_Curvature

After all bakes done, I combined them using Krita to compose the Ambient Occlusion, Curvature, and the Green Normal Map channel together so that I would achieve a little volume in the final Ambient Occlusion texture.

05_bake_6_AOfix

Texture Painting

 

I started the painting process by combining the Ambient Occlusion with a new texture for the basic colors. Here I filled the varied materials with colors from the references.

06_painting_1_basecolor

After the Basic Color, I connected the Normal Map texture to the shader and created another Image Texture node to start painting the wood. In order to see the result on the viewport, I mixed the textures via MixRGB node.

06_painting_2_wood

Similar to the previous step, I added another Image Texture node connecting to the MixRGB node and started painting the metal parts.

06_painting_3_metal

With the colors painted, I made the Metallic texture to be used in the engine.

06_painting_4_metallic

With the paintings done, I organized the shader nodes. On the left, you can see the reference images I used to paint the metal and wood parts.

06_painting_5_refs

Composing the Bakes and Painted textures

 

I assembled the bakes and painted textures together using Krita to achieve the desired results in the game engine.

I started with the Ambient Occlusion.

07_kritafinaltextures_1_ao

Albedo was made by using layer groups separated for each material, metal and wood.

07_kritafinaltextures_2_albedo

For Roughness, I used only filter layers above Albedo.

07_kritafinaltextures_3_roughness

Foam

 

The foam was made using some simple node operations inside Material Maker.

I aimed at making a Normal Map, Roughness, and Opacity textures to play with them inside Godot Visual Shader Graph.

07_materialmaker

Godot

Godot was a completely new experience for me. To start working on it, I first watched a lot of tutorials from gameDev Outpost youtube channel Godot 3 – Getting Started.

After learning a few things, I started importing the meshes and textures and organizing the working folders by using the FileSystem tab, located on the bottom left side of the engine.

Then I started adding the geometry in the scene by dragging them to the viewport. Following that, I created a new WorldEnvironment object and added a Directional Light in the scene to see the asset properly; otherwise, it would appear as a black silhouette.

The mug uses SpatialMaterial, a basic material with all options already sated up, so I just needed to drag and drop the textures in their specific slots and play with the parameters.

08_godot_01

The camera was placed in a way that the Mug looked like my main reference. Then I started adding more lights to the scene and changing the WorldEnvironment parameters to have a better render.

08_godot_02

Adding a few more lights made the render look better, especially tweaking the WorldEvironment options to look more like the references.

08_godot_03

Achieving the results I wanted, it was time to work on the foam.

I would like to have the foam with some animation, with it moving down from the top of the mug to simulate a good taste beer visual.

I did not find great references, but even so, I gave it a try.

08_godot_04

Thinking about how the foam animation could work for a favorable effect, I duplicated the top part to use another material with a different flow.

08_godot_05_foam_ids

After duplicating the top part, I aligned both meshes with a little space between them not to have z-fight; the only part touching each other was the border loop. To avoid any normal issues, I aligned every vertex normal from the borders according to the vertex normal from the bottom.

08_godot_06_foamvertexnormals

After this little trick, I reimported the Foam mesh inside Godot and started working on the shader, this time with the Visual Shader Graph.

The first thing I did was create a new Visual Shader Graph and a new Material, then I connected the Visual Shader Graph on the Material slot.

I started adding some Uniform nodes that allowed me to drag textures or change values directly into the Material slots and not to change them in the Shader itself every time.

So, I plugged some TextureUniform nodes to Alpha, Roughness, and Normal Map slots into the Material, followed by a Color and Metallic Uniform.

08_godot_07

This was the first result with the textures dragged into their specific slots.

08_godot_08

Then, I worked on the foam contact with the mug, adding an Opacity Mask.

08_godot_09_

The result was a little transparency in the contact between them.

08_godot_10

After that, I started to add a few more nodes for the UV scroll animation.

08_godot_11

Next, I added a Fresnel node to help define the foam silhouette.

08_godot_12
08_godot_13

And finally, I added another kind of Fresnel effect, this time in the emission following this tutorial from Christoffer Sundbom Godot engine Visual Shader Fresnel Effect.

08_godot_14

This is the final Visual Shader Graph:

08_godot_15

And here is the achieved result 🙂

08_godot_16

The final render was achieved with a lot of back and forward between Krita and Godot in this specific light setup that I was aiming at.

 

Conclusion

 

An interesting thing about this project from my point of view was that no matter the software we make art, and it is a good thing to stay out of our comfort zone occasionally and learn new things whenever possible.

As all of it was done by open source and free software, I’m sharing all source files. Feel free to check it out if you want to, by clicking on the link below:

https://www.artstation.com/a/6222100

Just remember that this is intended for educational purposes only, not to be used commercially.

Cheers c[~]

 

Thanks to Vitor for allowing us to have such an in-depth look at his process. If you liked this prop breakdown and want to see more like it from other inspiring artist’s make sure to follow us on :

https://www.artstation.com/gamesartist

https://www.instagram.com/gamesartistuk/

https://www.facebook.com/GamesArtist/