When I first joined the team, I was expecting to solely be a graphics programmer, but the team was in need of someone to fill the role of Quality Lead. This is a role that focuses on tracking deliverables and providing clear updates through build cycles. This role was great for me because I have a long history in leadership roles, through sports, music, and teaching, and enjoy working on all aspects of a video game, not just a single silo. This role allowed me to get a chance to work directly with each area of our team and help people with any problems they faced. I was highly successful in role and my fellow leads decided that I had earned an updated title, now being the QA Producer.
Going into year two, I was focused primarily on our large environment overhaul, and was leading the charge in ensuring that we could meet our deadlines and deliver the refreshed game world by winter. Working with a large environment team we pulled off our goals and in many ways surpassed them. It was my job to make sure that the work getting done met and exceeded the standards that our team had previously met, and if not, get to work in helping in any way to make it so. Like any team, there were bumps in the road, but we always were able to overcome them and work together in service of the game.
I am very proud of the work I have done as a leader on this team, and I hope that I helped to motivate them to make the awesome things they did. Working with Chirality has, and will always be a breeze because the people make it so.
I was initially hired on the team to be a Graphics Programmer and for general programming help. I quickly gained the role of Quality Lead and was helping the team leads to plan pre production of the project. For most of the first semester, our team was heavily focused on isolated prototypes in the differing areas in which our game would need things. I jumped early to create a really simple prototype of the kinds of graphics we could expect to see in our project. I added a color banded cel shader, basic edge outliner, and some shadow halftone effects in the first couple weeks of the project. I wanted our team to get a feel for the types of things that could be possible with Unreal Engine, as we were all new to the technology. I didn't know for sure what we would have in the long run, but the emulation targets (Hi Fi Rush, Jet Set, Wind Waker, Ultrakill) were already decided on, and they all had some version of these things.
I spent a long time doing almost nothing but research on graphics pipelines, understanding how games of the past achieved these effects, how to do them in simple systems like opengl or shadertoy, and then figuring out how to translate those ideas into the Unreal Engine material graph. There have been many iterations on all of these graphics effects, and the final result is actually the least amount of code out of all them. In the middle of development, we had 10+ dynamic post process materials running with dozens of uniforms being set every frame, and now we have 4 post process materials, and only 1 is dynamic (and the one uniform bool on event triggers). By converting to a source build of the engine, using custom shading models, and rewriting pre existing shading models, I was able to simplify our stylized pipeline while improving performance in scene rendering and post process. Now our artists feel the final output is more accurate to their original vision, the game runs smooth at high frame rates, and I am very proud of the nuance and fidelity I was able to achieve in the last remaining post process shaders.
After the first semester of working on this project, we had a strong prototype for what the graphics were going to look like, so I transitioned into the environment team to assist our level designer Sid in creating layouts and building gameplay.
The first thing we did was start to build out a checkpoint system, and creating gates for the player. The first iteration of this was a launchpad asset I created with primitives that was paired with a short camera cutscene watching it enable. We tied this unlock ability to specific enemies within the combat and were able to make a working game loop pretty quickly.
After getting the glue to hold our levels together, I started working on an advanced Wave Based encounter system for us to be able to place combat interactions within the level. This would allow for multiple waves of combat that can interact with other gameplay elements easily. We started with a simple force field around the combat zone and the ability to have certain arenas be spawned because of other arenas being at certain stages of completion. Mixing together nested arenas with and without force fields allowed for more complex game interactions to be created quickly.
At this point, I was starting to work almost full time doing environment tooling, whiteboxing, and building out first pass scenes for within our levels. As we went into the second year of development, I would be working in parallel doing Graphics and Level Design nonstop. We gained a large team of environment artists and decided to rebuild the entire game from the ground up. Having a somewhat clear vision of what we needed, having a year of prototypes, and being more comfortable with the tools, we could craft this from scratch quicker than we could edit what we already had. This was nice for a while as we kept the old levels playable and in engine always (they still are) while we were able to take multiple passes on redoing our game world. This ultimately was a huge success and allowed for the game world to feel huge by providing a long linear path way throughout the city from start all the way to finish.
As the project is finishing up, I am still going full time in level design and graphics as we are still refining the overall lighting and adding a small collection of challenge mode style maps to our game. I am very proud of the level design work I have put into this project and feel that the gameplay truly reflects how strong the design on this project has become.
As we entered post-production, it was clear that there was still things left to be desired from a graphical styling and fidelity point of view. Up to this point, all of the graphical styling in HYPERFIST was built on top of the PBR pipeline that Unreal Engine provides. We relied on mostly flat colored mesh materials and a heavy post process pass to achieve our styling. We constantly had issues with color accuracy between levels due to differences in how lighting was being generated between levels. The post process layers only added to this complexity by attempting to correct colors while also trying to achieve cel shaded color grading per level. Mix in some colored lighting, sky lights, directional lights, and hundreds of post process sliders, and it was near impossible to get exactly what we wanted. This process gave us something that showed off our style, but it was not as honed in as it could be, and we had clear goals that were being stopped by the base render pipeline.
I spent the winter break of 2025 rebuilding Unreal Engine 5.4.4 from source and porting our almost finished game product to the new engine. The primary push for this was the addition of custom shading models. By adding custom options, we could easily isolate our characters, environment, and player to have custom shading from the engine level if we need. In doing this, I eventually realized that I could rewrite the Default Lit shading model as well, this allowed for all of the pre existing assets to almost entirely be converted instantly to something more specific for our game. What we ended up with, was a super basic cel shader in the default lit shading model, with the roughness channel controlling light banding at a light integration level. This, along with dozens of other minor feature changes, (the biggest being disabling the tonemapper!) removed 10ms from the post process pass, simplified the lighting calculations for 99% of our game objects, and fixed our color accuracy issues. What is left is a graphics pipeline that runs primarily on directional light, sky light, and post process volume (most things disabled). We are able to achieve transparency with no issues, as well as use emissive colors to great effect. The result also leads to cel shading that is inherently integrated into all default Unreal Engine lights, allowing for extensive use of rect lights, spot lights, and point lights without performance loss. (as quickly as the normal pipeline... we still gotta be realistic about lighting)