You are on page 1of 12

# The Generation and Display of Normal

## Maps in 3ds Max

Contents
Overview ................................................................................................................................................. 2
Introduction to Normal Maps .............................................................................................................. 2
Creating and Rendering Normal Maps (Baking and !ading" ................................................................ 2
Applications #or Creating Normal Maps ............................................................................................... \$
Creating Normal Maps in \$ds Ma% ....................................................................................................... \$
Controlling !ow Normal Maps are displa&ed in t!e \$ds Ma% 'irect\$' (iewport .................................. \$
Importing Normal Maps into a )ame *ngine ....................................................................................... +
Normal Map ,ork#lows....................................................................................................................... +
-ec!nical 'etails ..................................................................................................................................... .
-angent pace/ Ob0ect pace/ and ,orld pace ................................................................................... .
-angent pace ..................................................................................................................................... .
Aside1 Binormal versus Bitangent ..................................................................................................... 2
-angent pace per (erte% .................................................................................................................... 2
'&namic Computation o# Binormal ...................................................................................................... 2
plitting at moot!ing )roup and Map eams ..................................................................................... 2
Ort!ogonali3ation o# t!e -angent Basis (ectors ................................................................................... 4
Appendi%1 5ow \$ds Ma% Renders Normal Maps ...................................................................................... 4
Appendi%1 5ow \$ds Ma% Computes -angent and Binormal (ectors ......................................................... 6
Appendi%1 5ow Ma&a Renders Normal Maps ........................................................................................... 7
Appendi%1 5ow !aders are a##ected b& t!e c!anges in \$ds Ma% 2899 5:9 .............................................. 7
:.A.;. .................................................................................................................................................... 98
:or More In#ormation ............................................................................................................................ 98
Re#erences ............................................................................................................................................ 99

Overview
Introduction to Normal Maps
A normal map (or normal bump map" is a te%ture t!at w!en mapped to geometr& de#ines t!e normal
vector o# a corresponding point on t!e sur#ace. -!is a##ects !ow eac! s!ading point (pi%el" re#lects lig!t
w!en rendered. A common tec!ni<ue used b& \$' artists is to use !ig!=resolution normal maps/ applied
to low=resolution geometries to create t!e illusion o# more sur#ace detail or better curvature. >9?
-!is process o# appl&ing a !ig!=resolution normal map to a low=resolution model is called normal bump
mapping >+? or simpl& normal mapping >2?
9
. -!e di##erence between normal bump mapping and bump
mapping is t!is1
Bump mapping use a gra&=scale map to encode normal !eig!ts.
Normal bump mapping (normal mapping" uses a #ull color map to encode t!e normal vector.
-!e %/ & and 3 components o# t!e normal vector are stored in t!e R/ )/ and B c!annels o# t!e
map.
Normal mapping is especiall& use#ul #or real=time displa& devices suc! as game engines #or two reasons1
9" It re<uires less geometric data to be loaded onto displa& device memor&. It does !owever
re<uire additional storage #or t!e map !owever t!is tradeo## usuall& is a signi#icant
improvement.
2" Man& )@As support t!e application o# normal maps as a s!ader
-!e idea o# taking geometric details #rom a !ig! pol&gon model was #irst introduced in B:itting moot!
ur#aces to 'ense @ol&gon Mes!esB b& Cris!namurt!& and Devo&/ @roc. I))RA@5 9772 >\$?/
-!e term normal re#ers to t!e mat!ematical term normal vector w!ic! is a normali3ed (unit lengt!"
vector perpendicular to a sur#ace point.
,!en using t!e Dambertian model >92? #or di##use lig!ting normal are used as #ollows1 t!e unit vector
#rom a pi%el to t!e lig!t source is dotted wit! t!e normal (as a unit vector"/ and t!e result is t!e intensit&
o# t!e lig!t on t!at sur#ace.
Creating and Rendering Normal Maps (Baking and Shading
-!ere are two distinct processes related to normal maps1 creating (baking" and rendering (s!ading".
-!ere is no universall& accepted process #or computing a normal map. Almost ever& application !as a
di##erent mec!anism. Man& applications compute normal maps in tangent space
2
but di##er in !ow t!e&
compute t!e tangent basis vectors t!at de#ine tangent space >.?.

9
-o add to t!e con#usion some tutorials on t!e internet use t!e term Ebump mappingF w!en t!e& mean Enormal
bump mappingF/ and not t!e older tec!ni<ue o# Ebump mappingF using gra&=scale maps.
2
Occasionall& tangent space is re#erred to as te%ture space >6?
,!ile t!ere is no one single globall& agreed upon met!od #or computing t!e tangent space/ w!at is
important is t!at t!e algorit!m used #or creating and rendering t!e normal map are=in agreement.
Applications !or Creating Normal Maps
Normal maps can be created in a number o# di##erent applications. ome application t!at &ou can use
include (listed alp!abeticall&"1
3D-Coat = !ttp1GGwww.\$d=coat.comGwikiGinde%.p!pG7.98H-e%tureHbakingHtool
AMD / ATI Normal Mapper (end o# li#e" =
!ttp1GGdeveloper.amd.comGarc!iveGgpuGnormalmapperG@agesGde#ault.asp%
7A.8\$:A9=*2B9=+*28=76+B='AC7A'6AB4A=227\$.!tm
Autodesk Maya =
Hwit!Ht!eH-rans#erHMapHtool.!tm
Autodesk Mudbox =
+22.=B24B=28\$+CC:':79=966.!tm .
Autodesk Softimage
reatingBumpMaps.!tm
Bleder = !ttp1GGwww.blender.orgGdevelopmentGrelease=logsGblender=2\$2Gnormal=mapsG
Ciema !D No" = !ttp1GGplanetpi%elemporium.comGtutorialpagesGnormal.!tml
N#idia Texture Tools for Adobe \$%otos%op = !ttp1GGdeveloper.nvidia.comGnvidia=te%ture=tools=
&Normal = !ttp1GGwww.%normal.netG9.asp%
'Brus% = !ttp1GGwww.pi%ologic.comGdocsGinde%.p!pGCreatingHNormalHMaps
Creating Normal Maps in "ds Ma#
Normal maps are created (baked" using t!e Render to -e%ture #eature o# \$ds Ma%. :or more in#ormation
see t!e topic ECreating and Asing Normal MapsF in t!e \$ds Ma% !elp >+?.
\$ds Ma% uses a di##erent met!od to compute and render normals maps #rom t!e met!od used b& ot!er
Autodesk applications suc! as Ma&a and Mudbo%. -!e& primar& di##erence is in !ow t!e& compute t!e
tangent basis vectors.
Controlling how Normal Maps are displa\$ed in the "ds Ma# %irect"% &iewport
As o# \$ds Ma% 2899 5:9 a switc! was introduced to t!e INI #ile allows &ou to control !ow t!e 'irect\$'
driver #or t!e viewport renders normal maps. -!e de#ault be!avior was also c!anged so t!at t!e
viewport and t!e render to te%ture #eature were consistent in !ow t!e& created and s!aded normal
maps.
-!e legac& be!avior o# \$ds Ma% (pre \$ds Ma% 2899 5:9" was to displa& normal maps created in Ma&a (or
Mudbo%" correctl&.
-!e new de#ault be!avior is controlled e%plicitl& in t!e \$dsma%.ini #ile using1
>(iewportNormalMapping?
(iewportNormalMapping-&peI;uali#iedGDegac&
-!e current de#ault be!avior is called E;ual#iedF.
Nitrous/ w!ic! is t!e de#ault driver #or t!e \$ds Ma% viewport in \$ds Ma% 2892/ be!aves as i# t!e
(iew@ortNormalMapping-&pe is set to Degac&. -!is means t!at normal maps created in Ma&a or
Mudbo% will render correctl&.
Importing Normal Maps into a 'ame (ngine
-!e #ollowing articles discuss t!e import o# normal maps into game engine1
Crysis = !ttp1GGsdk.cr&mod.comGdispla&G'C'OC\$GNormalJMaps
(ity = !ttp1GGunit&\$d.comGsupportGdocumentationGManualG5O,-O=Normalmap.!tml
(real )gie = !ttp1GGudn.epicgames.comG-!reeGCreatingNormalMaps.!tml
Normal Map )ork!lows
-!e single most important t!ing to reali3e about normal maps is t!at &ou !ave to make sure t!at t!e
application &ou use to create (bake" t!e normal map/ and t!e application &ou use render (s!ade" t!e
normal map are in agreement about t!e met!od #or computing t!e normal maps/ especiall& t!e
tangent=space basis.
o i# &ou want to normal maps baked in \$ds Ma% to appear correctl& in a game engine &ou !ave to make
sure t!at t!e game engine s!ader computes t!e tangent basis vectors in t!e same wa& t!at \$ds Ma%
does.
Normal maps created in Ma&a or Mudbo% can be displa&ed in t!e \$ds Ma% 'irect \$' viewport even
t!oug! t!e algorit!m is di##erent b& setting a variable in t!e \$dsma%.ini #ile (see t!e #ollowing topic
EControlling !ow Normal Maps are displa&ed in t!e \$ds Ma% 'irect\$' (iewportF".
Because t!e algorit!m used #or computing t!e normal map !as to be paired wit! t!e appropriate
algorit!m #or rendering a normal map it can be convenient to t!ink o# t!e creation and application
algorit!ms #or a normal map as a codec (coder G decoder" pair.
Asing t!e codec analog& t!e #ollowing diagram demonstrates !ow normal maps created in \$ds Ma% or
Ma&a can be displa&ed correctl& in t!e \$ds Ma% viewport or a game engine.

*echnical %etails
-!is section o# t!e w!ite paper #ocuses on t!e tec!nical details o# baking and rendering o# normal maps/
aimed at a tec!nical audience.
*angent Space+ Ob,ect Space+ and )orld Space
In most modern application/ generated normal maps are stored in tangent space/ also called texture
space. Alternative modes o# representing normal maps include ob0ect space and world space. -!is w!ite
paper talks e%clusivel& about tangent space/ but it is #undamental t!at &our baking algorit!m and &our
*angent Space
Dig!t ra&s are in world space/ but t!e normals stored in a normal map are usuall& in tangent space. -!us
w!en a normal=mapped model is being rendered/ t!e lig!t ra&s must be converted #rom world space
into tangent space/ using t!e tangent basis >9?.
-!e computation used to establis! t!e tangent basis at a speci#ic s!ading point (pi%el" must also agree
#rom t!e s!ader to t!e normal map generator.
-!e tangent=plane basis vectors are t!e binormal (or bitangent" and t!e tangent. -oget!er t!ese de#ine
a two dimensional plane t!at strictl& speaking an&wa& s!ould be ort!ogonal to t!e normal. ome
s!aders and normal map generation algorit!ms/ suc! as t!e ones used in \$ds Ma% and recommended in
N(I'IA developer documentation >9\$? omit t!is point.
Aside- Binormal versus Bitangent
A minor point/ but one t!at can con#use some con#usion i# consulting t!e mat!ematical
literature on tangent space is t!e #act t!at w!at is called t!e binormal in t!e normal map
literatures is according more accuratel& >9+? >9.? called t!e bitangent. :or t!e sake o#
consistenc& wit! t!e convention in t!e \$' grap!ics communit& we use t!e term binormal in t!is
paper.
-!e tangent=plane basis vectors wit! t!e normal #orm t!e tangent=space basis1 t!e t!ree vectors de#ine
t!e \$' tangent space.
An e%cellent tutorial on understanding tangent space basis vectors b& *ric Deng&el/ t!e aut!or o# t!e
book Mat%emati*s for 3D +ame \$rogrammig ad Computer +rap%i*s >9+? can be #ound online at
!ttp1GGwww.terat!on.comGcodeGtangent.!tml >4?. Note t!at w!ile t!is is an e%cellent resource #or
understanding t!e underl&ing mat! o# computing tangent space/ some normal map baking algorit!ms
suc! as \$ds Ma% omit t!e ort!ogonali3ation step/ e%plained later on.
*angent Space per &erte#
-!e tangent basis varies across a sur#ace and must #irst be computed at eac! verte% as an average o# t!e
t!ree touc!ing #aces (more on w!at de#ines a touc!ing #ace below" and t!en interpolated across t!e
sur#ace. -!is interpolation algorit!m can also var& between normal map renderers/ and can a##ect t!e
#inal rendered model. It is important t!at t!e renderer uses t!e same interpolation mec!anism as t!e
baking.
%\$namic Computation o! Binormal
Man& applications (e.g. \$ds Ma% and Ma&a" compute t!e binormal d&namicall& as a cross=product o# t!e
normal and t!e tangent. As a result t!e normal is ort!ogonal to t!e binormal/ but not necessaril& to t!e
tangent.
Splitting at Smoothing 'roup and Map Seams
,!en computing t!e tangent basis vectors at eac! verte% t!e& are averaged #rom eac! touc!ing #ace/
but map seams and smoot!ing groups must be taken into account. 5ow t!is is done can var& #rom
application to application1
In \$ds Ma% t!e smoot!ing groups and map seams are used as #ollows1
moot!ing groups but not seams are considered w!et!er #aces are split #or t!e averaging o#
Normals
moot!ing groups and seams w!en considering w!et!er #aces are split #or t!e averaging o#
-angents.
Binormals are computed #rom t!e normal and t!e tangent/ and t!us are split b& bot! smoot!ing
group and seam.
Orthogonali.ation o! the *angent Basis &ectors
,!en t!e binormal/ normal/ and tangent at a verte% are averaged #rom t!e surrounding #aces it causes
t!e tangent basis to become skewed (i.e. no longer ort!onormal".
Ma&a and Mudbo% per#orm an additional ort!onormali3ation step using )ram=c!midt process >2?. -!is
normali3es t!e binormal and t!e tangent and assures t!at t!e& are ort!ogonal to eac! ot!er and t!e
normal.
-!is ort!ogonali3ation step is recommended in some literature/ suc! as Mat!ematics #or \$' )ame
@rogramming and Computer )rap!ics >9+? >9.?/ but not in ot!ers suc! as t!e N(I'IA documentation
>9\$? and man& normal map s!ading tutorials.
,!et!er or not t!e tangent space basis vectors are ort!ogonali3ed or not is not o# signi#icant
importance to t!e appearance o# a normal map s!aded model. ,!at is important on t!e ot!er !and is
t!at bot! t!e baking and rendering algorit!ms are in agreement on t!is point
Appendi#- /ow "ds Ma# Renders Normal Maps
-!e #ollowing steps e%plains in detail !ow \$ds Ma% renders normal maps1
9. -!e B (binormal" and - (tangent" vectors are computed #rom t!e N (normal" vector/ t!e verte%
points/ and t!e te%ture verte% points at eac! verte% (see Appendi%1 5ow \$ds Ma% Computes
-angent and Binormal (ectors".
o -!e - vector s related to t!e mapping coordinates. ItKs t!e direction in w!ic! t!e A
coordinate is increasing. ItKs parallel to t!e triangle/ but !as no ot!er relations!ip to t!e
geometr&.
o -!e B vector is computed b& t!e cross=product o# t!e N and t!e - vector.
o :or more in#ormation see1 EAppendi%1 5ow \$ds Ma% Computes -angent and Binormal
(ectorsF
2. Normals are weig!ted b& #ace angle.
\$. B/ N/ and - vectors are computed #or eac! verte% o# a #ace b& averaging t!e B/ N/ - o# all t!ree
touc!ing #aces. :aces are considered split (not touc!ing" as #ollows1
o :aces are split according to smoot!ing group w!en computing t!e normal
o :aces are split according to smoot!ing groups and seams w!en computing tangents and
binormals.
+. -!e B/ N/ and - values are #inall& interpolated #rom t!e vertices to individual sur#ace points o# a
triangle/ to get t!e basis #or eac! pi%el during render.
It is important to note t!at some optimi3ations are per#ormed b& ot!er applications are not per#ormed
b& \$ds Ma%. :or e%ample1
plitting normals b& crease angle
@ost=process smoot!ing
,eig!ting o# normal/ binormal/ or tangent b& triangle.
,eig!ting o# binormals and tangents b& #ace angle
Ort!ogonali3ation o# t!e tangent and binormal vectors
I# t!ese/ or ot!er steps are per#ormed t!en t!e normal map created in \$ds Ma% will not render as
e%pected.
Appendi#- /ow "ds Ma# Computes *angent and Binormal &ectors
In normal maps produced b& t!e \$ds Ma% scanline and mental ra& renderers t!e tangent and binormal is
computed b& t!e #unction Compute-angentAndBinormal(" in t!e !eader #ile gutil.! given t!ree te%ture
verte% points and t!ree geometr& verte% points. -!e te%ture verte% points can be retrieved using t!e
#unction Mes!11map(erts(" and t!e geometr& verte% point can be retrieved using t!e Mes!11verts
member variable. -!e results are returned in t!e t!ird argument/ wit! t!e tangent returned in bvec>8?/
and t!e binormal returned in bvec>9?.
Note t!at t!e tangent vector is computed #rom t!e verte% and map verte% points #irst. Ne%t t!e binormal
is computed as t!e cross=product o# t!e tangent and t!e geometric normal (not t!e s!ading normal".
void ComputeTangentAndBinormal(const Point3 tv[3], const Point3 v[3], Point3 bvec[2])
{
float uva,uvb,uvc,uvd,uvk;
Point3 v1,v2;

int ix = 0; // 0 corresponds to the U axis
int iy = 1; // 1 corresponds to the V axis

uva = tv[1][ix]-tv[0][ix];
uvb = tv[2][ix]-tv[0][ix];

uvc = tv[1][iy]-tv[0][iy];
uvd = tv[2][iy]-tv[0][iy];

uvk = uvb*uvc - uva*uvd;

v1 = v[1]-v[0];
v2 = v[2]-v[0];

if (uvk!=0) {
bvec[0] = FNormalize((uvc*v2-uvd*v1)/uvk);
}
else {
if (uva!=0)
bvec[0] = FNormalize(v1/uva);
else if (uvb!=0)
bvec[0] = FNormalize(v2/uvb);
else
bvec[0] = Point3(0.0f,0.0f,0.0f);
}

Point3 normal = Normalize( (v[1] - v[0]) ^ (v[2] - v[1]) );
bvec[1] = CrossProd( normal, bvec[0] );
}

\$ds Ma% will also #lip t!e binormal w!en t!e triangle is A( space is back=#acing/ wit! t!e code1
Point3 mapNormal = FNormalize((mapTri[1] - mapTri[0]) ^ (mapTri[2] - mapTri[1]));
if( mapNormal.z<0 ) // is the UV face flipped?
basisVec[1] = -basisVec[1]; // yes, so flip the binormal
Appendi#- /ow Ma\$a Renders Normal Maps
Ma&a di##ers #rom \$ds Ma% in t!e #act t!at t!e tangent and binormal vectors are ort!onormali3ed
according t!e )ram=c!midt process >2? a#ter computation. Note t!at t!e input vectors are processed in
order o# normal/ tangent/ and binormal. A#ter t!e ort!onormali3ation process t!e tangent and binormal
vectors are bot! ort!ogonal and normali3ed.
-!e binormal and tangent is retrieved using t!e #unction Compute-angentAndBinormal(" are
trans#ormed according t!e #ollowing #unction.
//now with T and B and N we can get from tangent space to object space
//but we want to go the other way, so we need the inverse
//of the T, B,N matrix
//we can use the Gram-Schmidt algorithm to find the newTangent and the newBinormal
//newT = T - (N dot T)N
//newB = B - (N dot B)N - (newT dot B)newT

//NOTE: this should maybe happen with the final smoothed N, T, and B
//will try it here and see what the results look like

D3DXVECTOR3 tmpTan = smtangent;
D3DXVECTOR3 tmpNorm = smnorm;
D3DXVECTOR3 tmpBin = smbinormal;

D3DXVECTOR3 newT = tmpTan - (D3DXVec3Dot(&tmpNorm , &tmpTan) * tmpNorm );
D3DXVECTOR3 newB = tmpBin - (D3DXVec3Dot(&tmpNorm , &tmpBin) * tmpNorm) -
(D3DXVec3Dot(&newT,&tmpBin)*newT);

D3DXVec3Normalize(&(smtangent), &newT);
D3DXVec3Normalize(&(smbinormal), &newB);
Appendi#- /ow Shaders are a!!ected b\$ the changes in "ds Ma# 0122 /32
As o# \$ds Ma% 2899 5: t!e 'irect \$' driver #or t!e viewport !as c!anged t!e computation o# normal
mapping b& de#ault (and added a new mode to #urt!er customi3e its displa&". -!is a##ects t!e wa& t!at
cac!ed mes!es are drawn in t!e viewport b& \$ds Ma%.
basis vectors are supplied to t!e viewport pipeline b& t!e s&stem/ but developers !ave t!e c!oice to
override t!is b& writing t!eir own code as s!own in t!e sample1
34A454
,%y does t%e ormal map t%at I baked appear fie "%e -ie"ed "it% & but ot "it% ./ -!e most
common cause #or t!is is t!at a di##erent met!od was used to compute tangent basis w!en baking t!e
normal map/ t!en t!e met!od used to render it.
Does 3ds Max *ompute ormal maps i*orre*tly/ No. -!ere is no one correct wa& to compute normal
maps. Almost ever& application uses a di##erent met!od to compute t!e tangent basis vectors used #or
creating normal maps. ome people assume incorrectl& t!at one met!od is more correct t!an t!e
ot!ers.
0o" does 3ds Max e*ode ormal maps/ A normal map is a t!ree=color map/ unlike t!e gra&scale maps
used #or regular bump mapping (see Bump Map". -!e red c!annel encodes t!e le#t=rig!t a%is o# normal
orientation/ t!e green c!annel encodes t!e up=down a%is o# normal orientation/ and t!e blue c!annel
encodes vertical dept!. -!e encoding is computed as #ollows w!ere N is t!e Normal1
R I (N.% J 9" M 8..
) I(N.& J 9" M 8..
B I (N.3 J 9" M 8..
0o" do I *reate ormal maps i 3ds Max/ ee
'AC7A'6AB4A=227\$.!tm.
,%at is t%e rig%t %ad 1or *outer *lo*k"ise2 rule/ Normals can be computed #rom a triangle b&
normali3ing t!e cross=product o# two vectors created #rom verte%es in a counter clockwise order. -!e
mnemonic is to imagine t!e rig!t=!and/ wit! t!e t!umb pointing in t!e direction o# t!e normal/ awa&
#rom t!e model/ and towards t!e observer. -!e remaining #ingers point in a counter=clockwise order.
3or More In!ormation
-!e #ollowing articles discuss writing normal map and bump map s!aders1
A normal map s!ader #or 'irectL =
!ttp1GGwww.codesampler.comGd%7srcGd%7srcH+.!tmNd%7Hdot\$HbumpHmapping
Bump mapping using Cg b& Oren 'rei0er (5alloko" = !ttp1GGwww.blacksmit!=
Bump mapping using )DD = !ttp1GG#abiensanglard.netGbumpMappingGinde%.p!p
-!e )ame @rogramming ,iki = Open)D1-utorials1)DD Bump Mapping =
!ttp1GGwww.gpwiki.orgGinde%.p!pGOpen)D1-utorials1)DDHBumpHMapping
Bump Mapping using )DD = B& PQrRme KPe)LK )AINO- at O3one\$d.net =
!ttp1GGwww.o3one\$d.netGtutorialsGbumpHmapping.p!p
-!e Cg -utorial 1 C!apter 6. Bump Mapping =
!ttp1GG!ttp.developer.nvidia.comGCg-utorialGcgHtutorialHc!apter86.!tml
Desson 6 1 -angent pace ()DD e%amples" !ttp1GG0erome.0ouvie.#ree.#rGopengl=
tutorialsGDesson6.p!p
Cg Bumpmapping on )ame'ev.net b& Ra3van urdulescu =
!ttp1GGwww.gamedev.netGpageGresourcesGHGG96\$G+8\$Gcg=bumpmapping=r978\$
LNA !ader @rogramming S -utorial 22/ Bump Mapping @erlin Noise b& 'igitalerr8r =
mapping=perlin=noiseG
Normal Map !ader tutorial at \$' Cingdoms =
!ttp1GGwww.\$dkingdoms.comGweekl&Gweekl&.p!pTaI.
-!e #ollowing articles discuss t!e mat!ematics o# tangent space1
Deng&el/ *ric. EComputing -angent pace Basis (ectors #or an Arbitrar& Mes!F. -erat!on
o#tware \$' )rap!ics Dibrar&/ 2889. !ttp1GGwww.terat!on.comGcodeGtangent.!tml
'erivation o# t!e -angent pace Matri% b& Pakob )at! (5el" = !ttp1GGwww.blacksmit!=
-angent=space basis vectors1 UouKre calculating t!em wrong b& One*ig!t5undred=
!ttp1GGcodedeposit.blogspot.comG2898G8+Gtangent=space=basis=vectors=&oure.!tml
Messing wit! -angent pace b& idd!art! 5egde =
!ttp1GGwww.gamasutra.comGviewG#eatureG9.9.GmessingHwit!HtangentHspace.p!p
@er=@i%el -angent pace Normal Mapping b& Ben0amin upnik =
!ttp1GG!ackso#li#e.blogspot.comG2887G99Gper=pi%el=tangent=space=normal=mapping.!tml
Miscellaneous
Baking Normal Maps on t!e )@A =
!ttp1GG!ttp.developer.nvidia.comG)@A)ems\$Ggpugems\$Hc!22.!tml
Normal Map ,iki at @ol&count = !ttp1GGwiki.pol&count.comGNormalMap
Re!erences
>9? !ttp1GGwiki.pol&count.comGNormalMap
>2? !ttp1GGen.wikipedia.orgGwikiGNormalHmapping
>\$? !ttp1GGwww=grap!ics.stan#ord.eduGpapersGsur#ace#ittingG
'AC7A'6AB4A=227\$.!tm
>.? !ttp1GGwiki.pol&count.comGNormalMapN-angentBasis
>2? !ttp1GGen.wikipedia.orgGwikiG)ramV*2V68V7\$c!midtHprocess
>4? Deng&el/ *ric. EComputing -angent pace Basis (ectors #or an Arbitrar& Mes!F. -erat!on o#tware \$'
)rap!ics Dibrar&/ 2889. !ttp1GGwww.terat!on.comGcodeGtangent.!tml
>6? ENormal Map tutorialF/ Ben Cloward = !ttp1GGwww.bencloward.comGtutorialsHnormalHmaps9.s!tml
>7? ELNA !ader @rogrammingF/ 'igital *rr8r= !ttp1GGdigitalerr8r.wordpress.comG2887G8\$G2\$G%na=