These images and videos are from an unreleased project that I had the pleasure of being a Senior Technical Artist for. They represent a prototype for solving local lighting, shadowing and AO in an interior space for a heavily stylized 2.5D.
This prototype came about because of a number of challenges related to this project...
- Due to our heavy stylization during post process steps using traditional forms of GI, AO and soft shadowing were non-starters because of introduced noise.
- On top of that targeting low spec platforms and current gen consoles meant that dynamic shadow casting would be at a premium where even a single shadow casting point light could cost multiple milliseconds in some scenarios.
- Finally artists and designers often took broad liberties with the 2.5D camera angle to achieve specific visuals and compositions that did not always align with realistic depth and proportions. This illusion held up in most cases, but often times shattered when attempting to light a space with traditional lighting actors.
Because of the above it became necessary to investigate alternative solutions to creating the impression of a lit interior that fit our style and didn't relying on the traditional lighting tool box.
Custom Skylighting Cubemaps - Even though this project's camera angle was straight on orthographic in nature we often skewed geometry such that two or more faces of an actor would be seen to give an impression of an angled perspective. This worked great in exterior scenes where the sun and shadow separated these faces into more readable structures. However in shadowed or interior scenes players would lose all sense of structure and the scene would completely flatten out. Normally visual tools like GI solve for this with bounce lighting creating subtle value shifts along planes. Instead I found that authoring simple 8x4 pixel custom cubemap textures that defined lighting values for each cardinal direction were enough to break up different planar surfaces and give shape to the scene. These textures were inputted into the skylight component that defined overall ambient scene values and could be swapped per lighting condition via data assets.
Modulated AO Cards - Just like with the above cubemaps, ambient occlusion is important to the overall scene in helping to better define shapes and structure of the spaces. It also helps to ground elements and make the overall scene more cohesive. Our stylized direction caused traditional AO and GI techniques that relied on noise and AA to smooth our low resolution screen space techniques to be too noisy. We needed a more artist friendly technique that could be intentionally applied. Thankfully such a solution was already being used in targeted exterior locations when I arrived at the studio to create deeper pockets of shadows. We used a modulate blend mode material on a camera facing plane and wrapped it in a blueprint to allow us to control various material effects per instance. I took this initial concept, cleaned it up and added additional features such as world space noise textures that would allow us to suggest material properties of underlying surfaces like brick or tile. When layered together it creates a convincing look that naturally blends in with the stylized stepped shading of the rest of the scene by shifting existing surface values one or two steps up and down the lookup table.
2D Light Cards - The final piece of the puzzle was finding a potential alternative to local shadow casting lights such as points, spots and rects. This would normally be a pretty difficult problem to solve without getting an engineer involved and digging into actual engine code. Thankfully our locked camera perspective gave us a huge advantage, allowing us to cheat. The first step was to create just the cast light itself with no shadowing. This ended up being pretty straight forward since we could re-use the solution implemented for modulated AO cards. Instead of darkening the scene we could instead brighten it. I then combine this with some simple math to approximate a circle (point) and cone (spot) mask. To solve for rectangular lights we use a spot light mask and implement a clipping plane by masking along the V coordinate of the plane at a given distance and exposing rotation values to the UVs for angled approaches. Wrap this all in a construction script blueprint to expose material values and you have a set of basic 2D lighting assets.
Creative Direction - Duncan Drummond
Art Direction - Jeramy Cooke
Level Art/Design/Props - Nick Bizzozero
See Part 2 for discussion on 2D shadow casting.