Italian Courtyard

Environment Breakdown

Martiine Mayeur

ItalianCourtyard_Day1_martiinem
226

Martiine Mayeur

Environment Artist

Introduction

Hi! I’m Martiine, and I’m currently taking part in an online Game Environment Art Course at Vertex School.
After high school, my path led me towards architecture, and I studied to be an architectural technologist and project manager.

After working in the architectural field for a few years, I felt it wasn’t exactly for me and started looking into learning 3D Art.
I have always been fascinated by computer games and digital worlds that capture your imagination and am very excited to be on this creative journey!

Goals

I set out to learn as much as possible about environment art creation with this scene, wishing it to be a full-game environment that you can run around in and experience firsthand.

The fact it was a courtyard made it easier to work with and helped me not to over scope.

The key areas I initially wanted to put more focus on were modularity, vegetation, and learning Substance Designer. During the project, I ended up dabbling in lots of different aspects, and it was incredibly fun and rewarding to do.

I will be delving deeper into some of those aspects below.

Tools

  • Miro: Notes and references.
  • PureRef: References.
  • Blender: Modelling, UVs.
  • ZBrush: Sculpting.
  • Marmoset Toolbag: Baking.
  • Substance 3D Painter, Designer, and B2M: Texturing.
  • Quixel Megascans: Some assets, textures & shader inspiration.
  • Adobe Photoshop: Texturing & presentation.
  • Unreal Engine 5: Level design, lighting & rendering.
  • DaVinci Resolve: Video editing.

References

I wanted to create a scene inspired by a place I had visited in real life. I went through some of my photos, and one of the locations that stood out was the Palazzo di Brera in Milan, Italy.

I felt it would be a good exercise to learn to work with modularity without it being too large of a space. To add a nice touch to the environment, I reimagined it to have a lush garden within the courtyard.

The main inspiration for that was the garden of Alhambra Patio de la Lindaraja Nasrid in Granada, Spain.

ItalianCourtyard_References1_martiinem

Here are some of the places I used to gather references from:

  • Google Maps: To get a feel for how a space/city looks and feels like. Good to walk around in the neighborhood and observe how people use the space; gather potential set dressing ideas and see how the place has changed over the years.
  • YouTube: Sometimes you can find detailed videos of objects or locations e.g., GoPro videos. I was quite impressed by the amount of detailed foliage videos out there made by plant enthusiasts!
  • Pinterest, Flickr, Instagram and Tripadvisor: good places for traveler photos.
  • Pl@ntNet: great for identifying plant species and finding photos of vegetation.
  • ChatGPT: for general ideas e.g., a list of plant species growing at a specific location.
  • Filmgrab, Shotdeck: movie screenshots, great for lighting and mood reference.
  • Games: I ran around in Hogwarts Legacy, Assassin’s Creed and Witcher, and gathered ideas for set dressing, lighting, storytelling and analyzing how some areas of the games were put together.
  • Own photo library.

For this project, I used a cloud-based board application called Miro. It’s a great tool that can be useful when working in a team and I wanted to get more familiar with its capabilities.

As I worked on the scene, I kept adding to the references and constantly referring back to them.

Always use references, even for the smallest things! The oddest things to search for in my project were probably bird droppings and bird nests.

Below you can see the full board at the end of the project.

ItalianCourtyard_ReferencesFull_martiinem

Blockout and Modularity

Before starting on the blockout, I made a couple of sketches to wrap my head around the project and tasks better, highlighting where trims could be used, materials required, and initial thoughts on modularity.

Also made a garden sketch to plan the layout and vegetation better. I was lucky to find some actual old architectural drawings for the building, and I used them as a base to start my blockout.

Since the modular pieces weren’t going to be used elsewhere, I decided to stay as true as possible to the scale of the building. That translated to 6.5m and 3.25m for the kit pieces.

Typically you would want to keep them in easier-to-work-with increments like 0.5m, 1m, 2m, 4m, but for this project, I decided to leave it as is.

It took a little bit of time to figure out the proportions of everything and make them fit well without creating too many unique elements.

Initially, I wanted to use the same blocks across the board, including in the corners, but to get a nicer detail, I decided to create some separate corner models.

Once I had the main pieces blocked out and fitting well in Blender, I set up the scene in Unreal Engine. In there, I used blueprints to create two main blocks: one for the corners and one for the main part of the colonnade.

The benefit of using blueprints was that whenever I edited one of them, they all updated.

I could also add construction scripts that allowed me to swap a wall with a window to a wall with a door or to turn lights on and off.

I proceeded to refine the shapes and added blockout colors. For the colors, I used PBR charts to have values as close as possible to reality and ensure lighting reacts well with the surfaces.

Throughout the scene, I created small prop islands telling a story of how the space is used during a lunch break in the garden.

ItalianCourtyard_Props_martiinem

For the night shots, I made sure to put some things away and imagine what it could be like in reality.

Trim Sheets

I created 3 main trim sheets for the stones and 1 trim sheet for the doors and windows. The process I followed was: modeling the shapes, sculpting the edges slightly, UVing the low poly, baking, and texturing.

I wanted to preserve the bevel details, so I made the trims uniquely unwrapped, rather than baked to a flat plane. Alternatively, I could have used normal mesh decals.

Wherever I could, I tried to utilize the trim sheets as much as possible.

  • Granite trim I used on the fountain as well as on the columns and balustrades.
  • Stone trim I used on the door and window surrounds, various stone edges, and even for the flower pots and benches.
ItalianCourtyard_Trims_martiinem

Tiling Textures

The tiling textures were created using different methods and softwares.

I first had a look to see if I could find something already existing that would work in my scene and tweaked the ones I found to suit.

Since I wanted to learn how to work with Substance Designer I decided to use it for creating the cobblestone variations and the herringbone patterned black limestone tiles.

Tutorials and experimentation came in really handy here! Below is a quick video of the presets I created for my cobblestone material.

I love to see full graphs posted by people, as it’s nice to go through them and follow the spaghetti at your own pace. One of the most helpful ones I came across for cobblestones was Substance Breakdown Series #1 by DiNusty.

I also wanted to have a lichen texture that could be used to vertex paint over the stone and granite elements using a height mask. For that I used photo references as a starting point and built it up from there.

Overall I’m pleased with how the textures turned out. What I would change for next projects is adding more variation between the base and dirty versions.

You can always tweak the opacity of vertex blending in the engine and/or use masks for edge transitions. Having more variation will give you more options when painting.

ItalianCourtyard_Materials_martiinem

Regarding texel density, I made sure to not go below 6 TD/cm and on average the values remained 7-10.24.

It proved to be trickier to make it work with the odd modular sizes e.g the floor of the colonnade ended up being 6.3 TD/cm (2048 / 325cm). 2048 being the texture size and 325cm being the distance it spans in game.

Vegetation

I wanted to find an efficient workflow to create vegetation for this scene, using as many existing resources as I could and transforming them to add my own artistic touch.

I also worked in a non-destructive manner as long as possible, to make adjusting things easier.

ItalianCourtyard_Vegetation_martiinem

After doing some experimentation, here are the steps I used when creating the textures for the Italian cypress, bougainvillea and bitter orange tree.

1) Find suitable texture atlases via the Quixel Bridge app and download the textures.

2) Bring them into Photoshop and adjust them to be more in line with each other and what you would expect to see in terms of PBR values. Sometimes there can be too much value variation, contrast, or other discrepancies.

Thus checking and making sure the baseline values are working well together is important.

3) In modelling software, cut out pieces of the individual elements and lay them on top of a baking square. Think of them as high polys and form branch clusters.

You can also create additional HP elements e.g. branches and blossoms, at this stage to mix in with the rest. Move the individual branches/leaves up and down in height to get a better effect when baking and to avoid z-fighting.

ItalianCourtyard_Orange1_martiinem

4) Make all of them individual instances, triangulate. Export the plane out as low and the rest as high fbx.

5) Bring the low and high polys into Marmoset and assign the textures to the high poly materials.

    1. Normals (don’t flip Y, since Quixel textures are OpenGL)
    2. Albedo
    3. Microsurface – Roughness
    4. Reflectivity – Metalness, but slot the Translucency map into it (will be grayscaled, can tone in engine afterward)
    5. Transparency – Cutout, slot the Opacity map into it, R Channel, turn off Use Albedo Alpha. To avoid jagged edges, change the Threshold to e.g. 0.2.

6) Adjust the low plane cage offset to cover all the cut-up pieces. Samples 64x.

7) Bake Normals (Flip Y, Dither), Albedo (Metal), Roughness, Metalness (Translucency) with padding set to Extreme. Bake Transparency (Alpha) with no padding.

8) Display the textures on lowpoly to make sure everything is baked out correctly. Flip Y on Normals, since the Marmoset viewport display is OpenGL.

You may need to fix some areas in the baked alpha map where multiple planes overlap.

After the texture is ready, you can cut it up, make variations of the branches and build your branch clusters.
To make foliage puffier, bend and layer the alpha cards.

Below you can see a breakdown of the bitter orange modelling process.

The italian cypress is quite an opaque tree, so I decided to use a base model with a tiling texture in the core and layered alpha cards around it.

It helped a lot with tri count, making the large cypress only 12K.

ItalianCourtyard_Cypress_martiinem

For the blue lily, I used a more traditional approach using the steps below.

  • Create a rough blockout texture and use it to figure out the game mesh topology.
  • Make high poly base pieces and build up the forms to be baked.
  • Plan out a high poly texturing sheet and use it to texture the high poly. Can use a mixture of hand-painting and photo references.
  • Bake the high poly elements to a plane, forming the base for the final textures.
  • Model the game-ready meshes with the baked texture.
  • Tweak the baked textures in Designer.
  • Export the models and textures to Unreal.

Technical Unreal

Since this was my first large environment scene in Unreal Engine, I didn’t have any shaders set up from previous projects.

I wanted to understand better how they work, so I set off to create my own based on tutorials, examples from other scenes, and useful tips from my mentors.

Here is a list of shaders I made and used for the scene.

1) Master shader with:

  • Base Color, Normal, ORM (packed map with ambient occlusion, roughness, and metalness) texture slots.
  • Vertex painting option with height lerp using RGBA channels.
  • Possibility to slot masks for vertex painting transitions.
  • Various options for tweaking values.
  • Puddle and wetness painting in Alpha channel.
  • RGBA variation masks with using a material, color tint or both.

2) Simpler ORM shader for props, without vertex painting and using a z-up dust effect option.

3) Water shader.

4) Foliage shader with wind and alpha fade based on camera angle.

5) Glass shader.

For adding puddles, I found these videos to be very helpful:

For my version I used the MF_PuddleLayer function as a base from the Megascans/Quixel Vertex Blend material.

I then adapted it to work with my own shader structure and used height lerps to simulate them forming in the lowest points first and gradually rising higher based on the height map of the material. Here’s a quick demonstration.

 

For adding extra details, I used the 2nd UV channel in conjunction with RGBA variation masks. Brief demonstration below.

As I’m not a technical artist, the shaders might not be the most optimised, but they worked well for what I needed them to do.

During the project I also got more used to using overviews in UE5, especially the Base Color, Roughness and Quad Overdraw views.

They helped a lot when troubleshooting issues or simply for analysing the scene.

Conclusion

Thank you for reading, and I hope you have discovered something useful here! It has been incredibly fun to work on this scene, and I can’t believe how much I learned during these past few months!

I’m grateful to my mentors Jacob Claussen and Salvador Sanchez for all their advice and support.

Many thanks also to GamesArtist for allowing me to go deeper into the making of this scene and sharing my workflow!

If anyone has any questions, feel free to reach out either via my Artstation or LinkedIn and I’ll do my best to get back to you.

Very excited to embark on my next 3D environment! See you out there 🙂

ItalianCourtyard_Day8_martiinem