Game Development Reference
Tiled Forward Shading: Why?
The main strength of deferred techniques, including tiled deferred shading, is that
over-shading due to over-draw is eliminated. However, most deferred techniques
suffer from the following weaknesses when compared to forward rendering:
Transparency/blending is tricky, since traditional G-buffers only allow stor-
age of a single sample at each position in the buffer.
The memory storage and bandwidth requirements are higher and become
Forward rendering, on the other hand, has good support for
transparency via alpha blending,
MSAA and related techniques through hardware features (much less mem-
ory storage is required).
In addition, forward rendering trivially supports different shaders and materials
for different geometries. Deferred techniques would generally need to fall back to
ubershaders (or perform multiple shading passes).
A special advantage for tiled forward shading is its low requirements on GPU
hardware. It is possible to implement a tiled forward renderer without compute
shaders and other (relatively) recent hardware features. In fact, it is possible
to implement a tiled forward renderer on any hardware that supports depen-
dent texture lookups in the fragment shader. On the other hand, if compute
shaders are available, we can take advantage of this during, say, light assignment
In the following sections, we first present a tiled forward shading renderer
to which we add support for transparency, MSAA and finally experiment with
having a few different shaders for different objects. We compare performance
and resource consumption to a reference tiled deferred shading renderer and show
where the tiled forward renderer wins.
Basic Tiled Forward Shading
We listed the basic algorithm for all tiled shading variants in Section 4.2. For
clarity, it is repeated here including any specifics for the forward variant.
1. Subdivide screen into tiles
2. Optional: pre-Z pass—render geometry and store depth values for each
sample in the standard Z-buffer.
3. Optional: find minimum and/or maximum Z-bounds for each tile.