Click Here to view all the amazing entries to Rookie Awards 2024
Loch na h-Airde - Viking Harbour
Share  

Loch na h-Airde - Viking Harbour

Alex J Wood
by AlexJWood on 31 May 2024 for Rookie Awards 2024

This is the final result of my final year honours project - a 3D reconstruction of the Norse harbour site "Loch na h-Airde" located on the Isle of Skye. Rendered in Unreal Engine 5.

6 209 0
Round of applause for our sponsors

The aim of this project was to create an interpretation of Loch na h-Airde as an 11th century Norse harbour featuring structures informed from contemporaneous sites, as well as populating the scene with other period accurate props. This is with the intent of showing how archaeological sites can be visualised with AAA game authoring techniques.

Everything you see in this project has been self-authored from scratch apart from the fog cards. This includes modelling all the assets, in-engine shader work, all the foliage and textures. The fog was created using William Faucher's EasyFog Unreal plug-in.

I explored increasingly complex processes during the project's development such as foliage creation, ZBrush to Substance Designer texture creation, utilising 2nd UV channels on complex assets and advanced shader workflows in Unreal Engine 5.

Renders

Flythrough

Breakdowns

Greybox to Final

Process

Foliage

In order to bring a sense of authenticity of the Western Scotland location and develop my foliage creation skills I authored an Highland Foliage kit . With limited Scotland specific megascans atlases online, I wanted to self-author an entire kit utilising multiple foliage creation pipelines to increase my knowledge of this specific area of environment art production.

Patrick Gladys' LevelUp.Digital tutorial laid the groundwork for this deep dive for the ground foliage, which then spurred interest in the wider project. Tutorials by Javier Perez and Nathan Mackenzie were instrumental in developing my knowledge of Substance Designer.

Four tree variants authored in SpeedTree. The aim was to create distinctive silhouettes. The three left are Birch, with the one on the right Black Willow. These were all built with modern AAA triangle counts in mind - ranging from 6.5-16k.

Highland Ground Foliage asset layout.

Final 2k ground foliage atlas. This was created by modelling the meshes in Maya to create an atlas, before baking in Substance Designer and final texture edits in Adobe Photoshop.

Highpoly modelling in Maya.

Ground foliage atlas maps. Albedo; Normal; Packed Translucence/Roughness/AmbientOcclusion; Opacity

Once the textures were complete, the meshes were assembled in Maya. I wanted the assets to be optimised for game engines and as such tried to keep the triangle counts low. Most clusters were 220 triangles or smaller. The gorse is highest at 1,832.

Highland Ground Foliage Master Material. This relatively simple shader allows macro variation in-engine and albedo fine tuning for flexible art direction.

Substance Designer Braken Atlas. Following authoring in Maya, I wanted to explore using Designer for leaf atlases. Javier Perez's excellent tutorials helped guide the workflow for this.

Leaf atlas ZBrush Sculpt and textured final textured result in Substance Painter. Going into this detail was one of the most enjoyable parts of the foliage authoring process.

With the leaves created, I made two branch atlases in SpeedTree so that I could use branch cards rather than individual leaves when making the trees, to ensure they could have optimised polycounts.

SpeedTree is amazing for tree assembly - while it can take a while to get used to all the variables and controls, its non-destructive workflow with the flexibility for handmade edits allows for quick iteration.

Substance Designer Bark and Moss Materials - these were implemented with a simple vertex paint shader to allow greater texture variety on the tree trunks. These were developed with help from tutorials by Nathan MacKenzie and Javier Perez.

Bark and Moss Vertex paint implementation.

Example Highpoly Sculpts

Initially when planning this project I wanted to lean heavily into developing my highpoly sculpting skills further. Time for this became limited as the project progressed due to an increasing push into in-engine technical pipelines and Substance Designer texture development. However, below are some example sculpts for the rock kit and planks used extensively in the final scene.

Ship and 2nd UV Channel

Due to its size and maintain texel density I created a trim to texture the long planks along the ship. This was used alongside 2 more material sets (for the prow/keel and inner furnishings). To bring these together I created a second UV channel which packed the exterior components of the ship (excluding repair planks). With this second channel I created two masks in Painter to create two different effects in-engine: a broad grunge mask and a more selective dirt mask for the recesses. The grunge mask was blended with a perlin noise in the shader to increase the mask detail as the packing led to a lower texel density.

Ship plank trimsheet.

Original UVs across 3 textures

2nd packed UV

Grunge and Dirt Crevice Masks

Unreal Shader setup – blending masks with perlin noise to increase mask detail 

Final result before and after 2nd UV implementation and texturing.

ZBrush to Substance Designer Workflow

To develop my skills in Substance Designer I wanted to explore workflows which incorporated ZBrush sculpting into texture authoring as my ZBrush skills would help provide stronger results.

For the river cobbles and river gravel I utilised a pipeline excellently broken down by Jared Sobotta for the materials he made for The Last of Us. This involved some quick stone sculpts which included layers of procedurally applied noise. These were then laid out in 10-unit square with paired stones on opposite edges. Polypaint was then randomly applied, ensuring colours matched on paired edges stones. The height, normal and vertex maps were then exported to Substance Designer.

The rocks were also laid out as an atlas as a basis for the gravel material.

With the Height, Normal and ID mask exported from ZBrush – these were utilised in Designer to make the materials below.

The graph was relatively simple, with minor tweaks to the height to add some smaller pock marks. The majority of the graph was powering the albedo variants, sampling from reference photos of rocks at Loch na h-Airde. This graph was reworked to texture some rock meshes which were used alongside these materials in-engine.

Final river cobble and gravel materials rendered in Marmoset Toolbag. 

Designer graph for River Cobble

Individual river rock meshes

Water Shader - Single Layer Water

The water shader utilised the “Single Layer Water” shader pre-set. This unlocks multiple new nodes specific for the creation of a water-like surface such as caustics, scattering and abortion (which requires a low Opacity value). While not overly complicated, Panning textures are required in order to get the effect of water flowing. In addition, refraction powered by distance fields is important to help create a sense of flow around objects intersecting with the surface (such as the posts – see below).

Final water result

Single layer water shader

Material Instance Water Parameters

Material Functions - Wetness

The single layer water’s absorption and scattering effects can help create a sense of colour/depth under the water however it felt like it didn’t go far enough to make the objects below and slightly above the waterline seem wet.

To support the water shader I made a Wetness Material Function which could lower the roughness value and tint of objects under the water (primarily darkening and desaturating). The height of the effect could be changed and was set to sit just above the waterline.

This MF was linked in into the Master Material (ensuring it only drew from the Base Colour and Roughness and allowing the Normals and AO to bypass the function as it would break the material).

Wetness function at work (with water plane removed to showcase)

Wetness Material Function Shader setup

Material Functions – Realtime virtual textures

When creating landscapes with natural features such as rocks intersecting with the ground, these contact point can be abrupt by default in Unreal.

To address this, I used a Realtime Virtual Textures approach. This involved pulling the albedo and height map from the Landscape and blending it with the assets via a Material Function. The Material Function allowed customization of the blend, increasing the falloff and height as needed. However, on vertical surfaces it stretches the textures dramatically so needed to be used selectively. This Material Function was combined into the general Master Material I created to be used as required on an asset-by-asset basis.

RVT Material Function Setup

Example Props

Example Additional Substance Designer Materials

Wrap-up

This project was an excellent vehicle for learning new workflows of increasing complexity. My previous projects had leant heavily on standard asset production alone whereas this dove deep into the more technical workflows in order to combine the various elements of production together.  

Thank you for taking the time to read through this project!


Comments (0)

This project doesn't have any comments yet.