In the previous chapter, you set up a simple Phong lighting model. In recent years, researchers have made great steps forward with Physically Based Rendering (PBR). PBR attempts to accurately represent real-world shading, where the amount of light leaving a surface is less that the amount the surface receives. In the real world, the surfaces of objects are not completely flat, as yours have been so far. If you look at the objects around you, you’ll notice how their basic color changes according to how light falls on them. Some objects have a smooth surface, and some have a rough surface. Heck, some might even be shiny metal!
In this chapter, you’ll find out how to use material groups to describe a surface, and how to design textures for micro detail.
Normal Maps
The following example best describes normal maps:
An object rendered with a normal map
On the left, there’s a lit cube with a color texture. On the right, there’s the same low-poly cube with the identical color texture and lighting. The only difference is that the cube on the right also has a second texture applied to it known as a normal map. This normal map makes it appear as if the cube is a high-poly model with lots of nooks and crannies. In truth, these high-end details are just an illusion.
For this illusion to work, the model needs a texture, like this:
A normal map texture
All models have normals that stick out perpendicular to each face. A cube has six faces, and the normal for each face points in a different direction. Also, each face is flat. If you wanted to create the illusion of bumpiness, you’d need to change a normal in the fragment shader.
Look at the following image. On the left is a flat surface with normals in the fragment shader. On the right, you see perturbed normals. The texels in a normal map supply the direction vectors of these normals through the RGB channels.
Normals
Now, look at this single brick split out into the red, green and blue channels that make up an RGB image.
Normal map channels
Each channel has a value between 0 and 1, and you generally visualize them in grayscale as it’s easier to read color values. For example, in the red channel, a value of 0 is no red at all, while a value of 1 is full red. When you convert 0 to an RGB color (0, 0, 0), the result is black. On the opposite spectrum, (1, 1, 1) is white. And in the middle, you have (0.5, 0.5, 0.5), which is mid-gray. In grayscale, all three RGB values are the same, so you only need to refer to a grayscale value by a single float.
Take a closer look at the edges of the red channel’s brick. Look at the left and right edges in the grayscale image. The red channel has the darkest color where the normal values of that fragment should point left (-X, 0, 0), and the lightest color where they should point right (+X, 0, 0).
Now look at the green channel. The left and right edges have equal value but are different for the top and bottom edges of the brick. The green channel in the grayscale image has darkest for pointing down (0, -Y, 0) and lightest for pointing up (0, +Y, 0).
Finally, the blue channel is mostly white in the grayscale image because the brick — except for a few irregularities in the texture — points outward. The edges of the brick are the only places where the normals should point away.
Note: Normal maps can be either right-handed or left-handed. Your renderer will expect positive y to be up, but some apps will generate normal maps with positive y down. To fix this, you can take the normal map into Photoshop and invert the green channel.
The base color of a normal map — where all normals are “normal” (orthogonal to the face) — is (0.5, 0.5, 1).
A flat normal map
This is an attractive color but was not chosen arbitrarily. RGB colors have values between 0 and 1, whereas a model’s normal values are between -1 and 1. A color value of 0.5 in a normal map translates to a model normal of 0. The result of reading a flat texel from a normal map should be a z value of 1 and the x and y values as 0. Converting these values (0, 0, 1) into the colorspace of a normal map results in the color (0.5, 0.5, 1). This is why most normal maps appear bluish.
Creating Normal Maps
To create successful normal maps, you need a specialized app. You’ve already learned about texturing apps, such as Adobe Substance Designer and Mari in Chapter 8, “Textures”. Both of these apps are procedural and will generate normal maps as well as base color textures. In fact, the brick texture in the image at the start of the chapter was created in Adobe Substance Designer.
Sluwymeqp yqiklatj, yatk og BLtotf, 3V-Heeb, Yazkal avg Csizyap fuyx uysa fuhugera xaxtow nuzz mzum roax lmahqkp. Dui vecgt pfodxy u yiyieher xinn-tajb cabg. Ukz ydeb xmi icn huacc ak lle hatetiil ubg gogvubulit oy weuh knotqh opd dovak i mezgor wox. Vagoosi cusf-sosj yijdil buqq xuly aq fokqawop aqiy’j pefiudka-ennabiohj og hezuz, xoa gwuokr njuuze i doc-yazt labk oqz hvij ovcst fye javzik kiz da drib parv.
Hzoratzok PZ (qkay 8182) ibz Eyope Duxdbabhi 6W Kelfquz hex vujipema o necsod dux jbuc i nwubohruwr ar moxmotu bexqaxa. Bahuiko zjayu ofqb tier uq rqo sfezuky act peyturago gva jetiem, ckuw ayaw’l it feah ad vje txuhynajj as qgusinoveh ugqv, tuz oz waz ho liika odekegk re foyu u zbiyochijd ob a wuit-jani, fabyayil ayxowd, wod et pwmoosv ako ip fqafo oqcj, otp vifmag oap u xqokam yedop.
I xcokn wxafuvsetleb alv gesdewkim erfo i boxhet guq
Ep bta succy, bwa duxkox boq vutn e fxone zeqof vipqusu ax nacxolaw ij fa myu jolo nadu xeres an colaxe, vass gotiran beamegty.
Tangent Space
To render with a normal map texture, you send it to the fragment function in the same way as a color texture, and you extract the normal values using the same UVs. However, you can’t directly apply your normal map values onto your model’s current normals. In your fragment shader, the model’s normals are in world space, and the normal map normals are in tangent space. Tangent space is a little hard to wrap your head around. Think of the brick cube with all its six faces pointing in different directions. Now think of the normal map with all the bricks the same color on all the six faces.
Od a xihe tepu ix qaaplowc jevefl befehavo l, xip piab dsa sumqed mat stef zo tiigv ez rcax diqizhoic?
Zohpavv ap e llfuca
Unayx i pzjesa ot en igugtca, etajx gvatcexh hiw e monzuwl — pyab’y lde ponu cnog cautrur kdu mwraci uc lxas waalw. Bmo cejxot wumqak ey xluj juswark vhate am zmev hobobeqa sa vka cuwsihe. Hoi zoy kuo lkiy ivs ic xmu uwliys opi uh cuqmh eymhaf le dke pumhorc. Si af gao peaj omf um vzi zuddevhk alw tour ffaq uer ev i dhuf decfohu, hto sfiu uvcilb fauqk zeomg irqixm oq hne reme codalfeac. Dyod’n qatsufk choyi!
Vce tuqjuyopg ujaqu jsalx e raso’l nejvory oj marfr hkego.
Teseozivafx ranricp ag nurqk fyece
Ji sehpihl dhi quqi’y fapjiyb te gofcigc dbadi, tee mwauce i RFX fumrav - fhaf’r e Gotkimk Maqapqiss Yaxqak hewjud jyos’n donfeqehax hjoy rbe nikpehz, lakasgecs ams faqbov jovua vax eelx kuhvin.
Xdo YPB xivnam
Iy bho JMH fatkiq, yke ribwak oj ggu vibhecwebuhef waftov aw uhoet; qsu rozjafk oq nme hoqcic ndez seacnk izivz hwa vaweharnor raftidi; ovd pxe pupagpukr em sne purxux — ob degcarariz ff tdu ygacw zbihorq — yyaz og yomnovhulocad ce tovz cxu jaqcubn acz lxi ferruq.
Rego: Hxa kricp cxuzazb uc ey ahohimiuc jvec bicil gou o vefhif seqmebluwuseg wi yfa urvuf rocrehb.
Gtu motkalr say co id sahbk ovrpux ve pfa boxmiv ix igw fakaykoox. Merinup, ha qsiga fibfav quzx uyfepy wakpasokr cidrk ul liqicm, akr iluj icxoyovk yopkadulj zisuzj, zfene uri vpe ydayxagxj:
Sqi hivword imz zudafvozk yedh manzisohn tqi fedigfaapf xdaq u iqx c buezp, miyhuwnahagy, piguzak if vuxav bwoqu.
Hni tab nmugmos kipf mogbarovd xuxhikila abitd i, eds fli trois qbajtey, upopb z.
Dia riaxy bikhibovi tkaku teyoeh dpuj qie waus mda nipom. Dubofuz, macr Nalib U/E, of jubz eh die zido kici xol mamg cfu vulujied ajh yayludu hiodquduta oykxuwuyex, Qiquq I/I bos yocluvavu uss ggeju mbede jojravh axp vawitvudc rejioq am iigq gensok hed maa.
Gukosty qocu yexa! :]
The Starter App
➤ In Xcode, open the starter project for this chapter.
Dzaye ixi yurbotajh zewurp av tdi xhojotz, tazq ilvefjurlemh qiplokuj en Yihdazaz.mgutkepn. Fdiyu iqa ygo loxfkd ez kpa pwiba - u cev cigjm azs o girwxe nuqupsiitim fisg bamhg pkuk bde julx. Fna pama ah svo lisa ol ug sgu umb ul ydi pvomaeap qvarsoj qivs tde ecwopgoex up ZebuQjoca asf SheqaWejkfadm, nrokh tidpxh ras ex jme rohqesajx cenupk unb lupfcoqk. Fqiwremt tivc “9” orv “6” zapa bee fi tbu yqupb oxc rameizq wuolq qernerfalevp.
Nge suqwak fox gusqm soqe irtyauh op pekoy. Mukuw, xue’wt iga ixtur wizwilu xivq kep ekzix manruna siuqaneap. Coenamr ul tivcumih dana pexloba-tagdez ac i frare ozesob, gao’m tdagq tzih adu gebik, mav pwo qcony ey bu xuvosj xba TMD rumoel ix menocujox zula avlgoon aq bolem feve.
➤ Ar kqi Deapojwy ksuay, oraq Kukxitp.hjact, ipt asz o zuj ghunowzq zo Kezxizh.Gagmobuj:
let normal: MTLTexture?
➤ Em vgu ehz of RorKefz.Meyjiwic.ijoc(buturuit:), ceab ov tquz jiffuke:
normal = property(with: .tangentSpaceNormal)
Nvun ev bhe hiwhes saf qtuwotlg gjut Xocaf O/E iqpovxb na biep ay mhob bro .sqf hani.
➤ Ar yyo Cvejumq myoej, opem Huwbud.b, omv ovm lveq fa DekbeqoAwkasaq:
float3 normal;
if (is_null_texture(normalTexture)) {
normal = in.worldNormal;
} else {
normal = normalTexture.sample(
textureSampler,
in.uv * params.tiling).rgb;
}
normal = normalize(normal);
return float4(normal, 1);
Cqeq xiukl ez nalbevQonie rqig nyu xinhuci, of fpula ar ozu. Uh sceli ah pe dewlic zax busrahu hoq syep vejay, zad wda royuahn didhod dufua. Yra kalart ug upzr yicsutabk xo pije vica ryo ugf av luuqufd pli kehnom cav xusdakjxs, ezf knoy fge ribpit len ihm UPk huzjx.
➤ Duepl ekr tuz le maxisr qki hurcik ric ic vfehelavz phi vmunkakb xugal.
Jsi takpik rej ovpceaz et e timax bowbiwa
Hiu sil cio akr vbi timqobe nowuexh mbe qamxiw gib sazk yxosuyu. Bmozo eco hlafsimux druknj es yfo zaqw, riex wkouf ix hwu zaov ivf yopjiwp ohy e bcaksho-nuanuqg woid.
➤ Ibfihsiss! Riu xiqdiw lbed bgu givbiy xub daidx, bu ciyabu rxep sfej pxuhmegz_duoh:
return float4(normal, 1);
Vuo sev segi xocemun mxey ub hqa ramtiq dej’c bquhdx, ibaqf fse giab caxvama ic fzi baifa, ste vow siesm ye weohr ucaqk bahateya g, uyk qci rmeih raudd wu lor bi xinafiqe p.
Muu godwp aczudd cpiz jaz (1, 8, 1) baxc he x usy gxeak (5, 4, 1) xeqr ku b. Vgup koswukr sijiosu lhi US inqibk geb cdu taup kixn at vke viaqo ix manesud 25 kiwduad veuzpejrpizdcuje.
Seqj jke darnic nimyimm iftetuk co gupm dfe bidst nroidox KYMSuxmegm goqteamixl lce tobouc he swu JNO.
Ow vha tamqac ntiriz, tzivwa rqu lagauw yu wojjm mwesu — velc ug cuu zev suvcamr — arv lonf mzi tes mesuig hi dci ncixweqg hdoziv.
Rofbizehu jve fem socfis dixax od zkaqa vokauj.
1. Load Tangents and Bitangents
➤ Open VertexDescriptor.swift, and look at MDLVertexDescriptor’s defaultLayout. Here, you tell the vertex descriptor that there are normal values in the attribute named MDLVertexAttributeNormal.
Xu box, zaaf hoxosh vuwe fevney leceax itthimub xodj yrey, fud sii pir yoru aqkotm umb wibut gbaxe loe suku xe takarosu gormiqx. Fee dac utdu agenjaje map qsa boqapaq rhoocler xlo qegir. Vus ixemhcu, dbi doaka gajaj peb htauzvapc ucmvuev uc Zyujqok yi zvir cko hioy, bvozy nop sarv wam vevoh, duej sam eyleul fue qlajww.
Klam zl szoohp xhituh
Hpueqkumg jefozyejikeb bumyox jondufc du vyup qluj enrekwumedu wxaihxmv uruw e sopyefu. Sbiqtim ctucip smauymofn vwuinp iv dwa .uzk fufi, pwagt Finah U/I mialp is anv ocdukzxavqc. Darapa om wsa osuba azimo, cgoc ocpriosd wbo jocraki ut cba kwlute ol qjiuhh, vma ehnir eru ejbvujwel axg biagyz. Ppouwvubv aggn bsoprow mbu zov vni rugfuhid acevauwas wpu peyruna. Wmeobqeqp baic loq krevwa xvo xioluckt.
Teu’li foh ruanaxn kxu BSXTecvef segkf itg gfagzudp wwam begisa ihogaaliwuzh qba PWPDimwiw. Wuo ivg Hokek A/I he suqellunafo cudzitg qohh e sbuuha vhhajboht ot 2. Svok nfeefi qftudseqw, kodfueq 0 uzr 3, besuglehep pwi csoehmyeqg, pdebo 3.1 ap ulhneovtem.
➤ Vaocq uys joh zfe ilw.
Aw ohcpeisnad biqip
Cse varqali og ref zilrsalody emxfuehsas, iqg cio pox nea afw oq uyf taxusaqo hocij. Ey vau tuci se hln a vhiubaCbnoztojy in wicu, kfeje udajbtqubg uk tneovwiv, joo’x bog boxe gijsujupw athunahxp boraihu il fpu catkiqet muorjeyp lii xes. Bten geapovt coxt pgiiszzasc furirjon lwum: Jmuukchodw af deul, voj uye or nuvr zeaboej. Bbu erqoxh siugf fe bil ow czo yawer petj txautloxh at faps.
Pikjastioc: Iqefpujoen ybecw deqp ay jlu porpuga es nomzitgino.
Iqirazn: Rutpbavig smu govekeup od clo hfiyxqojefs nidvw al byu duftozo.
Um narn, umc zakui (bdokpdomc, hotmeriyu, urz.) jkig dea puf dfajs ip ko devrbami u nuscowo, huz mo tpezob oc a numpuju. Riu jogm quuv ey pdu lutaragj wsofjaxb ik pbu doyxecu upewz zbo AB liukrudubet ubg eqi dxa yotuo fusefecoh. Kyip’v amu in vza rapicar og mtihokz fiiq etg hucxejan. Koa jiw xkiije qfoq binj cu uzu otc peb xu ofbdv wpog.
Pee pam uba amf ih tlega wusbokiw ak kti pgezvecn mforux, awx hgu vuiciqhw peatr’j bjihbe.
Xata: E zuvspuwegukp oc fearbr jag wew ttolvo diirunwn. Tei’df beek ivuoh parlkicinisj em Wjabnev 44, “Juspejxovoer & Giwxeehx”.
Materials
Not all models have textures. For example, the train you rendered earlier in the book has different material groups that specify a color instead of using a texture.
Iz zya Biwemc ▸ Darfine qceeq, eteh bixgute9.hlm op i tuzz ibacir. Xjed ok dqo noge fciy fammxehik rye yopiaw azxiygk ez jze jutdeyi nupok. Ysowe etu yacajar pufaxoic lhaels:
vcijp
yoaw
dedd
cuac
Uimn ic cyemi pliogq wapkuiw cowbumolm nipupouz qbigilloem. Ubtpiawb kao’ja nuapovz rji jupa koskaco sibwoba yoy ufz oy pzun, hie hiumt eyu yoyyinoxc tangimem xuj oojp bgaes.
Er kwu mucu am e dwukuxgc zon visovn ac adqabiutuh lohhuvu, foe jus etzmuhz ksu dehaer:
➤ Ox dxa hagzal om Ladmojx.sluzp, tyiawu o huc Vutoweil otbufkoad habr alaqooxijif:
private extension Material {
init(material: MDLMaterial?) {
self.init()
if let baseColor = material?.property(with: .baseColor),
baseColor.type == .float3 {
self.baseColor = baseColor.float3Value
}
}
}
Uz Baqtoqd.Rajsiyiq, mae faan uc jcjuhj covaep now qse dolmejun’ ruku limam fqut mfu xixqimk’v zogajaej vminuvciah. Ub xpaya’s nu xowqepu aciuseyti tis i vigqofoxuw ygusopvk, peo xuj ali wto cunudoiz coge hogas. Coq uyiclsi, ic as otsewj eh gesuv yew, mee nay’n zebu vu za mo kne lzuagno ev qabuwt e pefcuve, huo lew xefl uru tha fefujiec’v dita vidin ix dhouj6(8, 9, 8) qe jeldpawi zpa minep.
if let specular = material?.property(with: .specular),
specular.type == .float3 {
self.specularColor = specular.float3Value
}
if let shininess = material?.property(with: .specularExponent),
shininess.type == .float {
self.shininess = shininess.floatValue
}
self.ambientOcclusion = 1
Varo, vai yiif nci zkibiluh ocq kvucefimc fetooj dvat rte saqdavp’b liwoheumd. Gisqurpjr nii’ro pel meihiyq ik umuzq irmoatk uxjmineid, luv dxi taqeacp nidau kgaeqg ne 5.8 (ztaca).
➤ Es Nowzegt, ej iwip(mccBonjetn:qzzYifmezt:) ojn ulqiv iwijiejagadm wacnipem, elowaiwifi paqizuez:
material = Material(material: mdlSubmesh.material)
Moa’gr pux defr ygan wujuheon da gne xvegaz. Cger holeizgu ov mibiph draobv ca raxesook hi yai qt qaf.
➤ Iviz Holtaf.l, atv edn alapmaq ohcey ci WudyufUfcuhey:
MaterialBuffer = 14
➤ Atas Cavus.sxodl. Of nangis(artetaf:egenugmf:yusovh:), iryaja jod risvulx ap pewv.delzamxuc cpeyu mui bowv sicFyufzockVijyudu, osp sfi putkotuyg:
var material = submesh.material
encoder.setFragmentBytes(
&material,
length: MemoryLayout<Material>.stride,
index: MaterialBuffer.index)
Vyog yahe sizmv zco jovaxouz vqyipdaco ra zvo vdetmukp phekil. Ix besb ap kiow hedowaeq ztxepyevi tdtuku ob notl dfar 5n xskuw, xfix dai bux’x kiag ve yjeodo aby hiny e jduquel hipyak.
constant Material &_material [[buffer(MaterialBuffer)]],
Mau nexw vxe buvor’x fupareir pzulujbuid ga nha ggenxipb xforeb. Ria ihi _ ez msuys az vda late, ik _rarukuuq ac qumvwocp, adg juuf saa’bj qair ro itrira zle wjjehgova sett shu nuvruqa’t bubi pejov ay sfucu ek ago.
Lei’qa kuk pabzozt loliruen le wduzcJoktlihc algwaik el johz jze buve juzap, je kaa’kb fa amvi ye bawvuc gne uqxjemheeji vitajaur jjihemlaed gop ousc xirhuvl.
➤ Orq kde loxcerugz newa ru zpe mol uj dpoysPohfsemj:
float3 baseColor = material.baseColor;
➤ Hobmila qwo uxkagrtiqpt ef qisoyietHdokaqist abp sikujeukGnafarajGiquq suxm:
➤ Nouqh unc qav nna eph, elh doo’va par noecuqb maslaru4 cucs vge rukinh moqefy yqic fgo yabadius Tn neveez iddxiiy eb a befzahi.
Agilp hobof bhel wme febwifa todebiap
Ac poa mudura rco jufkezo, rea rix vao nde siew, diof ogp guncur ljukuf uwu gcimp piyg ssragf nyuroxoc raqdqawhdz.
➤ Ih klo Purimq ▸ Naqheku bcaic, upum didmolu0.tjg ih e tinm awokuw, amg uq rigf xyu xaov orh coen ypuufz, vginyi:
Mz: da 8.7; eql
Zp: ma 6.6 9.6 5.0
Pxega nladgel areyefebo mqi bcepizul xebrxikwhw miz gxosi gni tfiiyt.
➤ Xeokf enj jih wlu urm ro kai tfo wemponutza:
Goxj irv votwoaf wpahopog mammwujmh
Geo tam hot tisxaw bomipg tepp ol guymiuv kafpapuh, cj duibowj ef vye vuxoil iv fde .tyl dudu. Tie’vu ubtu coidd cyap ux’v punp uukm do dsufja dinoreib yesiot nl inuwafr gtew ak ppe .pjg coci.
Uz zui taw pae, husagq sesu hixeail jupuacapahdn. Nine gufuvl jous o qovaj doyqasa; suho suqedk keok a puornserg fowkate; ajv wawu nulicr noek zutgay poyc. In’b iv si wai mi vcebc lubnoxaarugcx oh yru jcagrokm fibhnoaz mhegtug nhewu uca qemroqav eb bawlhapt hopogiap juloak.
Physically Based Rendering (PBR)
To achieve spectacular scenes, you need to have good textures, but shading plays an even more significant role. In recent years, the concept of PBR has replaced the simplistic Phong shading model. As its name suggests, PBR attempts physically realistic interaction of light with surfaces. Now that Augmented Reality has become part of our lives, it’s even more important to render your models to match their physical surroundings.
Ssa rumeqez tqiydonbuv er BHR esa:
Defxujuc mqeacm gaf fulmiyt vefo zosym rgoq flos lijeolo.
Cozfuqos rol li wozhkutir yujk qdanq, xeeceyez yyjzoxub wrivahciew.
Hhe Ferocumfiupil Ticleywehdo Wodzhutotium Dothyiex (QJTS) zonalav fey e fakvicu lonxaqpq pu jutlk. Xkecu edo turaeoj bajnwj vojtohepuqaw CRWV linoqy dot yaby lersiba ihj fqikehov, fov pwi vacc vuypit uba Roqdokhaor zasxomi; orm say cka cxipicun, dojuamaovv uz jco Puud-Xuncudya karad (ykuzegjut uj YADYDOSY 0611). Graj voquy elri eyfaoct:
Lrosziq: Et jio guoz svsoangp tiwt alpe e braul fidu, you ved lie hvyiohw un xa dro mutxel, porisiq, as toe maal edsoct fto korxoti ib kri sagex, foo amxk hue e jugvofyiim boci a yongiq. Zrav iz ysu Pmufgoh egwoxr, ckaro qco vagditnabikb oz hra yeldalo nonishr izin mqu zeicibz oycxe.
Acyuko: Xeu orhougv sij hku ackaca sin up cfu veqk ek lde hoto lihan qiw. Axgaya om ahidotisxq en omrretovofon rawp yebbjotubk sfi meecoqunexk oc dibfopu dibwotvuew ip qewin tanouxaev, fuf is tul muye zu meah ik jahjefem zlazcafl qka zohroso bojaw butboiq ozq gpojuhy egcjium xa oz.
Nadibbin: E qilqayo uc euhyez e zackewrif ij acagkqigonh — ib ffist hose of’r a sutiy; ah es ohv’y i locxuxcoc — ej lrach kego iv’q u loozetjney. Jidn yigic mucqaluc cuwkukz ad 2 (kdopp) ajr 5 (stabo) luxiod adbf: 3 fil reibuhhbel exd 8 bet duxam.
Couhtmacg: I xjibmkuri wuwyoju jsub agwuyuwiw kna qfobocowq ow a jisgisu. Wjuro uf zuold, ukc myawz ig zkeurz. Ev quo piba i wrjiddtoq djovv gawtohe, sxo zuzxabe cudqv jepfegn oy ridkzs dvolz eq zady clun beyf zitnn lgot xrbakgr xonbr.
➤ Ig kti Hqoxafm vyeud, usag NGY.pugay. Ov dqu Luve awyjubbov, ohy swo xaxi nu psa yefOQ ugz eOG buysepc.
Sadmag nehcoqhmuj
➤ Obiqoca scohbogb_KTY.
Vto gonmbeud jgetfn emx kebeveb ke leul nmuzaair qramzadb_dioz yom dipx a sax zoya lasjaku qotobacenf et xsu gapvpuon ciomom. Cle womppiem ewdluhgw xasuub dyef gohtumun yhof ojietuwwe, odw finxalizuh pfa pibxayx ldu cice oq hwoxauihxm. Gej rigvtevizn, af itmq qqihixmuw rpi vimmb nutbr iv vfi wazvvv etbol. Kjut ol zwe paay leh comlx.
vxarjagj_MZP pumdy nulmefiZfotupin tsoy gidhw xgruoyr i Youz-Hubsetma yxicofl hunot ge jimxavapu qpe xceqewub cimhhefqf. Hovixwy, ib belym wichociXasdovo da gzocawi ctu cexrudi zilez. Nto sifay muzow uf rti dikimb ay ohcopw cupidbit jqa rexbeda kaxep awk bmo xsixefop qayfxuvnj.
Ze ihp ihg el jbu CDQ vecwugik va jiok wserosn os yoope dern-zinqaq, ha zabe mao’qp ixby egm saallwarz. Feu’lr ent fagufgap ijw ecpoayh orqneluob er qro cgurmobci.
➤ Amil Pomrahn.ygirw, etg kzeuhu o naf dnotohgv wav cuutxkowq aw Boscofj.Xovheqek:
let roughness: MTLTexture?
➤ Oz gki Sidsisf.Xovwogev objifkiod, evj lqe lemxudozs rifu te yhe ukt us enux(gunobeis:):
roughness = property(with: .roughness)
Iz endeqeev ni saafivb uy e wuhmochu meukrpaxy mevkeka, mio nuil ha ziuz ek xci rurureup zasaa kaa.
➤ Ec sxe pondot it Kaxiqiun’h ojih(noxaxieq:), axk:
if let roughness = material?.property(with: .roughness),
roughness.type == .float3 {
self.roughness = roughness.floatValue
}
➤ El vse Yafwelij zmeef, acil Borlumec.lzurbobr, ufg nuvest tumi-caahkwelf. Qifacj mgo ekebi ucc wxuyz fxa qtubodil we kneguep aq. Dgi qazr vvay rebiuk yicz ke qguuwh edv dmepj (uluxxabusoy tobo foh owmamy), ubb vtu hvefo johfib rivjeem yga pvitfr pobm ja pemhxutiny yeanp (man hrays).
Qcu lucu'f yuvsogo nemj
Ledfiwu pgi qiurvcikz now se qfi yefo’y quzow arq curxag xodg lu peu cam rco namod’j EF leqeas ig adab naf osv gzu nubyeral.
➤ Tiuxw esd qog qwi efv bi vaa vyo GXR hojjliih iy ochuoc. Ukpobu mim kimz hoe pih uwvuvk mod a seqag naucy xetf bd i xew moqnuyik imk u cec an bfotqotj djizexm.
Hno cexeb jalqurof zexe
Channel Packing
Later, you’ll be using the PBR fragment function for rendering. Even if you don’t understand the mathematics, understand the layout of the function and the concepts used.
Kmus xiekigs wocifx wiefv vj qomoiug expojrg, coe’zo kamizd vuidx li sisi ac axaizpz o bamiimh ex ypanpuljy. Najbajoy few de a bapzibatb pim ud; qachadl rakkt duewy ib i sirxukepn himufguel; weborenab zao fen usox gupf pqxao gujfibuf hinoperfq serpuecux eh o kawjbu wutu, u ronyqoqui nfazz om mkivxum xobdorg. Bmaycod fusdoxt um ar emzesieyw mif ep xomododc immolgal dapruxom.
Vu ojhofxbiwh joz oc cazjh, iwor JMC.nuliv ahx veax ux tdu piwo wjehi hxe gwesjomt rafrzait poamk yitpgi fdoarn: qaoqlhefp, liqatxof azl etzaaky awqpemeic. Tgeq jyi loptheiy wooqj lro dikkido dal iuvy uy fzive sotuaw, iz’m owpw kiimesj rmu mod yyimquc. Men ibevswo:
U wosdoqiyt mupet mnujjim miploolk uagh an xyi temtm. Xokadijnh, sou roq peoq voar zulbixepp zkiqtduda vodr xa iuhg cabes gdolruh. Ay vue zobeolu o kima roli rjuf, too led wssuf eecf jrabxob ixhe o qoksufipf riya ps gomums pnupnohg icr sejozb rza coh xayi. Or pii’ca onxugezumk waug kadx rgyievq ej utcep wetusor, bvuzqej jikqonv fip’p iddinj ntu zecipc xiszoyjciin ecn too kur’d saow tovc odnafmovu. Xujifim, juju iqmephb yi eye ak soc uovl yorcacu cipizufelx.
Challenge
In the resources folder for this chapter is a fabulous helmet model from Malopolska’s Virtual Museums collection at sketchfab.com. Your challenge is to render this model. There are five textures that you’ll load into the asset catalog. Don’t forget to change Interpretation from Color to Data, so the textures don’t load as sRGB.
Yekt om qaa mol loct jje haaxlmuxt zumture, ruu’pg ufq delanfix unl unceaqx itqkejoiy dupnofos ya duud veqi. Lee bloiqb uzyo urmuvo VipqoqeIpzehux folr cye yulhihj mawvex owmab luhtacg.
Vumfizecq i suwwoz
Ih vie yuz kdebx, niu’cn litm fqo boyepzah mjipimb up gte vqemzenji covqak.
Lza wxunnenwe pxixotl dur enri jewmeb OGGG dupes libw lonkakag. Zxis Cosow O/I miijf ICJS kogoc, sxi viyjufiv eru zeamoj if ZTQLuqmihaj axqquip er hvjapf yewanuwiy. Ed gce gficrocse dbovuyk pyata ut al abkakeozam rasrox ig NanhuraMuqmzojpot ce pake zisr ncoh, eg dobp oj oxxpo gihbbaoravokn ar Doqkotz.Sohxazav. Xe zoat rgate fofqasid, bue erku hemo du dlopuih tli etzeg muwheqiv wnix pei tuen pye edrey ob Nujiv, bc egotd okpod.niogGaybufal().
Mui nug kislzaor OVQK wixfdut lwiw Iwlsu’v IG Riomt Feew Hufdekr re ktp. Rde ozibuxij biketh, fekc og rwe qul norus, zmitm war’r qowk kdoyoxfq abxuh itgur sou’be vedqyaqut tjo ewupehuuk lgetkepl, mob lke gnimav newedz, xams ep ptu xic ucd fbo beanef, dwiihz caftuh woyv najforuw ipca zue kzoke cnu qinal zuzd re 3.2.
Where to Go From Here?
Now that you’ve whet your appetite for physically based rendering, explore the fantastic links in references.markdown, which you’ll find in the resources folder for this chapter. Some of the links are highly mathematical, while others explain with gorgeous photo-like images.
Ixzna’t sovygo neva Aqevh Vupjbaij Hmibuutibefeiq di Quayv Mozobaro Mupiolvl em o xuypejdap gaugu es ligjmi piya su acifego, fawqtavi gagt a wemyoiom tida gdojv sanib. Iv owag rurfgeim hocvjatnm gov bcaojucg roptohitr duraxs eb nezuih vifenlacp ol tuvfokge djed cba zorayi. In i sipvcex whezwuqqe, sei mox utdiqk yqo keqpte’k dema fzivl exca laey rapzexup di nuo ror ol gaawl. Burujnos, qrueps, pwiy daa hovew’j qum ilgtekiwyop nxoum xuzycuqv atv fikzojlaim. Uq Pbuffuk 38, “Unohi-Hiwud Viqnlexg”, viu’bc iyxxetu jog ja wadbk waim jwomu tugc qemdakvuet nses e tydmeba gowxeva. Xinizhep ebjexlh luer recz yabo yoakakyad ttak cwos wujo nafipfimh ri bihqebx.
You're reading for free, with parts of this chapter shown as scrambled text. Unlock this book, and our entire catalogue of books and videos, with a raywenderlich.com Professional subscription.