Spoiler tag

Saturday, February 1, 2020

JSRF - Artstyle analysis

Deconstructing the JSRF Artstyle

JSRF is known for its "cell-shaded" style, which is achieved through texture, shading, lighting as well as post-process screen effects.

I believe JSRF uses a technique called lightwarp-shading, amongst other details such as the outline around characters.

The lightwarp shades the 3D model with a gradient of different brightness and color tones, here is a similar example as seen in the game Team Fortress 2, the right side showing the lightwarp shading.

TF2 pyro lightwarp:

JSRF lightwarp:

This is the JSRF main lightwarp texture, actually the lightwarp in JSRF is stored in (the following) larger texture file which appears to have more images that are probably used to fake reflections and/or specular highlights.

 To get a better idea of how models are shaded, on the left image I have made the textures of the character Corn near white, so we can clearly distinguish some parts of the body have a different shading, color, reflectivity etc

 Here is what Corn's textures for the body and face/hat look like.

 Here is another comparision, shaders only (with a white flat texture) vs shaded + texture:

JSRF player models use various materials, to get a better look at the materials in the following picture I have turned the player model into spheres each with a different material.



The game uses clever ways to handle shadows, real time shadows, pre-baked shadow volumes, flat mesh shadows and decal texture shadows.

Its unclear and I can only speculate on if the shadow techniques were chosen for performance optimization purposes and/or artistical choice, as for instance the level's shadows are simplified, that might have been deliberate to avoid visually noisy shadows that more realistic shadows would cause.

Let's go through the different types of shadows.

                                                   Decal casted shadows

On average the level of detail for pedestrian models are all around 200 triangles per model.

The crowds of people in JSRF use a faked decal shadow that is projected over the floor and stretched/oriented depending on the direction of the sunlight and animation:

Real time shadows 

These are mainly used on playable characters and important character models or animated objects.
The player model file contains a simplified version of the visual model that is used to cast the shadow.

There's Yoyo, notice his shadow is a bit more "blocky" than the visual model. though this is not really noticeable while playing and a nice optimization.

                          Shadow volume meshes

For the levels, JSRF uses pre-baked aka pre-calculated shadow volumes.
3D models that are overlay-ed over the level's visual meshes, and tints the parts it covers or any moving object that goes inside it.

Its unclear if these were auto generated, or made manually, because these shadow volumes don't cover every detail that a light would cast, the shadow models are simplified.

Here's a preview of the Garage level with the pre-baked shadow volumes visible in blue.

Once again, this technique might have been chosen deliberately for performance optimization and/or for artstyle choices, much of the shadow detail is simplified with this technique and lends itself to a far less noisy and more readable environment than if every tiny shadow was cast for the smaller details.

I think that covers the main things and its only a little glimpse into of the many things that make this game a piece of art.

Well, that's it for now, I am sure more could be said about the game as it is full of details I might have glossed over, if so feel free to let me know and I can edit this post or make a second part.


  1. Hey! I've been playing JSRF on cxbx and I've found your blog while looking for something very specific - do you know if there's a way to change .adx songs in the game?
    I'm trying to replace birthday.adx (which I imagine is Cibo Matto's Birthday Cake song) for an uncensored version. Is there such a converter?

    Thanks in advance!

    1. Welp, nevermind! I found out that I can use the PES Sound File Converter to convert ADX to WAV and vice-versa. Just had to edit/implement the right adx files. Thanks for all your work with the mods though!!

    2. No worries, glad you found the solution.