|
Advanced Texturing
With this article you are going to learn more issues mainly about texturing.
It is strongly recommended that you get yourself acquainted with basic MaxEd use. These
issues are covered in Basic tutorials section of this document.
Alpha texturing
Like any modern 3D engine, Max Payne technology supports so
called alpha blending. In alpha blending, another texture (called alpha
map) is attached to main texture to define the amount of transparency
desired for the main texture. Alpha maps are usually grayscale images
where the light value of the pixels defines the amount of transparency. In
MaxFX, white is fully opaque and black is fully transparent, and all the
tones of gray are in between with different levels of semi-transparency.
Using alpha map is easy. First you have to have a texture map
and a separate image to be used as the alpha map. When you make
your own textures, remember: Even if an alpha map is usually a
grayscale image, you can not use 8-bit JPEG (grayscale) format to save
your files, as MaxED can not open them correctly. If
you use JPEG format, use normal full color RGB format or even better, grayscale
PCX format. RGB JPEG images will not use the possible color data, only the value of the
pixels will affect the transparency.
To add an alpha map to texture, you have to right-click the main texture in the material
palette and select "Add alpha layer...". Then just browse and pick
up the appropriate texture map.
Once added, the thumbnail image of the texture visualizes the
amount transparency with diagonal striping showing through the actual main
texture. Now you can use the texture as usual in your modeling.
If the alpha map is of different proportions or resolution than the
actual main map, MaxED scales the alpha to fit the main texture. Generally
it is best to keep the maps same size.
The biggest problem with alpha blending is that they can not be sorted
with Z-buffer. Instead, a separate sorting algorithm has to be applied to
alpha polygons and this is very slow, a single alpha blended polygon can
take as much time as drawing hundreds of normal polygons. Furthermore,
the sorting algorithm is not perfect. Especially when alpha blended
polygons "cross" it might make wrong decisions and the polygons
would be drawn in incorrect order, bringing something that is supposed to
be behind to "pop" in front of something else.

Here we have a classic low-polygon-yet-complex-looking-plant, which is constructed by placing two alpha blended
polygons with profile of a plant into cross like shape. Atypical
problems with "normal alpha" sorting are clearly visible (see
the middle of the plant). Like in here, even a small change in the
viewing angle might make the polygons pop in front of each
other and back again especially where the polygons cross.

To help the sorter, you can split the polygons from
the crossing point. This usually brings good results, but produces also
a lot more polygons to be sorted, which again is very bad speed-wise.
Alpha test
You can find a menu item called alpha test from the
material pop-up palette, which can be turned on or off for alpha blended
materials. The name, alpha test, refers to the technique which is used
to determine the transparency of the alpha blended pixels. To fully
understand the the difference between "normal" alpha and alpha test requires some
extensive technical explanations which we'll skip now.
However, in short, alpha test is originally designed to be used with
alpha maps which have clear on/off situation, like a row of bars or wire
fence. The good thing about alpha test is that they are sorted with
Z-buffer, which makes them very fast to draw, pretty much as fast as any
opaque polygon drawing and also no popping like in
traditional alpha should occur.
What is special about alpha test inside Max-FX is that you have a
chance to set the alpha test reference value. That is the grayscale
(0-255) value which is used to determine the threshold, i.e. the value
where the alpha is considered as fully opaque or fully transparent in
sense of the sorting. You
can set this value as general value in MaxEd from the local preferences.
Inside game, this value is checked from the materials.txt file and it can
be separate for each material category.
Interesting here is that alpha test reference value does not simply define an absolute value where the transparency is on or
off. For example, if we set the reference value to 128, the values below
it will be cut off (not drawn), but the values between 128-255 are
semi-transparent as usual. So, what is the problem? Why not turn the
reference value all the way down to 1 and have the full scale of
transparency in use?
On top of normal geometry that would work -- the "absoluteness" of the
value is mostly visible when two alpha test -textured polygons go on top of
each other. Because the way Z-buffer operates, having two alpha
polygons on top of each other might "overshadow" the one
behind and even the lightest transparency might leave the further alpha
test indrawn. Study the pictures below to learn more.
Note: As said, MaxED shows all materials using the same reference
value, which can be adjusted from the local preferences. Remember, that
MaxED can not change the alpha test ref -value runtime, you change only
takes effect after quitting and restarting MaxED.
Here on the left you see an example of alpha blended plant
(alpha
test on, of course) with high reference value (254). This plant is not
an good example of proper use of high threshold, as the plant with it's
curved forms requires much bigger resolution for the alpha map, which
also is not designed with this level of threshold in mind. However, it demonstrates
how there is no semi-transparency visible. With this threshold, orthogonal
metal bars or a very systematic wire fence with much smaller unit size
(thus higher resolution) would be much better example.
On the right is the same view with medium alpha reference
value of 128 which seems to be bring very good results: the plant seems
to have much higher resolution, it blends to the background to some
extent and even consecutive
alpha maps do not bring too obvious "rims" (see below).
Here above we have the same plant again with low alpha
test reference value (5). This introduces "no-draw rims" to
some areas where consecutive alpha maps are visible (as you see, the blending with normal geometry
works perfectly with nice semi-transparency). The arrow points to
problems that might occur and sometimes seem very obvious: the drawing order of
the two transparent polygons
inside the Z-buffer makes the first alpha test polygon to overshadow
the drawing of the second alpha map, which does not "kick
in" before the alpha map reaches the value below the reference
value of 5. This problem is visible only when the polygons happen to be
in certain order. In the middle the polygons cross and and the left side
works correctly (as the drawing order changes).
Naturally it is always best to try to avoid semi-transparency and consecutive
alpha test polygons. How big of a problem it really is, depends. If, for instance, you have an alpha test blended window
and you look through it to to a room filled with alpha test plants, by
chance, they might be drawn in the right order and look perfect, or then
the plants might completely disappear. Unfortunately there is is no way to
know or control in which order the polygons are drawn in Z-buffer and
how they might or might not overshadow each other.
So, to the question "Should alpha test be on?" Answer is "Yes, almost always".
The fact is, that you are mostly better off with alpha test because of
the speed and sorting being solved. And as long as you do
not place many lightly opaque alpha mapped polygons with low reference
values into same room, you should not even see much drawing problems and
they mostly are much less obvious than the annoying sorting problems of the normal alpha
blending.
Alternative blending methods
In addition to alpha blending and alpha test, Max-FX offers two more
possible ways to do a sort of a transparency: additive and multiplicative
blending. Both blending methods can be assigned to a polygon that has any
material (except with already alpha blended texture). In other words,
multiplicative and additive are qualities of polygons, not
materials. If you are acquainted with some 2D graphics software, you might
know the blending methods with the names 'screen' for additive and
'multiply' for multiplicative.
Multiplicative blending can be assigned to a polygon by pointing
it in the F6 (texture) mode and by pressing M. In multiplicative
blending, the texture is mixed to background so that it can only darken
what is behind. The texture of the polygon is handled so that white is
fully transparent and black is fully opaque. The darker the color is, the
more it affects and if the texture has colors, each RGB channel affects
accordingly.
Additive blending can be assigned to a polygon by pointing it in the F6
(texture) mode and by pressing A. In additive blending, the texture
is mixed to background so that it can only lighten what is behind.
The texture of the polygon is handled so that black is fully transparent
and white is fully opaque. The paler the color is, the more it affects and
if the texture has colors, each RGB channel affects accordingly.
You can turn polygons with either blending methods back to normal solid
geometry by pointing it and pressing S. Neither multiplicative or
additive blended polygons have lightmaps usually returning to solid requires re-rendering of the
lightmap. You should also notice, that usually copy/pasting objects with
multiplicative or additive polygons will turn them into solid rendering
mode.
Dualsided or not?
Transparent materials are often used in places, where both front and
the back sides of the polygon should be visible. Rarely, you might also
create something non-alpha geometry, which you would like to appear to have both sides. In these situations, you
might consider tagging dualsided flag on by
right-clicking the texture. This will remove the backface culling from
that material, and in other words, make it to be rendered as
dualsided.
Polygons textured with dualsided material (alpha blended or not) have
lightmaps as any other polygons do, and the lightmaps are combined with main
texturing as usual. You should notice, that there is only one
lightmap, which is calculated during radiosity rendering according to the
normal of the polygon (just like the normal single sided ones). This might
sometimes raise lighting problems. Think of having an alpha blended dualsided wire fence in the middle of
a room where the other side of the room has all the light. If the normal
of the fence polygon is pointing towards the bright side when the
radiosity solution is rendered, the fence might appear too bright when the
player goes to see it from the darker side (or vice
versa, naturally).
The solution could be to take the dualsided flag off
from the material and manually construct two polygons on the same spot
with the other's normal pointing towards the dark side and the other to
the light side, thus producing a separate lightmap for both sides. In this
case, the dualsided can not be on, or these two polygons will interfere
with each other producing heavy-duty Z-fight.
Quite often happens that same material is needed sometimes
as dualsided and sometimes not. A good solution is to create a copy of the
material and have the other as singlesided and the other as dualsided.
MaxED can handle these multiple instances of an material without using
extra texture memory.

Would it not be useful to turn everything dualsided
and never worry the directions of the polygon normals? Here we have an
example: backface culling is very useful feature, as in average, half of
the polygons that make an object are automatically optimized. The object
on the left is single-sided, and only the polygons that are visible are
drawn. The object on the right has dualsided on, and all of it's
polygons are always drawn, even if that does not bring any visible
change. Dualsided polygons may also be problematic with collisions, as
the collisions are only checked against the polygon on the side that the
normal is pointing.
Planar mapping
In addition to more single polygon based texturing functions, MaxED offers the
possibility to use sometimes irreplaceable technique called planar
mapping. With planar mapping, you can project a texture to selected
group of polygons that can be in almost any angle. Imagine that you would
cast an image with a slide projector to an uneven surface and freeze that
image as a texture.
Planar mapping requires the desired polygons to be a part of a polygroup.
To define a polygroup, you have right-click the desired object (or a room)
in the hierarchy list and select create polygroup. A question is
presented where you have the chance to automatically include all the
polygons under that hierarchy into the polygroup. The polygroup object
appears under the object (or a room) that it belongs to and is sorted on
top of the list. After creation, the polygroup indicates the amount of
polygons currently in the group in brackets. You can select or deselect
only polygons that belong to object that the polygroup is directly
attached to or objects that are in the same level or lower in hierarchy.
Selecting and deselecting polygons happens by first activating the name of
the polygroup in the hierarchy list and then clicking polygons in texture
(F6) mode while pressing shift. Selected polygons are shown with green
translucent highlight.
After the desired polygons are selected, while the polygroup still
active in the hierarchy, press N to enter planar mapping mode (you
have to be in the F6 mode still).
Now doing usual texturing operations for one polygon affects all
polygons in the group. The direction of the planar mapping is the normal
of the polygon which you manipulate. You can rescale, rotate etc. As you might notice,
in some cases you may have to move the texture a bit for the texturing to
be updated in the other polygons. Avoid pressing LMB unintentionally, because
that will be considered as reset, and the mapping goes back to default
scale.
Here we have an example with a strange half-sphere bump on the
floor. The floor and the sphere have been assigned to a polygroup and when
the floor is textured in planar mapping mode, the same texture is
projected to the polygons of the sphere. Study the example level to learn
more. For instance, go to F6 mode, activate the polygroup from the list,
press N and move the texture on the floor.
More about polygroups
This is not actually a texturing issue, as polygroups can do some
other things too: They can be used to make the meshes appear smoother. This is
handy option especially for all round objects, like pillars, barrels or
spheres.
After selecting the smoothed surfaces with polygroup (for instance,
the sides of a barrel), right-click the polygroup name in the hierarchy
list and select smooth lightmaps to make the rendering (normal
rendering, preview will not work) to smoothen the lightmap edges to
appear more like the barrel would be truly round.
Sometimes, you might also want to make the mesh itself appear
smoother and then you can select Smooth geometry from polygroup
properties (right-click). This will not be visible inside MaxED, but the
game engine will create a subdivision surface solution of the surface
(the game's geometry detail level must be set to high).
You can study the different properties of subdivision by changing the
Set max angle and Set max edge length values from the
geometry smoothing submenu (under the RMB menu of a polygroup). Max
angle basically will make the subdivision to occur, if some angle in the
polygroup area is more than the given value. Max edge length will make
the surface to be subdivided, if polygon edge is longer than the given
value.
Smooth surface can easily make very big amount of polygons, and you
should carefully think that where to use it and to what extent. Although
subdivided polygons are not very expensive rendering-wise, each polygon
added brings always a little more slowdown.
Light layer
Light layer is a small special feature in MaxEd, which was mainly
designed to help creating large outdoor buildings (at night with lit
windows). Light
layer is an additional texture which is attached to material, but it
is not something that
is applied in-game like lightmaps or detail textures. Light layer is
basically an additional mapping which can be used easily to modify
lightmaps by applying them after radiosity rendering in MaxED before
exporting the the level.
The light layer can be added to a material by right-clicking it from
the material palette and selecting Add light layer.... This let's
you pick a texture for the light layer. The light layer is visible and can
be modified in light layer rendering mode, which can be toggled prom the
preferences (Ctrl+P) or by toggling it from the numpad division (/) -key,
which cycles through different mapping methods.
You can use normal texturing operations to light layers (rotate, scale,
copy mapping coordinates etc.). Note that it can be of completely
different proportions than the main texture. Usually, for large outside
buildings, it is wise to make light layer to repeat much less (ie. larger)
than the actual texture, to give the sense of main texturing not tiling so
much.
Here we have a rendered room with a repeating light-like wall
texture (top left). A special light layer texture is made, attached and textured to the surface so that repeats only every
fourth time than the actual texture does (top right). Then, the light
layer is applied to the lightmaps (below left), which gives us the final
appearance (below right).
Light layer is calculated to the actual lightmap by either selecting
the single polygon in F6 mode and picking Add light layer to
lightmap. Alternatively by first selecting all the desired objects in F5
mode, then going to F6 mode and applying "add light layer to
lightmap" on one of the light layered polygons, like before, will add all
the light layers in all the objects that were
selected. This option is naturally available only if there is a light
layer in the texture that is pointed in the F6 mode.
Light
layer modifies the actual texture so that mid-gray does not change
anything, full white makes the lightmap texels completely white and black
completely dark. Any color values will also give similar results (ie. full
red will make the lightmap full red). Usually rather modest color changes from mid-gray will
give good effects. Study the example above and see how it affects the main texture once applied.
|