Since the last update there have been two significant improvements made to the deferred render manager. The first of these improvements is proper support for alpha blended (semi-transparent) objects. To accomplish this the render manager splits all registered render priorities into two types: deferred and forward. Any object with a deferred render priority will be drawing using deferred shading, while objects with a forward render priority will be drawn using forward shading. What the deferred render manager considers a forward or a deferred render priority is user configurable.

The second improvement to the deferred render manager is proper support for heavy portals. A heavy portal is any portal that requires the scene behind that portal to be rendered to an off-screen buffer. Two methods were considered for adding support for heavy portals. The first method was to reuse the GBuffer for each heavy portal and output the results to a unique off-screen buffer. The second method was to create a unique GBuffer for each heavy portal. The drawback of the first approach is that, due to hardware constraints, the off-screen buffers must match the resolution of the screen. In most circumstance this is a waste of memory since portals rarely fill the entire screen. However, this potential waste of memory is dwarfed by the memory overhead of having a unique GBuffer for each portal. As a result, I decided to use the first approach.

rm_unshadowed rm_deferred
rm_unshadowed rm_deferred

The above pictures show a scene with proper rendering of alpha blended objects. Namely the blue crystal and the fire particles are properly being blended with the rest of the scene. Note that they do not appear in the GBuffer since they are rendered after deferred shading is done. This scene also contains a heavy portal behind the blue crystal. Through this portal you can see a blue pillar and some alpha blended flames.