Wooden H Studio is currently developing a PBR renderer for our Xbox One Engine Actus Dei. We ran into some issues with needing too many textures for our PBR assets. This is a quick breakdown of how we reduced the number of textures we needed for our PBR renderer.
Our initial PBR renderer used 6 textures for PBR, those textures being base color, normal map, metallic, roughness, ambient occlusion & emissive. This was a bit absurd, but it was my first time working with PBR rendering so I wasn't aware of the tools that the artists had for channel packing. After discussing the texture limitations with my Art Lead she told me that it was possible to pack the metal, roughness & AO into a single texture so that took us down to 4 textures, but that was still too much, so I decided to drop emissive support in the engine to keep us down to 3 textures.
It didn't stop there though, later in the project, we decided to do a night level for our demo and I (Joseph Whittington - Dev Lead) found it too limiting to ask the artists to avoid using emissive maps for a night level so I looked into ways of reducing the overhead of the emissive maps. After looking at the emissive maps for some of the emissive PBR assets I had for testing purposes, I noticed that the emissive maps were just the diffuse maps with some slight variation in color intensity.
After a quick brainstorming session with my Art Lead, Ashton Ritzel, we created a technique to reduce the data needed for emissive maps into a single channel by storing an intensity value that we map to the base color texture to use as the emissive color in the shader. We coined the technique "Albedo to Emissive Intensity Mapping" because that's pretty much all we're doing here.
On the art side, the artists need to simply use emissive maps that only use the base color, they can color in the emission the same as they normally would just with black and white, keeping in mind that only the intensity value will be stored. Then when exporting they need to take the greyscale color of the emissive map and pack it into the metal/ roughness/ ao map making it the new metal/ roughness/ ao / emissive intensity map.
On the dev side, we just need to use the alpha channel of the new mixed map to get the intensity of the emissive color and then multiply it by the albedo to get the emissive color then use it as we normally would.
The result is a limited, but basically free emissive map. This was more than enough for what we needed and I'm glad I had a chance to implement it. Although this technique is a bit limiting and needs some specific requirements to be met in order to be implemented, if you meet the requirements you can save a ton of memory by not having an emissive texture and you basically get emissive color for free.
By Joseph Whittington