Assassin's Creed III: Remastered

By Iker Giménez


Summary

Personal Highlights

Video

Project Description

Assassin’s Creed III: Remastered was my first project in the games industry. I was accepted to Ubisoft Barcelona through their Graduate Program as a gameplay programmer, and made the switch to the engine programming team about a month in. It was daunting for my first job to be in a AAA company, but it showed me how valuable and practical the skills I obtained while studying at DigiPen really are. I was able to grasp working with Perforce, with console SDKs, bug reporting tools, crash dumps, debugging, asset pipelines, rendering pipelines, and many other systems quickly. Assassin’s Creed III originally released in 2012, and a lot of the systems were showing their age and their limitations. The project taught me a lot about working within an existing code base, where the project aims to not change fundamental gameplay behavior, while also recognizing what can be cut out or reduced to improve quality of life. Overall, the main highlight of this project for me is that the team felt tight and cohesive and there was a high sense of team spirit. We trusted each other to make the best decisions for the project and for the team, even when what was available to us was not ideal and we had to make compromises for the sake of the release date or to keep the scope realistic.

A particular challenge we faced that I was in charge of solving is the HDR rendering. Owen Angell, one of the senior rendering engineers on the project, supported me through the process and referred me to some blog posts from Jasmin Patry, about the HDR implementation on Infamous: Second Son. HDR is a tricky subject, in part because HDR is an overloaded term that means multiple different things. The first time I heard of HDR in a game development context was in Half Life 2: Lost Coast. Lost Coast is cut content from Half Life 2 that Valve released in part to showcase some of the graphics work they were doing at that time. The level showcases scenes in which the main character goes into and out of dark tunnels, and the game simulates human eyesight by having adjustment periods as the character moves in and out of these locations. To achieve this, the lighting pipeline was changed to be HDR, high dynamic range, rather than the lighting pipeline game engines mostly used at the time, which kept the lighting value calculations within an SDR, standard dynamic range, set of values. Basically, games usually used 8 bit integer values to store the result of lighting calculations, which limits the set of colors that a scene can contain. It also makes it difficult to have particular lighting sources “overpower” others. In real life, light sources have a specific brightness to them, usually measured in candelas or lumens, and the human eye is capable of letting in more or less of that ligth by expanding or shrinking the pupil. This is what allows humans to see in the dark, given enough time to adjust to lower light settings, and what causes sudden changes of lighting like going into a tunnel and back out, to be uncomfortable and need an adaptation period. If the lighting calculations are stored with a different data type, such as a 16 bit or 32 bit integer, or even a 16 or 32 bit floating point data storage, the range of values that the intensity of a light source can be is suddenly much wider. Besides mimicking human eyesight, this also allows lights to be much more dynamic. More commonly, HDR is used these days to refer to screens that can display a larger gamut of colors than SDR screens. What this changes is the format of the buffer the game is rendering to, so now it is able to write out its values to a buffer that can contain a wider set of numbers, and therefore also show images with a wider contrast natively, rather than forcing them to have to be mapped into sRGB or some other standard dynamic range gamut. I’m simplifying some of this for the sake of brevity.

For Assassin’s Creed III Remastered, we wanted to support HDR televisions and monitors for the PlayStation 4 Pro and Xbox One X. The problem was that the Assassin’s Creed games with HDR rendering also changed the way their UI is rendered, which made it so that we couldn’t just piecemeal merge in the feature into Assassin’s Creed III nor copy the solution over somehow. Assassin’s Creed III’s UI is blended on top of the 3D scene, so that blending needed to happen with the correct values in order for the UI to look correct, and we didn’t want the UI colors to be affected by the HDR mapping to avoid visual issues. The solution we came up with was to calculate the blended value, and then transform that by the inverse of the HDR mapping look-up-table (LUT) so that when the HDR LUT got applied to the final draw, it would undo and mostly preserve the calculated blended colors of the UI. This worked well and wasn’t too heavy on performance, even at higher resolutions, and the final game shipped with HDR screen support on Xbox One X and PlayStation 4 Pro.