|
Advanced Lighting
The Basic Lighting tutorial covered the lightmap rendering of level
geometry, but there's a lot more related to lighting in Max Payne that you
should be aware of. This article will explain how you can modify the
lightmaps and radiosity settings, how to make the lightmap rendering
process faster, and how the dynamic lighting works in
Max Payne.
Lightmaps
Let us start with a little recap: As you probably have already gathered,
the lightmaps are another texturing layer which is blended
multiplicatively with the actual texturing. The lightmaps are usually much
lower in resolution than the actual texturing and the color and luminance
of lightmaps is calculated with radiosity rendering. Here,
below left, you see rendered lightmaps. For demonstrative purposes this
picture is shown with bi-linear filtering off. Usually the lightmaps are
smoothed with bi-linear and the you see them as seen in the below middle
picture. When combined with higher resolution main texturing you get the
realistic Max Payne lighting (below right).
The definite key element with lightmaps is their resolution. The higher their resolution, the better and
sharper the looks, but also the longer the rendering times. The
resolution of a lightmap is given as texels per meter (textured element).
For example, you have a square polygon which is 4 meters by 2 meters in
size, the lightmap resolution of 4 will generate a lightmap on the surface
which is 16 by 8 pixels. If you raise the resolution to, say, 5 texels per
meter, you might still have a lightmap of 8x16 texels. Because of
compatibility reasons, the lightmaps are not scaled linearly. The lightmap
texel size only changes in powers of two giving the lightmaps dimensions
like 2, 4, 8, 16, 32, 64 and 128 (which is the maximum
size). In this example, the next jump in lightmap resolution comes when
you raise the resolution to 8, and this makes the lightmap on the polygon
to be 32x16 texels. This doubles the resolution, but quadruples the amount
of texels, thus making that polygon render four times longer than the one
with the resolution f 4. You should
first aim yourself to get an idea of what kind of results you will get
with different resolutions, and learn right from the start to use
lightmaps smartly, using absolutely as low-res lightmaps all around as
possible and increasing the resolutions only in
those places where you need the accuracy of light and shadow. For
comparison, most of the lightmaps in Max Payne were rendered with
resolutions of 4-6 texels per meter. You can change the lightmap resolution of a single polygon by
activating it (pointing at it) in F6-mode and pressing K. If you want to change the lightmap resolutions for
a whole object or multiple objects, go to F5-mode, select them
(CTRL-A for “All”), switch to F6 mode while the objects are selected, and press
SHIFT-K. The default lightmap resolution for new objects can be found
in the preferences under "Texture mapping" as "Lightmap res
txl/m" which will be used as resolution when new geometry is created. You can also set the lightmap resolution of polygons based on their
orientation. This is done
in F6-mode by pressing the mouse middle button (CTRL-SPACE
for 2-button mouse users) and selecting "Set lmres by normal".
This method too can be applied just to the objects you have selected (again, select them first in F5-mode),
or to the whole level by not selecting anything.
The dialog asks first the resolution for floors, then walls, then ceilings
(The resolution is interpolated for polygons not facing directly upwards,
sideways or downwards). This function is very useful because generally higher resolution
is only needed on the ground/floor and less while moving towards the
ceiling. For Max Payne we generally used values like 4/3/2 or 3/2/1, but
if you don't have multiple PC's to use as a rendering farm, you definitely
want to
use as low lightmap resolutions as you dare. Maybe 3/2/1 for final
renderings, and selectively higher resolutions for there where
specifically needed. In addition to the lightmap resolutions, there are other methods for speeding up the
rendering than just setting lightmap resolutions. Read Selective
Rendering and Radiosity Settings chapters in this article. Large surfaces can easily produce maximum sized (128x128)
lightmaps with high resolution, and these will take very long to render.
So, watch out for these unless you have a rendering farm at your disposal.
A method is provided for you to check that your lightmaps are of
reasonable size, but it is based on coloring the lightmaps to illustrate
their sizes, so unless you want to re-render everything, you should use a
temp-copy of your map for this. Again, you can do this to the whole map or
just a selection. In F6-mode, press the middle mouse button and
select "colorize lightmaps". 
Here
we have a picture of our level, with its lightmap resolutions set by the
polygons' normals. The room on the right has 20/15/10 and the one on the
left 8/4/2. 
Here
we have the level after colorizing the lightmaps. MaxED
colorizes small, compact lightmaps with darkish blue and huge, over-sized
ones with red. Shades of cyan, green and yellow are in between.
Selective rendering
For furthermore speeding up the rendering process, you can process the
lightmaps to your levels by rendering small portions of it at a time. Or
even one object or one polygon at a time if that is desired. Selective
rendering is especially useful for previewing lights, but you can
also do final renderings like this if you pay some attention to what you
are doing, and fix lightmap problems by hand if some occur.
To render just few objects from the scene, you select the objects in F5-mode,
and press R. To render a single polygon, you point at a polygon in F6-mode
and press R. So it renders the lightmaps only for the selected
objects, but does it take the surrounding objects and light emitters into
account when rendering those lightmaps? For example the lights coming out
from the neighbouring room? Well, you can decide this by the "hide
other objects" tick in the preferences. With this, you can make
MaxED to not take any other objects but the selected ones into account for
the lighting solution. Note that any hidden objects aren't included into
radiosity rendering in any case. Needless to say, rendering single polygons
while "hide other objects" is enabled results into pitch black lightmaps.
General radiosity settings
There are few radiosity-related settings in the MaxED preferences that you
should be aware of and that greatly affect the radiosity rendering quality
and speed.
The important settings
regarding radiosity rendering are:
- Radiosity viewport size. You can think of this as how
accurate the eyesight of the rendering process is. Every texel is
rendered so that a "camera" is set on it, and that camera
"looks" into all directions (these are the tiled pictures
that flash in the rendering process window) and based on what it
"sees", it sets the color and brightness of the texel. If you
have a very small viewport size, the pictures that the imaginary
camera takes are very small and only the biggest light sources and
surfaces can be made out of them, i.e. a small light relatively close
to an object might not cast light to it because the camera lighting
the objects surface doesn't "see" the small light. This
value affects only the first pass and possible other passes are always
rendered with minimum sized 32x32. The levels in the game have been
rendered with values between circa 80-150.
- Radiosity passes. In effect, the amount of times the light
bounces. With just one pass, the light is calculated simply from the
source to object surfaces. With two passes, a bounce from those
surfaces is further calculated, etc. The levels in the game have
been rendered with 3 passes.
- Radiosity boost and Intensity (not visible in the window, set per
light source). These two define the brightness of your lights.
Radiosity boost is the brightness that all light sources inherit, and
intensity (default 1.0 = 100%, i.e. full intensity) can be dropped to
tone down individual sources without affecting others. To understand
the purpose, consider this style: keep the radiosity boost high (maybe
as high as 250) so that you are able to cast concrete amounts of light
even with very small light sources, and when doing big light sources,
drop their intensity to avoid having them light up half the level. The
levels in the game have been rendered with values around 200.
- Radiosity backplane. The distance in meters the light remains
strong enough to affect. The levels in the game have been rendered with
maximum value.
- Average lightmap borders. Check this for a moderate speed
boost on rendering. The lightmap borders are then averaged instead of
proper calculation. More speed at the price of quality. If your
geometry is orthogonal you can put this on with practically no quality
loss. Any triangular polygons may produce darkish spots.
- Global lightmap res. Drop this slider to quickly set all
lightmaps down in resolution for the time of one render (after which
the slider is reset). Again, more speed, less quality.
Copy/pasting
lightmaps
This feature can be very useful sometimes. To elaborate, we'll have a go at the wall of our level with the
door and the light above it. In F6-mode, point at the wall to
activate it and press CTRL-C. 
Now
you have the lightmap in the clipboard and you can paste it to any
image-editing software (yes, or to another polygon). Below on the left you
see a magnification of this lightmap. It's tilted and flipped. That
happens and sometimes, in order to paste a lightmap on a polygon, you have
to first flip it around in an image-editing software and re-orient it so
that it comes out right. Since I'm about to just edit this a little and
then paste it back on the same polygon, We won't touch it's orientation.

On the right is the same lightmap after a bit of smudging. Again, it has
to be copied from the software, and in F6-mode pasted back to the
polygon. Here's the result: 
Keep
in mind that if you do this and re-render, regardless of what sized
lightmaps you have pasted where, all polys will be reset to their own
resolution and then rendered, so copy-pasting lightmaps is quite
risk-free, and even recommendable as a way to quickly fix small stuff
without having to render. This obviously also gives you a lot of freedom
to achieve effects that would be very difficult or even impossible to
produce by means of rendering. Another method for manipulating lightmaps
is to add extra light layer into the lightmaps. More info about this in
the Advanced Texturing article.
Dynamic lighting
In addition to the lightmaps, which are of course always static,
there's also a need for dynamic lighting. For example for lighting the
characters, the decals and dynamic objects, or for the lights emitted by
explosions and fires.
The characters are lit by setting up pointlights or spotlights.
The difference between them is that pointlights emit light to all the
directions, and spotlights have a lightcone defined. Neither of them
affects static geometry.
To set up a pointlight, you just create a pointlight entity in F3
mode (Press N and select "pointlight" from the dialog).
You can change the pointlight properties by selecting it and pressing enter.
You are going to need to experiment with the settings for a while to get
them right. As a rule of thumb, you should have a pointlight (or
spotlight) for every light source in the level. Note that pointlights,
like all the dynamic lights, don't get blocked by level geometry, except
the room boundaries (except when the light falloff reaches an exit, then
the pointlight in question will light characters in the other room as
well).

As a general tip, if your lightsources are very high above the floor,
it's usually a good idea to place the pointlights few meters below the
lightsources so that you won't need to make them insanely large.
To create a spotlight, just select an object that has light emitting
surfaces, press enter to get to the properties, and set the
"Export lights" flag on. You can see the spotlights' cones and
falloffs visualized by selecting View > Visualize lights. You
can alter the spotlight properties by pointing at the light-emitting
polygon in F6 mode, pressing middle mouse button and selecting
"Spotlight properties". A serious word of warning though; spotlights
are far more expensive framerate-wise, and it is suggested not to
use them unless it is absolutely required. Just as an example, there is
no single spotlight in use in Max Payne.
NOTE: There's a setting in levels.txt called "AmbientColor",
this is an RBG value defining the level of ambient character lighting.
It is the first setting you should select for your level before starting
to set up dynamic lights. Naturally it should be roughly as low as the
most low-lit parts of your level.
As mentioned before, pointlights and spotlights also affect dynamic
objects if so desired. Normally, if the DO doesn't have lightmaps,
pointlights will affect the DOs dynamically. Below is a picture of two
shooting-range cardboard figures. They are DOs, and positioned
differently in the relation to the pointlight, so you can see how the
pointlight illuminates the cardboard behind it, but not the one in front
of it. If you animate the cardboards, you can see it moving in and out
of the light correctly.
 In the object properties for
DOs
there's a flag called "Lightmapped", and if you set it on,
lightmaps will be created on the dynamic object when you do radiosity
rendering. When the DO has lightmaps, it will not get affected by
pointlights, unless you also set the "Pointlights affect" flag
on. But if you do that, you need to modify the lightmaps of the object
to be a lot brighter than they otherwise should be in order to make it
look good. Most DOs in Max Payne were using lightmaps but were not
getting affected by pointlights.
You can also make the dynamically lit objects to appear more round
and smooth by using gourad shading on the desired polygons. This is
applied the same way you turn on lightmap smoothing; by adding a
polygroup and turning on "Smooth lightmaps" for them. If you
turn it on while the polygons don't use lightmaps, it will cause them to
gourad shading instead.

Note however that you have to switch in and out of the
rendering mode (F2) in order for MaxED to visibly switch from flat
shading to gourad shading and vice versa. More about polygroups in the
Advanced Texturing article.
Particle lights
Then there's still particle lights. In short, these are dynamic
lights that affect all the characters and DO's, but also the static
geometry. Most obvious example light emitted from explosions. All the
effects in "particles.txt" that are prefixed with
"Light_" are effects that include only a dynamic light effect.
For more info about how to make your own particle lights, refer to
ParticleFX tutorial.
|