Matt Newell shared a breakdown of another interactive exploration project Castle Rock Beach made in UE4 with the help of Megascans.
About the artist: Matt Newell is a 3D Environment Artist from West Australia. His interest in photography, music, and traveling led him to experiments in UE4, and he started to create short interactive exploration projects for desktop and VR like Castle Rock Beach, West Australia. Learn more about Matt's environments here.
Castle Rock Beach, West Australia: About the Project
This location was on my list of to-do’s, and I started working on the scene shortly after Megascans had become free for Unreal users, so I was itching to mess around with some of their beach themed assets. I was also able to revisit the real location soon after I started the project, which gave me a wealthy collection of reference photos to work with. It also feels great to represent my part of the world in this format, as Australia isn’t a very common setting among popular video games and films.
I always approach my landscape terrain by using manual sculpting/painting. Using heightmaps and other landscape tools can be helpful for quick and realistic results, but I often find I need something more specific. I’ve used UE4’s landscaping tools for long enough to have my own techniques that allow me to sculpt the landscape fairly quickly, while still having a natural appearance.
Here's a short timelapse video that has some footage of landscape sculpting:
The environment was made almost entirely from ready-made assets from Quixel Megascans and the UE4 marketplace, all of which were optimized and repurposed to represent the Australian landscape. My approach here was similar to the one used in the Kyoto scene, so I'll just quote it:
I really value the cohesiveness of the assets when they’re all put together, which can be difficult to achieve when there are so many different sources I’ve used. You can really notice the differences in brightness and color when they aren’t fine-tuned, for example, two different sources will probably use two different tints of green for their leaves, or one asset might be too bright/dark in comparison to others. I keep a relatively simple master material design that I use for all of my instances, which helps me tune colours on the fly.
This short string of nodes is what I have consistently included throughout my master materials. I figured out how to make these kinds of modifications when I started learning to design shaders, and I haven’t changed my approach since. Just continuously configure these scalar values throughout your material instances and you’re good to go.
I don’t have a whole lot of experience in making my own assets, but I still included one or two of my own unique models for practice that were put together using a few photos of plants and surfaces on location.
- Sand – This was a tessellated vertex blend material. I blended between two main surfaces, one of which has a low-roughness variation for the wet shoreline, so there are tree surfaces to paint with in total.
- Landscape – A simple blend between 4 surfaces. I included some flat meshes with a tessellated texture on top to give 3D depth, and used world aligned UVs to help the overlying mesh blend with the landscape. I used this only for some detailed areas of the map, as opposed to using a tessellated material for the entire landscape, in order to keep the low performance cost.
The biggest challenge in this project was including as much foliage as possible while keeping everything optimized. I was able to figure out a distance fade method that was incorporated with temporal AA, which allowed me to have seemingly unnoticeable fade transitions for distant foliage. With this method, I could focus on close-up detail with a large performance headroom, as I could get away with much closer draw distances than usual. I tried to add as much variation as possible with the foliage and included billboards for a lot of the larger models so everything still looked dense at a distance.
Material nodes used for the smooth fade transition:
The lighting for this project is completely dynamic, which is mostly because I often make lighting changes on the fly and baked solutions don’t really accommodate this approach (as well as my short patience). I also wanted to include a few different lighting variations (day/afternoon/sunset) that could be changed on the fly when in game.
I tested out several lighting setups, including a combination of baked shadows, but ended up going with an entirely dynamic solution with distance fields and contact shadows. The distance fields allowed me to extend my shadow distance with a minimal performance cost, and the contact shadows improved the close-up detail and helped me to make the groundcover look more prominent. I also implemented a solution that changed the quality of cascaded shadows depending on where the camera is in the scene.
Adapting the Scene for VR
The VR version ended up requiring much more work than I expected. I found that I had to replace many assets and even remove some instances altogether trying to combat the cost of the dynamic lighting solution (which isn’t often ideal for VR). I also replaced all tessellation materials with a Parallax Occlusion based alternative, this allowed me to get surprisingly nice detail on surfaces without the usual tessellation performance cost. It was a huge challenge to make the project fully optimized without being too aggressive on quality, so I tried to settle on a balance between the two, as I still wanted the game to run on base-level VR hardware.
Because of my previous experience in making such environments, I was definitely able to refine my process this time around and avoid tasks that would usually be very time-consuming. Being able to import all master materials from previous projects definitely helped a lot, as well as just having a good grasp on the ideal lighting and post-processing for the scene, so I didn't have to spend too long adjusting the details.
While the scene did take a long time (9 months on and off), I tried to budget a certain amount of time for each task to avoid working on one aspect for too long. I knew I would have to make compromises here and there, so I just tried to bring everything to a level that I was happy with and not to tamper with it much further. Not feel too exhausted, I try to convince myself that the stretch goals and finer details are worth saving for the next project.