Lightmatter is an atmospheric first-person indie puzzle game, where the floor is made of lava shadows. If you step on shadows, you die. So you need to use lateral thinking to manipulate lights and shadows in clever ways in order to progress in the game. I was a programmer and narrative designer on the project and co-founder of Tunnel Vision Games.

lightmatter_1 (2)

We released the original prototype in 2013, which won an award for the most Innovative Game at Casual Connect, Amsterdam, and it was nominated for several other prizes at other award shows such as Unity Awards and Spilprisen. Since we graduated from the University in 2016, we opened the studio Tunnel Vision Games, and spent 3.5 years developing it into a full commercial product on Steam.

The game received 90% positive reviews on Steam out of over 600 reviews (February, 2020). The graphical side as well as story are frequently highlighted in the reviews.

I wrote this featured Gamasutra article about programming the visual effects for the game.

Context: Released commercial Steam game, Tunnel Vision Games
Released: January, 2020
Time spent: 3.5 years
Total amount of programmers:  3
Software I used: Unity 2019 (C#), CG / HLSL

My areas

  • Graphics programming (written in CG / HLSL)
    • Edge detection image effect (using depth and normals)
    • Screen space reflections (used for the shadow tar look) + dissolve effects for dangerous and non-dangerous shadows
    • Death in shadows image effect (distortion effects + vignette)
    • Custom deferred lighting model – diffuse and specular with thresholding + slight gradient (changed the built-in deferred pipeline)
    • Custom light sources (tube lights for the Lightmatter beams)
    • Lightmatter beam shader (vertex displacement + HDR)
    • Crystal shader (noisy reflection + HDR)
    • Glass with refraction (for e.g. photon connectors)
    • Various types of glass with toon reflection
    • Fog (used to fade out especially the bottom of levels)
    • Interactable object glow effect using command buffers
    • Collaborating with the Alexandra Institute on a custom Temporal Anti-Aliasing solution
    • General modifications to existing shaders for optimization + render order
    • Shader prototyping various art styles and effects
  • System programming
    • Modular player state system – Our player controller has many different states in regards to jumping, dying, ‘cut scenes’, carrying objects, vaulting, etc. I made a system that encapsulates state behaviors and transitions, so making states is fast, modular and without the need to modify existing states.
    • Input system that is easy to extend for e.g. porting.
    • Prototyping systems
      • e.g. a hub progression system that was cut from the final game
      • e.g. a path creation level design tool that was cut from the final game
  • Gameplay programming
    • Player controls (with another programmer)
      • Movement + movement on slopes
      • Jumping + ghost jumping
      • Carrying objects
      • Dying
      • Interactions with buttons and objects
    • Power cell (sensor) mechanic (with another programmer)
    • Trigger functionality
      • e.g. condition system for triggering voice lines based on specific player actions (with another programmer). It was modular so conditions can be combined in many ways. These are conditions such as coming up with the wrong solution for a puzzle, placing multiple objects in certain areas, entering certain areas a specific amount of times, time spent on a puzzle, or e.g. jumping, pushing buttons and activating power cells in certain ways.
      • e.g. nudging the camera for set piece moments
  • Lead programmer tasks
    • Enforce design patterns and clean code
    • Planning sprints
    • Sprint reviews
    • Burndown charts
    • Jira setup
    • Jira boards
  • Narrative Design
    • World building
    • Creating and structuring the plot
    • Researching and developing the characters
    • Researching and prototyping storytelling techniques
    • Communicating and integrating narrative into the process of e.g. level and sound design
    • Implementing voice over using our own trigger system
  • Lead writer in a team of three writers (64-page script, about 10.000 words, 236 lines)
  • Co-directing voice-over for actor David Bateson & actress Natalie Hitzel
  • Puzzle design – Prototyping and iterating on puzzle ideas

Showcase – A selection of my work

Edge detection shader
I wrote an image effect using difference in depth and normals with the line color being dependent on the color in the frame buffer – e.g. white lines for dark pixels. I worked a lot on getting smooth lines with variation in intensity to achieve a handdrawn look as well as fading the lines in interesting ways (right click on the images and select ‘open image in new tab’ to view them in full size).


Screen space reflections (SSR)
To make the shadows look dangerous, I took an SSR solution, limited it to shadows on floor, applied distortion effects, and optimized it. I would like to make a cube map solution for lower settings, but due to time constraints on the project, this wasn’t possible.


Shadow death effect
I made a shader that gave our 3D artist control over the vignette animation through a a greyscale vignette texture. I also programmed the ‘sinking’ controls, so the moves and looks exponentially slower throughout the sequence. Then I added all the distortion effects, blur, chromatic abberration, vertigo effect and particle effects.

SSR dissolve effect
The dangerous shadows are dissolving and turning into normal shadows. I achieved this by applying a vignette texture (similar to the shadow death effect) to the shadow SSR render texture + adding particle effects.

SSR border effect
A border showing the difference between dangerous and normal shadows. I achieved this by thresholding world positions used in the SSR with a displaced offset to achieve the wobbly line. I also made the functionality of the shadows not killing the player in that specific area as well as the transition to dangerous shadows.

Custom deferred lighting
Since we use many light sources per level, we use deferred rendering for better performance. To achieve our cel shaded art style, I customized Unity’s built-in deferred lighting.



Custom light sources (Lightmatter beams)
I wrote a custom tube light shader for the light emitted from the beams. I also made a shader for the beam itself with vertex displacement + HDR colors.

Crystal shader
A shader that interpolates between outputting a cubemap and HDR colors.


Glass with refraction
Grabpass (re-used texture) with refraction on normals facing away from the camera direction + freznel.


Glass with toon reflection
UV offset based on dot product of predetermined glass vector and direction towards the camera + freznel.

Glass with toon reflection 2
Inverted stepped freznel. 

To hide e.g. the bottom of the levels. In ordre to give the level designer control, I use a grabpass (re-used texture) on a cube –  fading the output based on depth of fragment and depth buffer value.

Glow for interactable objects (the orange outlines)
Outline glow shader using command buffers for flexibility, so it can be applied to any object with any material.

Prototyping various art styles (not in the final game)


Shadow peep hole (not in the final game)
Early in the project, you could jump through shadows on walls. I made a cutout + distortion shader that got triggered by our shadow detection script.

Light orb point (not in the final game)
The game’s structure was once very similar to The Talos Principle – hubs with points you collect at the end of each puzzle. In GIF below, the light orb is one of those points. I made a path tool, so it was easy to animate stuff like the orb flying around. And as the orb gets close to the player, I change it to orthographic space, just before it turns into a UI element at the top of the screen.

Color-specific objects (not in the final game)
A shader to test the idea of certain objects only existing in certain colors of light. Yes, the car is just placeholder. LightDimensionCar4

SSR ‘upside down’ artifact (not in the final game)
Sometimes playing around with shaders can bring you to another dimension 🙂


Lightmatter is a breath of fresh air to the easily forgettable puzzle genre. The game is an impressive package of well-crafted puzzles, gorgeous art style, and incredible sound design. Lightmatter requires players to forge their paths by illuminating dark areas using strategic use of lights and avoiding the deadly shadows.
9 / 10 – Player.One

What makes Lightmatter work isn’t the puzzles or the story but how well the two fit together.
4 / 5 – Hardcore Gamer

Lightmatter’s puzzles are shockingly smart, and getting that “Aha!” moment is brilliant. A little more refining and this may be a true first-person puzzle classic.
8 / 10 – TechRaptor

Lightmatter is a great way to kick off a new year of puzzles and adventure gaming. It is really a lot of fun with a great story and brainteasing puzzles that will keep you engaged from start to finish.
4.5 / 5 – Game Chronicles

If you want a challenging brain teaser with simple controls, this game will cook your noodle.
– The Escapist

Those who enjoy puzzle games will find plenty to enjoy here. With well-crafted mechanics and a care for everything from art design through to the balance of overall game length, Lightmatter shines.
– Screen Rant

Lightmatter is a slam dunk. It’s been so long since I have felt quite as satisfied as this game has left me.
– Checkpoint

Lightmatter is a generally well-crafted experience which gently eases you into more difficult challenges and switches up the puzzles just when you’re getting irritable. Tunnel Vision Games have created a finessed puzzler with superb pacing.
7 / 10 – The Indie Game Website

YouTube Videos

Danish Media