Tyler Oliver has shared the workflow behind the Oasis Temple project, thoroughly explained how the sandstone material was made, and talked about working with Blueprints.
Hello! I am Tyler Oliver, a 3rd-year student at Solent University, UK! I am just finishing up my degree and starting to look for junior positions. You can find my contacts and learn more about me here.
I have always wanted to work in games, albeit first as a coder – I took computing in secondary school and computer science at college alongside my Media course which I took because it had a couple of game-related units, and I was interested in the regular media units doing cinematography and graphic design. This is where I really discovered 3D art, as we had a unit to create a sci-fi corridor in Maya, and I fell in love with it from there!
I think that it is fair to say that despite being enrolled in University, I have built most of my skills in 3D in my own time, taking courses, and watching YouTube and ArtStation learning. I believe that University is more of structured support for your learning, where the lecturers guide your learning more so than teach you everything you need to know – at least that has been my experience.
I found that the biggest impact on my learning however was joining a few Discord communities, namely the DiNusty Empire and Experience Points Discord channels. These are huge channels full of extremely talented and experienced artists who share their work, critique each other’s work, and offer advice and guidance to each other, and I have met some awesome people there who have helped me so much over the last year.
I have done a fair few projects before this one as it is my Final Major Project at University, so I have probably created around six unique environments as part of my course. However, I do a lot of personal work outside of university too, such as all of my Substance 3D Designer posts on my ArtStation, as I believe doing personal work outside of your studies can really set you apart from the competition and help boost your skills at an increased rate.
Recently I had the honor of teaching a 2-hour intro to Substance 3D Designer workshop at my university, where I went over all the basics of the software, breaking down some simple example materials and common techniques used, the annotated document can be downloaded for free here.
The Oasis Temple Project
So the Oasis Temple really started as a fascination with creating a grand scene, with a huge archway. I really don’t know where this idea came from as I hadn’t been playing any games like this or seen any movies which are where I normally get inspired, but I then started searching artstation for any and everything related to big fantasy archways. Over this period I must have saved around 100 concepts, all very similar until I found the concept Architecture Exploration by Quentin Mabille.
The grand archway, surrounded by rocks and the water entrance immediately resonated with me, and I started breaking it down straight away and planning my project around it. In doing so I researched real-life examples as close to this concept as possible, the most famous of which being Petra in Jordan.
From there I started altering the scene to be located in a climate more accurate to what we currently have in real life, opting to use materials like sandstone rather than what I had assumed to be limestone in the concept. This change impacted the color pallet of the concept quite drastically, giving me access to much warmer tones, whilst still being able to keep the colder tones in the water, and eventually the interior. I wanted to exaggerate the colors of the water too, to push the fantastical feel of the scene, and I really liked the colors of this concept by Oksana Dobrovolska which has vibrant greens and blues.
Whenever I start a scene, I normally do a quick paint-over of the concept, trying to break it down into its individual elements, what can be re-used, what will use tiling textures or trim sheets, and what will need to be unique. Here is an example paint-over I did for this scene, roughly planning the individual elements of the scene and how often they appear, as I knew modularity would be a huge deal to keep this scene in scope.
For the interior of the scene, I really didn’t have any singular concept that I followed, which looking back on the project I massively regret as it meant I was wasting a lot of time iterating the layout and design choices, rather than having a set in stone plan from the beginning. That’s not to say it was without reference though! I had a huge array of reference for the architecture and lighting of the interior, ranging from Byzantine temples to Roman ruins, and gothic cathedrals. I wanted to mix and match these different architectural styles to not have them conform to one specific style/period but to help emphasize the fantasy element of the scene.
Here is my final reference board, made using PureRef, where I stored my concepts, breakdowns, architectural, prop, material and lighting references, as well as handy cheat sheets like PBR value color pickers.
Modeling and Blockout
I generally use the same tools for every scene, and this one was no different:
- Modeling & Unwrapping – 3ds Max
- Sculpting – ZBrush
- Texturing – Substance 3D Painter for unique textures, Substance 3D Designer for Tileables
- Baking – Painter/Designer, but I recently started using Marmoset Toolbag 4
- Cloth – Marvelous Designer for base simulation, ZBrush for cleanup and extra detail
- Engine – UE4.26
The first thing to do when making a scene, after you have all your references and a solid plan, is to start blocking it out. This normally comes in stages for me, I do a very simple cubes and primitives blockout, focusing on the position and scale of assets. I then go a bit further and do shapes pass, where I block in rough shapes of assets, for example, I would model a rough archway and import it into UE4 to use instead of the cube I had placed.
I then sometimes go a step further and do a more detailed blockout, doing quick blockouts of individual props, and adding simple base colors to meshes. This is useful as it can reinforce your plan of what you need to make, and also these blockouts don’t go to waste, most of the time you can then use your blockout meshes as a base for you to make your final assets.
The modeling in this scene was actually very simple. Once I had broken down the scene and planned all the assets I needed, I noted that there were really only a small handful of assets to make, and the trick here was reusing them modularly in a way that didn’t get too repetitive and cause art fatigue – which was my biggest worry with this scene.
One way I tackled this was by using unique sculpts almost like Lego blocks to build my scene. I started out by sculpting a few variations of stone bricks, which I then decimated down to a low poly, unwrapped, and baked (I only planned to use the Normal Map from the bake, and combine in engine with tiling textures). Now I had 7 variations of stone bricks (each with unique 6 sides, so 42 unique faces), which I could then use to build my assets. This could be done in the engine, stacking bricks one by one, but it wouldn’t be efficient in terms of draw calls. So instead, I exported my blockout from UE4 as an FBX to take into 3ds Max and started stacking the bricks up there, into individual assets.
An example of this is the stairs, which are 1 FBX file, built up of a bunch of brick models. Another example is the main archway, which again is built up of a bunch of brick models, with some of its own unique meshes added too, but all exported as one file to reduce draw calls in the engine. I used this method as well for the docks of the scene, sculpting a couple of planks, this time with full textures rather than just the Normal Map.
Another big feature of the exterior is the cliff faces. For these, I used Megascans cliff assets. I decided to use these as they were the perfect fit for the scene, and with a project this size in a 9-week period, I would be sacrificing quality to completely make everything myself. I wasn’t sure about using these, but I spoke to many industry artists who all agreed that using Megascans in your portfolio work is completely fine, as long as it isn’t the sole focus of the scene, and you don’t claim to have made them yourself!
The only other 3rd-party asset I used for this scene was the human base mesh, which was used to simulate cloth over for the characters in the scene, as well as in the statue meshes. For these statue assets, I created a simple cloth simulation in Marvelous Designer and exported it to ZBrush. From here I masked off elements I wanted to move, such as the arms, and simply rotated them with a soft falloff on the mask to not mess up the shape too much. I then went in and used ZBrush's Cloth brushes, which turned out to work excellently for my needs. These tools allow you to quickly add folds, pinches, and drag your mesh around whilst it behaves like cloth.
The only other mesh in the scene with an interesting modeling method would be the chandeliers. For these, I knew they were radially symmetrical, so I only needed to make about a quarter of the mesh, and just bend and symmetry it. This also allowed me to only unwrap 1 quarter of it, and have the rest sharing the UV space, effectively quartering the amount of texture resolution I needed to keep the same amount of detail. Once I had the main chandelier made, I simply cut it apart into pieces I thought could be re-used for different variations, and KitBashed together wall-mounted and free-standing versions.
So when planning this scene I knew it could easily fall out of scope if I created a lot of unique textures, and therefore I needed to make heavy use of trim sheets and Tileable textures. With this in mind, I had planned to create:
- Sandstone Bricks
- Exterior Trim Sheet
- Interior Trim Sheet
- Wooden Trim Sheet
These alone, when combined with the unique brick sculpt normal map, probably textured about 80% of the entire scene. Initially, this obviously caused a lot of art fatigue, so I had to think of ways to break up these surfaces on a large scale, without having obvious seams between meshes. The way I decided to tackle this was using world-aligned masks overlayed on my tiling textures.
This is a method that I had first noticed in the Spiderman PS4 games, and to learn more about I messaged Nestor Carpintero who worked on these games, and explained that they had used world aligned grunge masks on top of their tiling textures, to add large scale variation to the huge brick wall surfaces of the buildings. He also stated that the modular brick assets also used world-aligned textures.
Setting this up in UE4 is actually very simple. You just need to create a material that has all your regular tiling textures set up (I had my tiling textures also using world aligned, but they don’t have to be), and then you use the WorldAlignedTexture node, with a mask texture as the input. You can then take that to add, multiply, or as a mask for a Lerp node, to add variation to your Base Color, and even Roughness Maps.
As I briefly mentioned, I had set up my master material for tiling textures to use world aligned projection, which allowed me to not have to worry about seams when using modular assets, massively speeding up production, and allowing for easy iteration of surfaces. This does come at an extra cost to having regularly mapped UV coordinate textures, but I found that the benefits heavily outweighed the slight performance cost – and this is a technique used in many games in my research.
Creating my tiling textures was a very enjoyable process for me, as I personally enjoy working in Substance 3D Designer using procedural methods to create textures. Because of my love for it, I decided to create all of my tileable surfaces, trim sheets, variation masks, and decals in Substance 3D Designer, only really using Painter for very unique meshes like the chandeliers, books and the boats, as well as the hand-painting RGB packed masks.
The sandstone material was relatively simple to make and mainly consisted of combining different noises in interesting ways. I almost always work with SD to create a Height Map first, and from there use it to create a Normal Map, and AO, as well as a Curvature Map. I then use the Curvature Map as a base for my Albedo Map, combining it with various different grunges and masks to get the final result.
When working in SD it is extremely important to have good references, particularly well lit and non-edited. This is because you don’t want to be sampling information that isn’t accurate to real life. To help with this, I recommend using Megascans as a heavy reference, particularly for the Albedo Maps of your textures. Once you have made your Curvature Map, you can plug it into a gradient editor, and use the ‘pick gradient’ tool to drag your cursor over a Megascans base Color Map, of the same material you are making, to sample the scanned base color into your own material. I find this to be a much more accurate way of working, rather than trying to color pick from references, as they will always have some lighting information affecting the colors.
Everything that was made from sandstone, in some parts used the base sandstone material I made, whether it was in engine combining materials, or directly in SD, calling the base sandstone graph to build other textures from, like the sandstone bricks.
The trim sheets in the scene were also made completely in Substance 3D Designer, using a plug-in node and technique called The Ultimate Trim. This is a technique that was developed for Sunset Overdrive, and basically consists of creating all your trim sheets with the exact same layout, so they can be swapped out with other trim sheets with no issues, for an easy variation. The technique can be looked into more here.
The main benefit of this technique for me was the custom Substance 3D Designer node and the 3ds max plug-in that was made for it. These tools allow you to easily author a trim sheet into set pixel segments, and then place the UVs of your mesh into the same set segments, scaling the UV shells to fit perfectly.
Below is the ultimate trim node for SD, which as you can see lets you define trim sheet segment heights in pixels, and automatically generates a Normal Map of the segments with a 45-degree bevel. For these trim sheets, I didn’t use the Normal Map but instead enabled the option to create a mask output for each trim section, which I can then use in my graph to combine all my trim sheet patterns easily, ensuring that each section fits perfectly the right amount of pixels – so when I get to use the 3ds Max UV plug-in, it’s as simple as one click to align UVs to the correct trim segment.
Creating the trim sheets was a mix of methods. For some more simple parts, I completely created the patterns in SD, using the shape nodes as a base, and then deforming and tiling from there.
For the more complex trims, I made use of pre-made alphas, that I had purchased on the ArtStation Marketplace, and slightly adjusted them to fit my needs.
These Height Maps were then combined together, using transforms and blends with the ultimate trim masks as an Opacity Map.
For the rest of the trim, it is the same process repeated with different pattern inputs. Them, once I had all the base heights of the unique shapes, I combined them with the Height Map of my sandstone material and blended the Normal Map of the trim sheet and base sandstone together.
From here it was just like texturing a regular material, layering different colors and grunges using the Curvature Map as a starting point, adding edge highlights and dirt with masks, and adding some variation to the repeating elements with a flood fill to Random Greyscale node.
Assembling the Scene
For the exterior of the scene, I simply tried to match the composition of the concept as much as possible, as I felt it already had a very strong composition. What helped with this is having an understanding of how cameras work in real life. I have recently gotten into photography, and whilst still being very much an amateur, I have a decent understanding of focal length, which allowed me to line up the camera in a way that has the same perspective as the concept.
From here I adjusted the positioning of my assets such as the boats to try and get some more foreground elements in the frame, as well as give a sense progression throughout the scene, as the boats get smaller as they travel closer to the temple, helping sell the depth and scale better. As you can see below, I have used the rule of thirds/golden ratio as a starting point for the composition, and then adjusted it slightly to my liking – these guides are not designed to be the perfect end solution, but instead, a good starting point for you to work on from there.
For the interior, I had no concept to work from, and therefore chose to rely on the tried and test rule of thirds for my camera setups. Having the statue be the main focal element, I tried to line up a secondary focal element that falls close to the line of thirds. Having harmony in the architecture, and the repetition of the arches is also a common architectural trick to lead the eye towards something, which I used to help draw the focus to the end of the hallway. The use of leading lines is a technique that can be applied to almost every scene in some way, and is another great way to draw attention to a focal point - I also added fake god ray assets into the scene to help direct the eye to the statue.
One thing I knew for sure going into the interior of the scene, was I wanted books and candles all over the place, and placing thousands of assets by hand was going to take forever, and also not be a performant option with thousands of draw calls. A huge tool that every artist who uses UE should know about, is blueprints. These can be used for all sorts of things, but for an artist, there are a few main uses – creating asset ‘prefabs’ and creating procedural asset tools.
The ‘prefabs’ blueprints are essentially blueprints that contain no code, just pre-placed assets that make placing repeating details much easier, as you can place as many meshes as you want into one BP, and then place that BP in the level and have all your meshes pre-placed where you want. Another upside to this is the iteration, as you can then adjust the BP after you have placed a bunch, and those changes will propagate across all the existing BPs placed in the scene, so you don’t have to go and adjust thousands of candles in your scene if you want it to be slightly moved, or add an extra mesh, etc. Below is an example of how I used these in my scene.
Then there are BPs that contain code, well nodes to either run during the placement of the mesh (Construction Script) or whilst the game is running (Event Graph). The construction script BPs can be a very powerful tool to learn as they can allow you to add randomness and procedural workflows to automate what can become very time-consuming tasks.
Kay Volbeda kindly helped me a bunch with the blueprints in the scene and created a BP that took an array input of meshes (in this case various books) and added an instance of a random mesh, for the number of times specified in a user variable. The BP can be added to your scene here to check out. You can see these BPs in action on my ArtStation post!
From here I created another variation to have stacked books, which works very similarly, but with some more controls for random position and rotation as they didn’t need to be aligned horizontally. I also created another BP for my candles, which takes an input number to spawn a certain amount of candles in a defined radius. This allowed me to easily scatter random clumps of candles around the scene.
Lighting and Rendering
UE4 is an amazing engine, and I would strongly recommend any artist to work in it, particularly when aiming for realism. That is not to say you can’t achieve similar or better results in other engines, but the tools that come free with UE4 out of the box, are extremely powerful, and let you start focusing on the art instantly, whilst everything just works. I also find it to be very artist-friendly, whereas other engines may require you to have more knowledge in coding to create your own tools that UE4 just has already. With that in mind, UE5 being released now is extremely exciting, and I will be moving on to it next for my upcoming personal projects, using the new workflows, in particular nanite.
The lighting in this scene is almost fully baked. Due to the nature of the scene being a grand interior with very little direct lighting, it would have been extremely hard if not impossible to achieve a similar level of quality without baking lighting, unless you were using techniques such as RTXGI or Lumen in UE5, which neither of those was an option to me. Baking lighting also allowed me to not have to worry about the number of light sources I have in the scene, as I was using static lights which have no runtime cost, other than the lightmaps being stored in memory. This was a big factor to consider as I had many candles in the scene, scattered throughout, and they would have had lots of overlap which would incredibly affect the performance of the project. I did have some lights stationary rather than static to allow me to make them flicker in real-time, as well as having some light functions on certain lights.
The lighting in the scene isn’t very complex. The exterior is primarily lit by a directional light and skylight. I made sure to increase the directional light's indirect lighting intensity, to get some nice bounce lighting in the shadows, and to raise them from being harsh, dark shadows. I also added some subtle blue moveable point lights near the water, to fake bounce lighting from the water, as translucent materials didn’t seem to contribute to the light bake. On these lights, I took the nodes from my water material that created caustics and copied them over to a new material to be used as a light function. This allowed me to have these lights project the caustics of the water onto the walls of my temple and added some more visual interest. Below is an exaggerated example to show the effect more clearly.
Here is the light function material:
For the interior of the scene, as mentioned before, I build a set of blueprints for all my light sources. These blueprints contained the light source asset (normally a chandelier and candles), individual static lights for each candle, set to a very low value and radius, and then a much larger and more intense static or stationary light. The reason I sometimes used stationary lights for these blueprints, is partly for the ability to cast dynamic shadows on moveable objects such as the characters walking through the scene in the video, but also for the ability to add flickering to the lights. To do this I added a simple timeline in the blueprint, that directly controlled the light intensity of the main light, giving a subtle flickering effect.
To get a nice, moody atmosphere on the inside, I used the fog cards from Unreal Engine's example project called Blueprints. These are simple blueprints that have translucent fog material on them, and you can place them throughout the scene to create a foggy atmosphere. These were subtle, but when overlapped throughout the scene, work well to create a nicer atmosphere.
I also created a very simple Niagara system to have little dust particles floating around the scene.
Post-processing for the scene was all done in-engine using a post-process volume actor. I actually used 2 actors, one for the interior and one for the exterior, as I found I needed more localized control. The main settings I touched on for these were exposure, slope and toe, film grain, and indirect lighting intensity, as well as adding a post-process material to sharpen the scene slightly, to push the finer details a little.
These settings allowed me to create a more cinematic feel, adding more contrast in the scene with slope and toe, overlaying a film grain effect to add the illusion of being shot on a real camera. I didn’t do any color grading to the scene, as I felt it wasn’t necessary as I managed to achieve the desired look through lighting and atmospherics, as well as the simple post-process controls.
And here were the final bake settings, set to production quality. Note that I didn’t do my test bakes on these settings, go much lower to speed up iteration, then start increasing when you have a set up you are happy with.
This was a huge project, putting together all the skills I have learned over the last 3 years at university. That being said, I probably learned more from this project alone than I have from any other, purely from the fact that the scope of the project meant I was having to use so many different techniques and workflows, that I may have known about before but not actually put into use.
One of the biggest challenges for this scene was scope, and not having a concrete plan for the interior. For a lot of the production of this scene, there was actually a third room past the main corridor stairs, which led to a prayer room where the statues were. This idea had to eventually be scrapped, and I pulled the statues into the main room, which not only saved me from having to create a third room but also drastically improved the composition of that main room.
Because of this, I would advise everyone to make sure they have a very fleshed out blockout, detailing the layout of the entire scene, as well as ensuring the scale of each asset feels correct when compared to a human scale reference, and then to break down their blockout into individual meshes and textures, and what can be re-used, as well as what can be split into modular meshes. I would also advise students and people going for entry-level positions against creating huge scenes to prove their skills, and more to focus on creating smaller scope scenes that they will be able to focus on details with, and more importantly – finish without getting burned out, or bored of the same project!
This content is brought to you by 80 Level in collaboration with Unreal Engine. We strive to highlight the best stories in the gamedev and art industries. You can read more Unreal Engine interviews with developers here.