Released at Hogmanay 2020, 4KB Executable Graphics (a single 4KB executable file generates this image, with no external data).

Download on Demozoo


This was inspired by a particular group of people: transgender women who either accept or figure out their true identity later in life, after settling and starting a family, and choose to stay in the closet either to protect that family or to keep it together. They know how to leave their prison, they hold the key, but they choose to repress.

Identity needs an outlet. Unable to live as themselves offline, social media provides this outlet for many - a space to present as themselves, find others, and support each other.

However, I don’t intend this piece to be about this group in particular and avoided visual hints about who the characters may be. There are many others in this situation, for many reasons. This is dedicated to you all.


Since the focus of the piece is about support as well as being in a dark place, I wanted to represent that and chiaroscuro (strongly contrasting light and dark) felt perfect.

I wanted the scene to be very dark, with a beam of light in the centre falling on the key and the hands, with everything else lit indirectly. Since the subject is a form of imprisonment, I went with light shining through a high, barred window.

To do this, I put a light far away from the scene:


Then, I added a plane between the key and the light. I used a simple 2d distance function to cut a few rectangles out to let the light through.


There isn’t actually a room at all - just the floor and one wall.

I use biased rendering here, meaning I shoot rays out of the camera into the scene, and each time the ray intersects a surface, I cast a ray towards the light rather than just hoping the ray will randomly hit it.

Since the light is far away and mostly blocked by a wall, rendering time would be extremely long otherwise.


There are 3 models here, all made with SDFs (signed distance functions). A key, one human, and a pair of hands.


It’s basic, but it’s small and far from the camera, no more is needed.



This is a bit more complex, apart from the head shape (a distorted sphere) everything is made from blended boxes. Here’s how it’s built:


Not everything is accurate, but it only needed to look right from one angle (or, technically two) in a badly lit room 🤷‍♀️

##No room for 2

With the tight size limits of 4KB and 30s rendering time, I didn’t want the extra code and slower rendering 2 characters required, so I simply mirrored and flipped one:



The characters are holding hands, representing support for eachother. But doing this with a single, mirrored character is both complex (since the mirror would have to somehow be between the hands) and limits the hand positions (I don’t want them shaking hands).

So, I decided to model the hands seperately:


Again, they’re built from blended boxes, and the final step is to blend the hands into the character models.


I’m not super happy with the modelling there, but it’s difficult and looks ok in the final image I think.


The raw pathtraced output looks like this (live preview quality, the final output is much less noisy):


First I reduce brightness:


Then increase contrast:


I wanted more depth to the shadows, so I increased the ‘contrast bias’. This lets me adjust the midpoint about which contrast is changed, the code is like this:

luma = (luma - contrastBias) * contrast + contrastBias;


Next is colour. I wanted richer colours, but without oversaturating. The first step is actually to desaturate:


Then I increase ‘warmth’ by applying a power curve to the chroma:


Just a touch of depth of field…


Finally, I added quite a hard vignette to cut the light beam and give the image better composition: