Website powered by

Our 2021 Epic Megajam submission | Tech Breakdown

Making Of / 06 September 2021

Joining the 2021 Epic Megajam

Hey there travel.. readers!

Another year has passed, another Epic Megajam has happened! This year's theme was "Running out of space" and we made a game based on the literal meaning of it. Bomb - o - Mastoras is a fast-paced, local multiplayer arena brawler, where up to 4 players can compete against each other in order to decide who's the last ghost standing. I feel like I'm starting to repeat myself here, but this game jam was an amazing learning experience, and this is the blog post where I tell you all about it! So without further ado, let's get into the juicy stuff!

NVisionary Environments

Participating in the NVisionary Environments special category was an amazing excus... I mean opportunity to test all those fancy raytracing features in a semi-production environment. We wanted the best visual fidelity possible but at a reasonable performance cost. In the end we ended up utilizing RTGI (Global Illumination), RTAO (Ambient Occlusion) & RT Shadows. Lastly, we opted out of using RT Reflections, due to their limited visual impact in our specific case. Having a fully dynamic direct & indirect lighting setup gave us the flexibility to iterate a lot on the look of the game and we tried to implement as much dynamic environmental elements as possible. Some examples of that are the randomly-generated, lways-floating islands in the background, as well as the constantly-rotating sky light. 

Raytracing & WPO

Using WPO with Raytracing was a tricky one. I had to go through some fairly hidden CVARs in order to make it raytracing work with WPO meshes (actually blueprints in that case). I'm not sure if this was a raytracing limitation before, but we used the latest UE4.27 just to make sure that we have the latest features and the best possible performance in terms of raytracing. In any case, these are the two console commands that you need to change in order to have raytracing evaluate meshes that have WPO:

r.RayTracing.Geometry.StaticMeshes.WPO 1//This enables WPO evaluation in all static meshes. This can also be done on a per-actor level if you don't want to enable it globally.
r.RayTracing.Geometry.StaticMeshes.WPO.Culling 0//This disables the Culling of WPO meshes. Defaults to 1, presumably for performance reasons.

Lightweight, stylized clouds

Everyone knows that you can't have a floating island complex without fluffy, soft clouds to fill in the sky. These clouds were one of the first things that I wanted to tackle in this game jam and I really love the flexibility that the material properties give me. 

And here's how the master material looks. For extra performance gains, I used the Additive Blend Mode, an Unlit shading model, enabled Two Sided shading and disabled an Raytraced shadowing & decal response to this material. This allowed me to use the material  without any heavy performance impact, even when applied in fairly high-density meshes such as my smoothed-cube clouds. Lastly, as you can also see in the video above, I set up some LODs for the cloud meshes, in order to further optimize them in great distances.

Cloth physics

Having a secondary cloth simulation was not part of the initial roadmap but at some point we realized that it would give an extra sense of fluidity to our ghost characters. Thankfully, Unreal has a really solid and straightforward way to paint out the affected cloth areas and tweak a few settings to get accurate, game-ready cloth physics. In the video below, you can see how big of a difference it makes!

Camera Shakes

If you know me, you know that I always have a soft spot for subtle camera shakes. Camera shakes are one of the easiest and most effective tools in your arsenal to make any game alive and dynamic! In this game, we utilized a layered approach of two MatineeCameraShake classes (I hope that's the technical term) in our camera blueprint. The first is responsible for the subtle, base camera shake that is effective at all times and the second one is a more intense, snappy camera shake that is triggered only when a bomb explodes in the arena. 

And with that said, try not to overdo it! That's also a note to myself. I may have had too much fun with camera shakes in this jam...

That's all for now folks! Stay tuned for an update on my next collaboration project with Pat and Greg soon-ish!

Later days!


Breakfast Jam | Tech Breakdown

Making Of / 06 August 2021


Hey there! A couple of weeks ago, I uploaded my collaboration with Pat & Grigoris,  where I was responsible of the Unreal side of things. This included things like shaders, lighting, post process and rendering the final shots. This blog post will be a quick tech breakdown of the few noteworthy bits that I'd like to share with you.

You can see the final renders here!

Pat's original, extremely chonky & yummy concept

Final Render

RTX Everything

Having recently bought an RTX card, this small-scale diorama scene was a perfect opportunity to dip my toes into the raytracing world. I decided to go full-in and I can officially say that I cannot look back now. This scene utilizes raytracing in all of its aspects, from shadows, reflections and even translucency & Global Illumination. All these rays quickly bring up serious performance implications but enabling Nvidia's DLSS and fine-tuning the samples per pixel settings helped quite a lot. Below you can see the raytracing settings I used while working on the project.

These settings, along with the Performance DLSS option gave me a good performance to work on the scene. I then set up a Movie Pipeline Render Config file with the final high-sample & resolution raytracing settings. These will only be used when rendering the final shots with the Movie Render Queue. A lot of these settings where not really needed in this project but were migrated from a previous project and I thought I'd add them to the list.

Light Setup

Since all of the scene utilized raytracing, lighting it was a breeze and I had the flexibility to have many iterations. I tried for the first time to recreate my Marmoset Toolbag workflow. That basically means, start off with a low-intensity HDR to make sure I don't have completely dark shadows, continue with a basic three-lighting setup (key, fill, rim lights) & finish off with some "painting" lights to guide the viewer's attention to. Additionaly, I used exponential height fog to get that bright and vivid background color and used a strong vignette value in my post process volume to get a nice gradient for it.  In the gif below, you can see how the different lights help build up the scene bit by bit.

Standard Master & Ray-traced Glass Materials

There weren't a lot of changes to do with the standard master material because Grigoris had already done a great work with the texturing of all of the assets. I mainly exposed a couple of intensity parameters for Base color, Roughness and added a small subsurface intensity value. Most of the meshes were exported separately so I had the flexibility to do slight changes in different assets to get more consistent values throughout.

The glass shader was a bit more tricky but connecting the refraction nodes to the specular input did the trick. Some of its setup is not super intuitive, and a proper stylized glass material is still on my list for any future projects.

Kuwahara filter

Kuwahara is a neat, little filter that I've come to love in recent times. It performs a certain screen-space effect that gives everything a slight brushstroke look. Its main limitations are 1. that a stronger intensity effect is very heavy in terms of performance and 2. it's really resolution-depended so you really need to be careful with the radius value of the effect. For ease-of-use, I set it up in its own post process volume and made sure to enable it only when it was time to do the final renders. Below you can see some closeups of what the effect achieves. If you're interested in recreating this effect, check out this awesome youtube video!

That's all for this time folks! See ya all on the next one.


Deserted Canyon Camp | Tech Breakdown

Making Of / 07 May 2021

It's been quite some time since my last blog post but 2021 was one of my busiest times so far. Last month I joined the Beyond Extent community with their "Shady Rest Stop" challenge and this blog post is a tech breakdown of the technical bits and bobs that I created for the environment. In case you missed it, click here to see the full environment post!

One really important thing that I'd like to point out is that this was a team effort and I was lucky to have teammates that wanted to focus on asset creation.  This gave me the chance to take full responsibility for almost all in-engine aspects and work on materials, lighting, post-processing, cameras, and some set dressing.

Here are the links to the awesome people that the awesome stylized team consisted of!

To start with, this environment was the perfect opportunity to dive deep into RVTs (Runtime Virtual Textures) after my brief exposure with them during Artstation Challenge. I managed to extend the landscape blend functionality to also sample proper normal information and roughness. This gave me the 100% seamless blend even on assets that have faces perpendicular to the landscape. This came in extremely handy while trying to blend all these hard architectural surfaces into the landscape.

Some videos showcasing said blending and some parameter tweaking

And here's some of the material setup behind all this magic! I organized this bit on a material function for future re-use.

I had to do a lot of troubleshooting to get the normal blending to work on all meshes but in the end, using World Space normals did the trick. Just keep in mind to use a TransformVector (Tangent -> World Space) in your asset master material before blending it with the landscape normal. 

Aside from RVTs, one of the other focus areas of my research in this environment was creating a multi-purpose asset master material. I ended up using it for all opaque meshes, so I'll call that a win. In the video below you can see some parameter tweaking of some of its features.  

  Ain't it a beaut? Remind me to use MaterialAttributes to hide all that Triplanar textures spaghetti next time.

Lastly, the foliage shader had some interesting challenges for me to tackle but due to time constraints, it wasn't one of the main priorities for this scene. I used a two-level wind distortion (using WPO), similar to that of my Arstation Challenge environment. Since my teammate prepared all base color, form & normal textures, there was no need to have in-depth base color and roughness controls. 

Thank you for taking the time to read this and a special thank you to all of my team members and people at the Beyond Extend community, making awesome challenges like this one happen!  See you on the next one!