I am responsible for all of the technical art in this project, including building the custom shaders, helping the animation pipeline, and developing tools for the environment artists. All shaders are written in HLSL. I did not make any of the 3D Assets.
I implemented a raymarched fog system which is built for both ease of use and art direction. It’s optimized for real-time use and designed to work with my time of day system. Lighting is PBR based but is altered slightly for stylization and customization. The lighting and shadows are snapped to the shaders texels. It forces all light and shadow samples to align with any textures pixels to help push for a stylized, low-resolution feel without breaking PBR principles.
The blood system uses a very similar system to Splatoon's painting system. I create a new texture for an effected surface and set a color whenever a particle hits. While the effect may seem costly, it doesn't really affect performance at all due to the size of our textures. The largest size texture that we will need in the game is 512x512 which still doesn't have a significant performance cost when written to. This effect does have the downside of requiring all of our textures to have non-overlapping UVs which will affect optimization of the pipeline slightly. I am looking into other methods using Unity's generated lightmap UVs instead and using my texel snapping to align the effect with the texture but this has given mixed results as of now.
I built a procedural animation system using Unity's Animation Rigging Package, primarily for aiming weapons. It allows characters to dynamically target objects in world space without needing additional animations. The IK targets can be layered or blended with traditional animation and can be used for all humanoid characters in the game. The weather system drives fog color, density, and all particle effects like rain. These changes are global and update all relevant shaders and particle systems automatically. This takes advantage of Unity's built in wind system and Global Shader Variables so there's very little setup we need to do on our end when we use it.