Game Tech: How BioShock Infinite's Lighting Works 55
An anonymous reader writes "The Principal Graphics Programmer for BioShock Infinite has put up a post about how the game's lighting was developed. We don't usually get this kind of look into the creation of AAA game releases, but the studio shut down recently, so ex-employees are more willing to explain. The game uses a hybrid lighting system: direct lighting is dynamic, indirect uses lightmaps, shadows are a mix. 'Dynamic lighting was handled primarily with a deferred lighting/light-pre pass renderer. This met our goals of high contrast/high saturation — direct lighting baked into lightmaps tends to be flat, mostly because the specular approximations available were fairly limited.' It's interesting how much detail goes into something you don't really think about when you're playing through the game. 'We came up with a system that supported baked shadows but put a fixed upper bound on the storage required for baked shadows. The key observation was that if two lights do not overlap in 3D space, they will never overlap in texture space. We made a graph of lights and their overlaps. Lights were the vertices in the graph and the edges were present if two lights' falloff shapes overlapped in 3D space. We could then use this graph to do a vertex coloring to assign one of four shadow channels (R,G,B,A) to each light. Overlapping lights would be placed in different channels, but lights which did not overlap could reuse the same channel. This allowed us to pack a theoretically infinite number of lights in a single baked shadow texture as long as the graph was 4-colorable.'"
Re:Who gives a fuck (Score:2, Informative)
Ignoring the obvious performance issues you can't make any substantial changes to the behavior of the engine. Take a look at most games shipped with Unreal and you'll see they use different middleware (audio, pathfinding + others) to what is in the shipped engine. This is not something which can be practicably done via UnrealScript. Even if you could manage to make it work the performance will be appalling. Transitions between UnrealScript and native code are expensive.