Modelo-UFC VR Game
The Modelo UFC Fighting Spirit Challenge was a VR experience I had the pleasure of working on in early 2019 at Groove Jones. My role as Technical Artist saw me overlooking all visual related engine work, including:
-Character shader and lighting
-art pipeline management and asset optimization
-animation and sound implementation
-vfx and gameplay programming related to implementing anything visual
Our target platform--the Oculus GO--presented us with several challenges, not the least of which was to deliver a stylized and interesting experience while maintaining great performance on a mobile VR headset.
Arguably the most important part of the experience visually was the opponent players would fight, and so a lot of my time and energy was dedicated to supporting the highest quality character we possibly could on such a low-end hardware.
Since the characters in the experience were so important, we didn't have much performance budget for the background environment. We decided to take advantage of the fact that the Oculus GO only has 3 DOF (or degrees of freedom). Our solution was to render a high quality stereoscopic image as the background. So the background was mostly an image, but the stereoscopic packing of the texture allowed use to fake depth. (Gifs show monoscopic since they are screen-recorded.)
There were 2 problems with this solution:
1) The ground, being the closest element to the player, had depth issues, especially with characters moving on top of it
2) it made realtime shadow-casting of the characters impossible
To combat those problems, we decided to leave just the ground of the fighting ring as a 3D object. It took some coordination to line up just right, but the gif from before is using this same setup, and in experience it ends up looking quite convincing.
The result was a fully realized environment with just 2 draw calls and under 2k tris.
I created a custom shader for the opponent, using Unity plugin Amplify Shader Editor (similar to Material Editor in Unreal). Below are a series of images to illustrate the features of the custom shader.
Usually for mobile apps its recommended to use Unity's Standard Shader, as it is meant to deliver the best results at the most efficient cost. But we agreed as a team that there were features that called for a custom shader, and the results we were able to get with the standard shader were less than desirable anyway.
Custom Shader 1/3
The first 2 things to achieve were to bring out the shadow definitions and specularity of the gloss map.
Custom Shader 2/3
Though we couldn't afford to do a true Subsurface Scattering calculation, I did 2 things to fake the effect; First, I exposed parameters to adjust the intensity and color of the AO map.
Second, for a faked SSS, the shader performs a dot product calculation with the rim light and vertex normal directions, which it uses to lerp an emissive SSS color, and then multiplies the result by a 'mask' texture I made so the effect is most apparent on the ears, neck, and underarms.
Custom Shader 3/3
I also exposed a 'damage' parameter that dials in a damage texture I authored as the player progresses in the fight.
Gif below of the effect dialing in.
Though we took great measures with the environment to save as much performance budget for the characters as possible, our character team kept the poly budget for the opponent under 30k tris. This was mainly because we were using a few dynamic lights for the desired rim-lighting look, and as we were using forward path rendering, each light had a significant cost driven by the tri-count on the characters.
If I were to revisit this project I would fake the desired rim-lighting look in shader instead, but since we had the budget room and the stylizations of the character allowed for it, we decided to go with this method.