The document discusses normal maps, which are textures that define the normal vector of a surface point to affect how lighting is reflected. It describes how normal maps are created by "baking" in applications like 3ds Max and rendered in game engines. While creation and rendering methods can differ, it is important the two are consistent in how normal vectors and tangent space are computed. The document also provides details on technical aspects of normal maps like tangent space, and appendices on how specific applications like 3ds Max and Maya handle normal map rendering.
The document discusses normal maps, which are textures that define the normal vector of a surface point to affect how lighting is reflected. It describes how normal maps are created by "baking" in applications like 3ds Max and rendered in game engines. While creation and rendering methods can differ, it is important the two are consistent in how normal vectors and tangent space are computed. The document also provides details on technical aspects of normal maps like tangent space, and appendices on how specific applications like 3ds Max and Maya handle normal map rendering.
The document discusses normal maps, which are textures that define the normal vector of a surface point to affect how lighting is reflected. It describes how normal maps are created by "baking" in applications like 3ds Max and rendered in game engines. While creation and rendering methods can differ, it is important the two are consistent in how normal vectors and tangent space are computed. The document also provides details on technical aspects of normal maps like tangent space, and appendices on how specific applications like 3ds Max and Maya handle normal map rendering.
Contents Overview ................................................................................................................................................. 2 Introduction to Normal Maps .............................................................................................................. 2 About Normals .................................................................................................................................... 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 >$?/ About Normals -!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% Autodesk 3ds Max = !ttp1GGdownload.autodesk.comGusG$dsma%G2892!elpG#ilesG)AI'= 7A.8$:A9=*2B9=+*28=76+B='AC7A'6AB4A=227$.!tm Autodesk Maya = !ttp1GGdownload.autodesk.comGglobalGdocsGma&a2892GenHusG#ilesGAstsHCreateHte%tureHmaps Hwit!Ht!eH-rans#erHMapHtool.!tm Autodesk Mudbox = !ttp1GGdownload.autodesk.comGglobalGdocsGmudbo%2892GenHusG#ilesG)AI'=A282*266=A449= +22.=B24B=28$+CC:':79=966.!tm . Autodesk Softimage !ttp1GGdownload.autodesk.comGglobalGdocsGso#timage2892GenHusGuserguideG#ilesGte%HmapsHC 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= adobe=p!otos!op &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 s!ading algorit!m are in agreement about t!is point. *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
$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
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%. As a result :L s!aders or MetaD s!aders #or 'irectL materials are displa&ed di##erentl&. New tangent 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 maxsdk\samples\hardwareshaders\MetalBump9\RenderMesh.cpp. 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 !ttp1GGdownload.autodesk.comGusG$dsma%G2892!elpG#ilesG)AI'=7A.8$:A9=*2B9=+*28=76+B= '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!= studios.dkGpro0ectsGdownloadsGbumpmappingHusingHcg.p!p 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 = !ttp1GGdigitalerr8r.wordpress.comG2899G8.G96G%na=s!ader=programming=tutorial=22=bump= 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!= studios.dkGpro0ectsGdownloadsGtangentHmatri%Hderivation.p!p -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 >+? !ttp1GGdownload.autodesk.comGusG$dsma%G2892!elpG#ilesG)AI'=7A.8$:A9=*2B9=+*28=76+B= '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= s!ader=programming=tutorial=+=normal=mappingG >98? EIntroduction to Normal MappingF/ Andrei Ic!im = !ttp1GGwww.game= artist.netG#orumsGvbarticles.p!pTdoIarticleWarticleidI92 >99? EAnderstanding Normal mapsF/ Diman = !ttp1GGliman$d.comGtutorialHnormalmaps.!tml >92? !ttp1GG!ttp.developer.nvidia.comGCg-utorialGcgHtutorialHc!apter86.!tml >9$? !ttp1GGdeveloper.nvidia.comGnodeG6. >9+? Deng&el/ *. BBump Mapping.B X2.6 in Mat!ematics #or $' )ame @rogramming and Computer )rap!ics/ 2nd ed. 5ing!am/ MA1 C!arles River Media/ pp. 962=967/ 288+. >9.? ,eisstein/ *ric ,. BBinormal (ector.B :rom Mat!,orld==A ,ol#ram ,eb Resource. !ttp1GGmat!world.wol#ram.comGBinormal(ector.!tml >92? !ttp1GGen.wikipedia.orgGwikiGDambertianHre#lectance