Programming Projects -->
Block Engine -->
Block Arena uses shadow maps as
one if its lighting techniques.
These shadow maps are computed by the program
by shooting rays into the world
from light sources.
We will describe some of the pros and cons
for different lighting solutions.
The simplest way to deal with lighting is to have
So that this doesn't look completely aweful,
it is a good idea to shade each quad
bassed on its surface normal.
That is, pick 6 different brightnesses.
These will correspond to the directions
top, bottom, from, back, left, and right.
This creates contrast so edges are more pronounced.
Simple Dynamic Lighting
In Block Arena, individual 1 by 1 quads are not rendered.
Instead, n by m quads are rendered.
See the Quad Algorithm
for a description of this.
On the other hand, in a block based game that
renderes individual 1 by 1 quads, there is a simple
way to handle the lighting situation:
color each vertex sent to the graphics card.
This has the advantage of having lighting be dynamic
with no additional cost.
The color of a vertex can be updated
whenever a change occurs locally that could
affect lighting, such as the addition
or removal of a block.
Static Lighting With Shadow Maps
Since Block Arena renders n by m quads instead of
1 by 1 quads, coloring vertices for lighting is
not going to cut it.
To handle this situation,
shadow maps are used.
Every quad is assigned to a portion of a shadow
Each 1 by 1 block face should correspond to somewhere between
a 1 by 1 and a 3 by 3 patch of texels in a shadow map.
Larger quads take up larger patches of texels, etc.
There are various issues that need to be addressed here.
For example, there is the problem of chopping a shadow map
into pieces (as if with a cookie cutter)
so each piece can be used to shade a different Quad.
Since we are only dealing with blocks, this is much less of
a headache than the full 3D-version (which is done
in a Quake-Style map creator).
Because of this issue, it would be very annoying to
impliment the ability to dynamically
add and remove blocks
(adding or removing will completely change the shadow maps).
That is, parts of shadow maps would have to be
Updating Lighting When Blocks Change
Regardless of whether shadow maps are being used or
vertices are being colored,
unless we are planning to recompute lighting
information every frame, we need an efficient
way to deal with lighting whenever a block is
added or removed.
If a block is added, this may cause other
blocks to be put in a shadow.
If a block is removed, this may cause light to
hit a block that was previously in a shadow.
We will describe a method for dealing
with this problem.
Given every point light and point on a block surface
close enough to the light to be affected,
consider the line segment between these points.
We may refer to the "block end" and "light end"
of this line segment.
Associate each such line segment with every position
in the world (whether there is a block there or not)
that it intersects.
If a block is added and that block intersects
one of these line segments,
then the block end of the line
segment is now in a shadow.
If a block is removed and that block intersects
a line segment, then the block end of the line
may no longer be in a shadow.
This algorithm is fast at runtime.
The downside is the huge amount of memory it requires.