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 to shade the models.
The lightwarp shades the 3D model with a gradient of different brightnesses and color tones.
Here is a similar example of this shading technique as seen in the game Team Fortress 2.
The right side is the lightwarp shading.
TF2 pyro lightwarp texture:
TF2 pyro lightwarp texture:
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 likely 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 almost white, so we can clearly distinguish some parts of the body using a different shading, color and reflectivity.
Here is what Corn's textures for the body and face/hat look like:
Here is another comparison, 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.
Shadows
The game uses multiple ways to render shadows: real time shadows, pre-baked shadow volumes, flat 3D meshes as 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 was an artistic choice, as for instance the level's shadows volumes are simplified, that might have been deliberate to avoid visually noisy shadows that more realistic shadows would cause and/or also a less performance demanding technique to cast shadows.
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, its just a rectangle (using two triangles) with the shadow texture on it and using opacity to blend it with the surface its projected on.
As you can see, the blue texture on the bottom of this picture is what gets projected underneath the pedestrians to fake a shadow, its simple, cheap, elegant and effective.
After all there's so many pedestrians in JSRF that using real time shadows would definitely tank the framerate on an original xbox.
Real time shadows
Real time shadows are mainly used on playable characters, important characters models or animated objects.
The player's model file contains a simplified version of the visual model that is used to cast the shadow.
There's Yoyo, 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.
The volumes of the shadows are baked into a 3D model that are overlay-ed over the level's visual models and darkens/tints the areas it covers or any moving object that goes inside it.
In the following image you can see the shadow volumes in blue for the garage level, on the top right image I have made the shadow volumes semi transparent so you can get a better idea of how these shadow volumes overlay over the level's visual mesh and darken+tint the areas inside the shadow volume model.
Casting real time shadows for the scenery is most likely too taxing performance wise (at least for the original xbox) so instead it seems the developers decided to use shadow volumes which are far less expensive for the game to run.
Its unclear if the shadow volumes were auto generated, or made manually, or a mix of both, because the shadow volumes seem to have been simplified since they do not contain all the shadows for every object in the level, it's mainly only buildings and medium sized objects that are in the shadow volumes.
Besides the performance/optimization boost by using shadow volumes instead of real time shadows, 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.
Well, I think that covers the main things and its only a little glimpse into the many things that make this game a piece of art.
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.
this is amazing !
ReplyDeleteHey! 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?
ReplyDeleteI'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!
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!!
DeleteNo worries, glad you found the solution.
DeleteHi, are there any plans to enable level exporting in the future? I've been using the 0.2 version of your tool and although it works great I still have to piece together entire parts of the level from vertices, I'd love to streamline the process if possible for the project I'm working on. Thank you for your work so far!
ReplyDelete