Frostbite Rendering Architecture and Real-Time Procedural Shading and Texturing Techniques
Posted March 13 10:45 PM by Richard Fine
This was an hour-long session presented by Natalya Tatarchuk from ATI and Johan Andersson from DICE. Natalya opened with a brief review of procedural textures, enumerating some of their benefits - they're smaller, resolution independent, and often don't require UV coordinates to be created and stored - and then handed over to Johan who spoke about the details of DICE's Frostbite rendering engine, the next-generation engine they are using for Battlefield: Bad Company. After showing us a trailer for the game - rendered in-engine - Johan dove into the architecture of the engine.
All rendering systems in Frostbite - be they characters, buildings, vehicles, terrain, etc - all make their render calls via a platform-independent "shader subsystem." This subsystem is responsible for handling all the shaders used by the game, managing combinations and state switches. Rather than explicitly dealing with vertex or pixel shaders, Frostbite has the more general concept of a "surface shader," as per the Renderman terminology. These shaders are graph-based, such that they can be built by artists who drag and drop components onto a canvas and wire them together; the system then takes care of generating appropriate vertex and pixel shaders from the graph.
Two particular features were noted to help them manage the growing complexity of some of the shaders. Firstly, a generic "script node" exists in their system, allowing them to replace the really in-depth mathematical constructions - things that would be painful to achieve with the building blocks approach - with text-based scripts (appeared to be in HLSL). Secondly, they have the concept of 'instance shaders' - shader graphs that can be packaged as a single node and used in other graphs. Johan showed an example of a 'general purpose material' node that had a large number of inputs and a fairly involved graph network inside it.
Johan also showed off the terrain texturing system, using a technique he referred to as "procedural shader splatting" - like regular texture splatting, it seems, but using procedural shaders instead of regular textures - and he also showed off the undergrowth rendering which is achieved using instancing.
Natalya returned to the microphone to finish the talk with a brief demonstration showing realtime procedural rendering of a snow effect over a mountainscape, using fractional Brownian motion noise to generate displacements.