Ano ang mga shaders sa laro?

Ang sikreto ko

Panimula

Ang mundo ng 3D graphics, kabilang ang paglalaro, ay puno ng mga termino. Mga terminong hindi palaging may tanging tamang kahulugan. Minsan ang parehong mga bagay ay tinatawag na naiiba, at kabaliktaran, ang parehong epekto ay maaaring tawagin sa mga setting ng laro alinman sa "HDR", pagkatapos ay "Bloom", pagkatapos ay "Glow", o "Postprocessing". Karamihan sa mga tao, mula sa ipinagmamalaki ng mga developer tungkol sa kung ano ang kanilang binuo sa kanilang graphics engine, ay hindi naiintindihan kung ano talaga ang ibig nilang sabihin.

Nilalayon ng artikulo na tulungan kang maunawaan kung ano ang ibig sabihin ng ilan sa mga salitang ito, na kadalasang ginagamit sa mga ganitong kaso. Sa loob ng balangkas ng artikulong ito, hindi namin pag-uusapan ang lahat ng mga tuntunin ng 3D graphics, ngunit tungkol lamang sa mga naging mas laganap kamakailan bilang mga natatanging tampok at teknolohiya na ginagamit sa mga makina ng graphics ng laro at bilang mga pangalan para sa mga graphic na setting ng mga modernong laro. Upang magsimula, lubos kong inirerekumenda na pamilyar ka sa iyong sarili.

Kung ang isang bagay sa artikulong ito at sa mga artikulo ni Alexander ay hindi malinaw sa iyo, pagkatapos ay makatuwiran na magsimula mula sa pinakamaagang, na may. Ang mga artikulong ito ay medyo luma na, siyempre, ngunit ang pangunahing, pinakapangunahing at mahalagang data ay naroroon. Pag-uusapan natin ang higit pang "mataas na antas" na mga termino. Dapat ay mayroon kang pangunahing pag-unawa sa real-time na 3D graphics at ang graphics pipeline. Sa kabilang banda, huwag asahan ang mga mathematical formula, akademikong katumpakan at mga halimbawa ng code - hindi iyon ang nilayon ng artikulong ito. Mga tuntunin

Listahan ng mga terminong inilarawan sa artikulo:

Ang isang shader sa isang malawak na kahulugan ay isang programa para sa biswal na pagtukoy sa ibabaw ng isang bagay. Ito ay maaaring isang paglalarawan ng pag-iilaw, pag-texture, post-processing, atbp. Ang mga shader ay lumago mula sa gawain ng Cook (Cook's shade trees) at Perlin (Perlin's pixel stream language). source shaders, surface shaders, displacement shaders, volume shader, imager shader Ang mga shader na ito ay kadalasang ginagawa sa software ng mga unibersal na processor at wala nang ganap na pagpapatupad ng hardware idinisenyo para sa pagpabilis ng hardware: ang PixelFlow system (Olano. at Lastra), Quake Shader Language (ginamit ng id Software sa graphics engine ng Quake III na laro, na naglalarawan ng multi-pass rendering), at iba pa, si Peercy at iba pa ay nakabuo ng isang diskarte upang payagan ang mga program na may mga loop at kundisyon na tumakbo sa mga tradisyonal na arkitektura ng hardware gamit ang maramihang mga rendering pass ay hinati sa maraming pass, na pinagsama sa isang framebuffer. Nang maglaon, lumitaw ang mga wika na nakikita natin ang hardware na pinabilis sa DirectX at OpenGL. Ito ay kung paano iniangkop ang mga shader para sa mga real-time na graphics application.

Ang mga maagang video chip ay hindi na-program at nagsagawa lamang ng mga pre-program na aksyon (fixed-function), halimbawa, ang lighting algorithm ay mahigpit na naayos sa hardware, at walang mababago. Pagkatapos, unti-unting ipinakilala ng mga tagagawa ng video chip ang mga elemento ng programmability sa kanilang mga chip, sa una ay napakahina ng mga kakayahan nito (NV10, na kilala bilang NVIDIA GeForce 256, ay may kakayahan na sa ilang primitive na programa), na hindi nakatanggap ng suporta sa software sa Microsoft DirectX API , ngunit sa Paglipas ng panahon, ang mga posibilidad ay patuloy na lumalawak. Ang susunod na hakbang ay para sa parehong NV20 (GeForce 3) at NV2A (video chip na ginamit sa Microsoft Xbox game console), na naging unang chips na may suporta sa hardware para sa DirectX API shaders. Ang Bersyon ng Shader Model 1.0/1.1, na lumabas sa DirectX 8, ay napakalimitado; Kasunod nito, pinahusay ang Shader Model 1 (SM1 sa madaling salita) gamit ang bersyon 1.4 ng Pixel Shaders (ATI R200), na nag-aalok ng higit na kakayahang umangkop ngunit masyadong limitado sa mga kakayahan. Ang mga shader noong panahong iyon ay isinulat sa tinatawag na assembly shader language, na malapit sa assembly language para sa mga unibersal na processor. Ang mababang antas nito ay nagdudulot ng ilang partikular na kahirapan sa pag-unawa ng code at programming, lalo na kapag malaki ang program code, dahil malayo ito sa kagandahan at istruktura ng mga modernong programming language.

Ang Shader Model 2.0 (SM2), na lumabas sa DirectX 9 (na sinusuportahan ng ATI R300 video chip, na naging unang GPU na sumuporta sa shader model version 2.0), seryosong pinalawak ang mga kakayahan ng real-time shaders, na nag-aalok ng mas mahaba at higit pa kumplikadong mga shader at isang kapansin-pansing pinalawak na hanay ng mga utos. Ang kakayahang kalkulahin ang lumulutang na punto sa mga pixel shader ay idinagdag, na isa ring malaking pagpapabuti. Ang DirectX 9, na kinakatawan ng mga kakayahan ng SM2, ay nagpasimula rin ng isang high-level shader language (HLSL), na halos kapareho sa wikang C. At isang mahusay na compiler na nagsasalin ng mga programa ng HLSL sa mababang antas ng code na "maiintindihan" para sa hardware. Bukod dito, maraming mga profile ang magagamit, na idinisenyo para sa iba't ibang mga arkitektura ng hardware. Ngayon, ang isang developer ay maaaring magsulat ng isang HLSL shader code at i-compile ito gamit ang DirectX sa pinakamainam na programa para sa naka-install na video chip ng user. Pagkatapos nito, lumabas ang mga chips mula sa NVIDIA, NV30 at NV40, na nagpabuti ng mga kakayahan ng mga shader ng hardware nang isang hakbang, pagdaragdag ng mas mahabang shader, ang kakayahang mag-dynamic na mga transition sa vertex at pixel shaders, ang kakayahang mag-sample ng mga texture mula sa vertex shaders, atbp. . Simula noon, walang mga pagbabago sa husay hindi, inaasahan ang mga ito sa pagtatapos ng 2006 sa DirectX 10...

Sa pangkalahatan, nagdagdag ang mga shader ng maraming bagong kakayahan sa graphics pipeline para sa pagbabago at pag-iilaw ng mga vertex at pag-customize ng pagpoproseso ng pixel sa paraang gusto ng bawat developer ng application. Gayunpaman, ang mga kakayahan ng mga shader ng hardware ay hindi pa rin ganap na nahayag sa mga application, at sa pagtaas ng kanilang mga kakayahan sa bawat bagong henerasyon ng hardware, makikita natin sa lalong madaling panahon ang antas ng parehong mga shader ng RenderMan na minsan ay tila hindi matamo para sa mga gaming video accelerators. Sa ngayon, sa mga real-time na shader na modelo na sinusuportahan ng mga hardware video accelerators ngayon, dalawang uri lang ng shader ang tinutukoy: at (sa DirectX 9 API definition). Sa hinaharap, nangangako ang DirectX 10 na magdagdag ng .

Vertex Shader

Ang mga shader ng Vertex ay mga programang isinagawa ng mga video chip na nagsasagawa ng mga operasyong matematika na may mga vertex (vertex, na bumubuo sa mga 3D na bagay sa mga laro), sa madaling salita, nagbibigay sila ng kakayahang magsagawa ng mga programmable algorithm para sa pagbabago ng mga parameter ng vertices at ang kanilang pag-iilaw (T&L - Pagbabago at Pag-iilaw) . Ang bawat vertex ay tinutukoy ng ilang mga variable, halimbawa, ang posisyon ng isang vertex sa 3D space ay tinutukoy ng mga coordinate: x, y at z. Ang mga vertex ay maaari ding ilarawan sa pamamagitan ng mga katangian ng kulay, mga coordinate ng texture, atbp. Ang mga vertex shader, depende sa mga algorithm, ay nagbabago sa data na ito sa panahon ng kanilang trabaho, halimbawa, pagkalkula at pagsulat ng mga bagong coordinate at/o kulay. Ibig sabihin, ang input data ng vertex shader ay data tungkol sa isang vertex ng geometric na modelo na kasalukuyang pinoproseso. Kadalasan ang mga ito ay mga spatial na coordinate, normal, mga bahagi ng kulay at mga coordinate ng texture. Ang resultang data ng naisakatuparan na programa ay nagsisilbing input para sa karagdagang bahagi ng pipeline ang rasterizer ay gumagawa ng isang linear na interpolation ng input data para sa ibabaw ng tatsulok at nagpapatupad ng kaukulang pixel shader para sa bawat pixel. Isang napaka-simple at krudo (ngunit malinaw, umaasa ako) halimbawa: pinapayagan ka ng vertex shader na kumuha ng 3D sphere object at gamitin ang vertex shader para gumawa ng berdeng kubo mula rito :).

Bago ang pagdating ng NV20 video chip, may dalawang pagpipilian ang mga developer: alinman ay gumamit ng sarili nilang mga programa at algorithm na nagbabago sa mga parameter ng vertices, ngunit pagkatapos ay ang lahat ng mga kalkulasyon ay gagawin ng CPU (software T&L), o umaasa sa mga nakapirming algorithm sa video chips, na may suporta para sa pagbabago ng hardware at pag-iilaw (hardware T&L ). Ang pinakaunang modelo ng DirectX shader ay nangangahulugan ng isang malaking hakbang pasulong mula sa mga fixed function para sa transformation at vertex lighting hanggang sa ganap na programmable na mga algorithm. Naging posible, halimbawa, na ganap na isagawa ang skinning algorithm sa mga video chips, at bago iyon ang tanging posibilidad ay isagawa ang mga ito sa mga unibersal na central processor. Ngayon, sa mga kakayahan na lubos na napabuti mula noong panahon ng nabanggit na NVIDIA chip, marami kang magagawa sa mga vertex gamit ang vertex shaders (maliban sa paglikha ng mga ito, marahil)...

Mga halimbawa ng kung paano at saan ginagamit ang mga vertex shader:

Pixel Shader

Ang mga pixel shader ay mga programang isinagawa ng video chip sa panahon ng rasterization para sa bawat pixel ng larawan; Ang lahat ng mga tagubilin sa pixel shader ay isinasagawa sa isang pixel-by-pixel na batayan pagkatapos makumpleto ang pagbabagong-anyo at pagpapailaw ng geometry. Bilang resulta ng trabaho nito, ang pixel shader ay gumagawa ng panghuling halaga ng kulay ng pixel at Z-value para sa kasunod na yugto ng graphics pipeline, blending. Ang pinakasimpleng halimbawa ng isang pixel shader na maaaring ibigay ay: banal na multitexturing, simpleng paghahalo ng dalawang texture (halimbawa, nagkakalat at lightmap) at inilalapat ang resulta ng pagkalkula sa pixel.

Bago ang pagdating ng mga video chips na may suporta sa hardware para sa mga pixel shader, mayroon lamang ang mga developer ng mga kakayahan ng conventional multitexturing at alpha blending, na makabuluhang naglimita sa mga kakayahan ng maraming visual effect at hindi nagpapahintulot sa kanila na gawin ang marami sa kung ano ang magagamit na ngayon. At habang posible pa ring gumawa ng isang bagay gamit ang geometry na programmatically, hindi ito posible sa mga pixel. Ang mga unang bersyon ng DirectX (hanggang sa 7.0 inclusive) ay palaging nagsagawa ng lahat ng kalkulasyon sa bawat vertex at nag-aalok ng napakalimitadong functionality para sa per-pixel lighting (tandaan ang EMBM - environment bump mapping at DOT3) sa mga pinakabagong bersyon. Ginawang posible ng mga pixel shader na maipaliwanag ang anumang pixel sa ibabaw sa pamamagitan ng pixel gamit ang mga materyales na na-program ng mga developer. Ang mga pixel shaders na bersyon 1.1 (sa DirectX na kahulugan) na lumabas sa NV20 ay hindi lang makakagawa ng multitexturing, ngunit higit pa, kahit na karamihan sa mga laro na gumagamit ng SM1 ay gumagamit lang ng tradisyonal na multitexturing sa karamihan ng mga surface, na gumaganap ng mas kumplikadong mga pixel shader lamang sa bahagi ng mga surface. , para sa paglikha ng iba't ibang mga espesyal na epekto (alam ng lahat na ang tubig pa rin ang pinakakaraniwang halimbawa ng paggamit ng mga pixel shader sa mga laro). Ngayon, pagkatapos ng pagdating ng SM3 at ang mga video chips na sumusuporta sa kanila, ang mga kakayahan ng mga pixel shader ay lumago hanggang sa punto na maaari pa silang magamit upang gumawa ng ray tracing, kahit na may ilang mga limitasyon.

Mga halimbawa ng paggamit ng mga pixel shader:

Mga Tekstura ng Pamamaraan

Ang mga texture na pamamaraan ay mga texture na inilalarawan ng mga mathematical formula. Ang ganitong mga texture ay hindi kumukuha ng puwang sa memorya ng video; ang mga ito ay nilikha ng isang pixel shader sa mabilisang pagkuha ng bawat elemento (texel) bilang isang resulta ng pagpapatupad ng kaukulang mga utos ng shader. Ang pinakakaraniwang mga texture ng pamamaraan ay: iba't ibang uri ng ingay (halimbawa, fractal noise), kahoy, tubig, lava, usok, marmol, apoy, atbp., iyon ay, ang mga medyo madaling ilarawan sa matematika. Nagbibigay-daan din sa iyo ang mga texture na pamamaraan na gumamit ng mga animated na texture na may kaunting pagbabago lamang sa mga mathematical formula. Halimbawa, ang mga ulap na ginawa sa ganitong paraan ay mukhang medyo disente sa parehong dynamic at statically.

Kasama rin sa mga bentahe ng mga texture na pamamaraan ang isang walang limitasyong antas ng detalye para sa bawat texture ay hindi magkakaroon ng pixelation ay palaging nabuo sa laki na kinakailangan para sa display nito; Ang animated na isa ay din ng mahusay na interes; sa tulong nito maaari kang gumawa ng mga alon sa tubig, nang hindi gumagamit ng paunang nakalkula na mga animated na texture. Ang isa pang bentahe ng gayong mga texture ay ang mas maraming mga ito ang ginagamit sa isang produkto, mas kaunting trabaho para sa mga artist (bagaman higit pa para sa mga programmer) upang lumikha ng mga regular na texture.

Sa kasamaang palad, ang mga texture ng pamamaraan ay hindi pa nakakatanggap ng wastong paggamit sa mga laro, sa mga totoong aplikasyon ay madalas na mas madaling mag-load ng isang regular na texture, ang mga volume ng memorya ng video ay lumalaki nang mabilis, ang pinaka-modernong mga accelerator ay mayroon nang 512 megabytes ng nakalaang memorya ng video, na higit pa sa kailangan. Bukod dito, madalas pa rin nilang ginagawa ang kabaligtaran - upang mapabilis ang matematika sa mga pixel shader, gumagamit sila ng mga lookup table (LUTs) - mga espesyal na texture na naglalaman ng mga pre-calculated values ​​na nakuha bilang resulta ng mga kalkulasyon. Upang hindi na kailangang magbilang ng ilang mga utos sa matematika para sa bawat pixel, binabasa lang nila ang mga paunang nakalkulang halaga mula sa texture. Ngunit sa karagdagang, mas dapat na lumipat ang diin sa mga kalkulasyon sa matematika, kunin ang parehong bagong henerasyong ATI video chips: RV530 at R580, na mayroong 12 at 48 pixel na processor para sa bawat 4 at 16 na texture unit, ayon sa pagkakabanggit. Bukod dito, kung pinag-uusapan natin ang tungkol sa mga 3D na texture, dahil habang ang mga 2D na texture ay maaaring ilagay sa lokal na memorya ng accelerator nang walang mga problema, ang mga 3D na texture ay nangangailangan ng higit pa rito.

Mga halimbawa ng mga texture ng pamamaraan:

Bump Mapping/Specular Bump Mapping

Ang bump mapping ay isang pamamaraan para sa pagtulad sa mga iregularidad (o pagmomodelo ng microrelief, ayon sa gusto mo) sa isang patag na ibabaw nang walang mataas na gastos sa pag-compute at pagbabago ng geometry. Para sa bawat pixel sa ibabaw, ang pagkalkula ng pag-iilaw ay isinasagawa batay sa mga halaga sa isang espesyal na mapa ng taas na tinatawag na bumpmap. Ito ay karaniwang isang 8-bit na itim at puti na texture at ang mga halaga ng kulay ng texture ay hindi namamapa tulad ng mga regular na texture, ngunit ginagamit upang ilarawan ang pagkamagaspang ng ibabaw. Tinutukoy ng kulay ng bawat texel ang taas ng kaukulang punto ng kaluwagan; ang mas malaking halaga ay nangangahulugan ng mas mataas na taas sa ibabaw ng orihinal na ibabaw, at ang mas maliit na mga halaga ay nangangahulugan ng mas maliit na taas. O vice versa.

Ang antas ng pag-iilaw ng isang punto ay depende sa anggulo ng saklaw ng mga light ray. Kung mas maliit ang anggulo sa pagitan ng normal at light ray, mas malaki ang pag-iilaw ng isang surface point. Iyon ay, kung kukuha ka ng isang patag na ibabaw, kung gayon ang mga normal sa bawat punto ay magiging pareho at ang pag-iilaw ay magiging pareho din. At kung ang ibabaw ay hindi pantay (sa katunayan, halos lahat ng mga ibabaw sa katotohanan), kung gayon ang mga normal sa bawat punto ay magkakaiba. At ang pag-iilaw ay naiiba, sa isang punto ito ay magiging higit pa, sa isa pa - mas kaunti. Kaya naman ang prinsipyo ng bumpmapping - upang magmodelo ng mga iregularidad, ang mga surface normal ay itinakda para sa iba't ibang punto ng polygon, na isinasaalang-alang kapag kinakalkula ang pixel-by-pixel na pag-iilaw. Ang resulta ay isang mas natural na imahe ng ibabaw ng bump mapping ay nagbibigay sa ibabaw ng higit na detalye, tulad ng mga iregularidad sa isang ladrilyo, mga pores sa balat, atbp., nang hindi pinapataas ang geometric na kumplikado ng modelo, dahil ang mga kalkulasyon ay isinasagawa sa antas ng pixel. Bukod dito, kapag ang posisyon ng pinagmumulan ng liwanag ay nagbabago, ang pag-iilaw ng mga iregularidad na ito ay nagbabago nang tama.

Siyempre, ang pag-iilaw ng vertex ay mas simple sa pagkalkula, ngunit mukhang masyadong hindi makatotohanan, lalo na sa medyo mababa ang polygon na geometry para sa bawat pixel ay hindi maaaring magparami ng mga halaga na mas malaki kaysa sa mga kinakalkula na halaga para sa mga vertex; Iyon ay, ang mga pixel sa gitna ng tatsulok ay hindi maaaring maging mas maliwanag kaysa sa mga fragment na malapit sa vertex. Dahil dito, ang mga lugar na may biglaang pagbabago sa pag-iilaw, tulad ng mga highlight at pinagmumulan ng liwanag na napakalapit sa ibabaw, ay pisikal na hindi ipapakita, at lalo itong mapapansin sa dynamics. Siyempre, ang problema ay maaaring bahagyang malutas sa pamamagitan ng pagtaas ng geometric na kumplikado ng modelo, paghahati nito sa isang mas malaking bilang ng mga vertices at triangles, ngunit ang pinakamahusay na pagpipilian ay ang pixel-by-pixel na pag-iilaw.

Upang magpatuloy, kinakailangan na alalahanin ang mga bahagi ng pag-iilaw. Ang kulay ng isang surface point ay kinakalkula bilang ang kabuuan ng ambient, diffuse at specular na bahagi mula sa lahat ng pinagmumulan ng liwanag sa eksena (perpekto mula sa lahat, marami ang madalas na napapabayaan). Ang kontribusyon sa halagang ito mula sa bawat pinagmumulan ng liwanag ay depende sa distansya sa pagitan ng pinagmumulan ng liwanag at isang punto sa ibabaw.

Mga bahagi ng ilaw:

Ngayon, magdagdag tayo ng bumpmapping dito:

Ang uniporme (ambient) na bahagi ng pag-iilaw ay approximation, ang "initial" na pag-iilaw para sa bawat punto sa eksena, kung saan ang lahat ng mga punto ay pantay na iluminado at ang pag-iilaw ay hindi nakasalalay sa iba pang mga kadahilanan.
Ang nagkakalat na bahagi ng pag-iilaw ay nakasalalay sa posisyon ng pinagmumulan ng pag-iilaw at sa normal na ibabaw. Ang bahagi ng pag-iilaw na ito ay iba para sa bawat vertex ng bagay, na nagbibigay sa kanila ng volume. Hindi na pinupuno ng liwanag ang ibabaw ng parehong lilim.
Ang specular na bahagi ng pag-iilaw ay nagpapakita ng sarili sa silaw ng pagmuni-muni ng mga sinag ng liwanag mula sa isang ibabaw. Upang kalkulahin ito, bilang karagdagan sa vector ng posisyon ng pinagmumulan ng liwanag at ang normal, dalawa pang vector ang ginagamit: ang vector ng direksyon sa pagtingin at ang vector ng reflection. Ang specular lighting model ay unang iminungkahi ni Phong Bui-Tong. Ang mga glare na ito ay makabuluhang nagpapataas ng pagiging totoo ng imahe, dahil ang mga bihirang tunay na ibabaw ay hindi nagpapakita ng liwanag, kaya ang specular na bahagi ay napakahalaga. Lalo na sa paggalaw, dahil ang glare ay agad na nagpapakita ng pagbabago sa posisyon ng camera o mismong bagay. Kasunod nito, ang mga mananaliksik ay nakabuo ng iba pang mga paraan upang makalkula ang sangkap na ito, mas kumplikado (Blinn, Cook-Torrance, Ward), na isinasaalang-alang ang pamamahagi ng liwanag na enerhiya, ang pagsipsip nito ng mga materyales at pagkalat sa anyo ng isang nagkakalat na bahagi.

Kaya, ang Specular Bump Mapping ay nakuha sa ganitong paraan:

At tingnan natin ang parehong bagay gamit ang halimbawa ng laro, Call of Duty 2:


Ang unang fragment ng larawan ay nagre-render nang walang bumpmapping () sa lahat, ang pangalawa (itaas sa kanan) ay bumpmapping nang walang specular component, ang pangatlo - na may specular component ng normal na value, na ginagamit sa laro, at ang huli. , sa kanang ibaba - na may pinakamataas na posibleng halaga ng specular na bahagi.

Tulad ng para sa unang application ng hardware, ang ilang mga uri ng bump mapping (Emboss Bump Mapping) ay nagsimulang gamitin noong mga araw ng mga video card batay sa NVIDIA Riva TNT chips, ngunit ang mga diskarte noong panahong iyon ay napaka-primitive at hindi malawakang ginagamit. Ang susunod na kilalang uri ay Environment Mapped Bump Mapping (EMBM), ngunit sa oras na iyon ang Matrox video card lamang ang may suporta sa hardware para dito sa DirectX, at muli ay napakalimitado ang paggamit nito. Pagkatapos ay lumitaw ang Dot3 Bump Mapping at ang mga video chip noong panahong iyon (GeForce 256 at GeForce 2) ay nangangailangan ng tatlong pass upang ganap na maisagawa ang gayong mathematical algorithm, dahil limitado ang mga ito sa dalawang texture na ginamit nang sabay-sabay. Simula sa NV20 (GeForce3), naging posible na gawin ang parehong bagay sa isang pass gamit ang mga pixel shader. Karagdagan - higit pa. Nagsimulang gumamit ng mas mabisang pamamaraan, tulad ng.

Mga halimbawa ng paggamit ng bumpmapping sa mga laro:


Ang Displacement Mapping ay isang pamamaraan para sa pagdaragdag ng detalye sa mga 3D na bagay. Hindi tulad ng bump mapping at iba pang mga pixel-by-pixel na pamamaraan, kapag ang taas ng mga mapa ay nagmomodelo lamang ng pag-iilaw ng isang punto, ngunit hindi binabago ang posisyon nito sa espasyo, na nagbibigay lamang ng ilusyon ng pagtaas ng pagiging kumplikado ng ibabaw, pinapayagan ka ng mga mapa ng displacement. upang makakuha ng tunay na kumplikadong 3D na mga bagay mula sa mga vertice at polygon, nang walang mga paghihigpit, na likas sa mga pamamaraan ng pixel-by-pixel. Binabago ng pamamaraang ito ang posisyon ng mga vertice ng mga tatsulok, inililipat ang mga ito kasama ang normal sa pamamagitan ng isang halaga batay sa mga halaga sa mga mapa ng displacement. Ang isang displacement map ay karaniwang isang itim at puting texture, at ang mga halaga nito ay ginagamit upang matukoy ang taas ng bawat punto sa ibabaw ng bagay (ang mga halaga ay maaaring maimbak bilang 8-bit o 16-bit na mga numero), katulad ng isang bumpmap. Kadalasan, ginagamit ang mga mapa ng displacement (kung saan tinatawag din itong mga mapa ng taas) upang likhain ang ibabaw ng lupa na may mga burol at mga depresyon. Dahil ang terrain ay inilalarawan ng isang 2D displacement map, medyo madali itong i-deform kung kinakailangan, dahil kailangan lang nitong baguhin ang displacement map at mag-render ng surface batay dito sa susunod na frame.

Ang paglikha ng isang landscape gamit ang overlay ng mga mapa ng displacement ay malinaw na ipinapakita sa larawan. Ang mga panimulang punto ay 4 na vertices at 2 polygons, at ang resulta ay isang ganap na piraso ng landscape.

Ang malaking bentahe ng pag-overlay ng mga mapa ng displacement ay hindi lamang ang kakayahang magdagdag ng detalye sa isang ibabaw, ngunit ang halos kumpletong paglikha ng isang bagay. Ang isang low-polygon na bagay ay kinuha at hinati (tesellated) sa isang mas malaking bilang ng mga vertices at polygons. Ang mga vertex na nagreresulta mula sa tessellation ay inililipat nang normal batay sa halagang nabasa sa displacement map. Bilang resulta, nakakakuha kami ng isang kumplikadong 3D na bagay mula sa isang simple, gamit ang naaangkop na mapa ng displacement:


Ang bilang ng mga tatsulok na nilikha ng tessellation ay dapat sapat na malaki upang makuha ang lahat ng detalyeng tinukoy ng mapa ng displacement. Minsan ang mga karagdagang tatsulok ay awtomatikong nilikha gamit ang mga N-patch o iba pang mga pamamaraan. Ang mga mapa ng displacement ay pinakamahusay na ginagamit kasabay ng bump mapping upang lumikha ng maliliit na detalye kung saan sapat ang tamang pixel-by-pixel na pag-iilaw.

Ang overlay ng mapa ng displacement ay unang suportado sa DirectX 9.0. Ito ang unang bersyon ng API na ito upang suportahan ang Displacement Mapping technique. Sinusuportahan ng DX9 ang dalawang uri ng mga overlay ng mapa ng displacement, na-filter at na-presample. Ang unang paraan ay suportado ng nakalimutan na ngayong MATROX Parhelia video chip, at ang pangalawa - ng ATI RADEON 9700. Naiiba ang Filtered method dahil pinapayagan ka nitong gumamit ng mip level para sa mga displacement na mapa at maglapat ng trilinear na pag-filter sa kanila. Sa pamamaraang ito, ang antas ng mip ng displacement map ay pinili para sa bawat vertex batay sa distansya mula sa vertex hanggang sa camera, iyon ay, awtomatikong pinipili ang antas ng detalye. Sa ganitong paraan, nakakamit ang halos pare-parehong dibisyon ng eksena, kapag ang mga tatsulok ay humigit-kumulang sa parehong laki.

Ang overlay ng displacement na mapa ay maaaring ituring na isang geometry compression technique na binabawasan ang dami ng memorya na kinakailangan para sa isang partikular na detalye ng isang 3D na modelo. Ang masalimuot na data ng geometry ay pinapalitan ng mga simpleng 2D displacement texture, karaniwang 8-bit o 16-bit. Binabawasan nito ang memorya at mga kinakailangan sa bandwidth na kailangan para makapaghatid ng geometry data sa video chip, na ilan sa mga pinakamalaking hadlang sa mga system ngayon. O, na may pantay na bandwidth at mga kinakailangan sa memorya, pinahihintulutan ng displacement map overlay ang paggamit ng higit pang geometrically complex na mga modelong 3D. Ang paggamit ng mga modelo na hindi gaanong kumplikado, kapag ang mga yunit ng libu-libo ay ginagamit sa halip na sampu o daan-daang libong mga tatsulok, ay ginagawang posible na mapabilis ang kanilang animation. O pagbutihin ito sa pamamagitan ng paggamit ng mas kumplikadong mga kumplikadong algorithm at diskarte, gaya ng cloth simulation.

Ang isa pang benepisyo ay ang paggamit ng mga mapa ng displacement ay ginagawang maraming 2D na texture ang kumplikadong 3D polygonal mesh na mas madaling iproseso. Halimbawa, para sa organisasyon, maaari kang gumamit ng regular na mip mapping para mag-overlay ng mga displacement na mapa. Gayundin, sa halip na medyo kumplikadong 3D mesh compression algorithm, maaari mong gamitin ang mga nakasanayang pamamaraan ng texture compression, kahit na tulad ng JPEG. At para sa pamamaraang paggawa ng mga 3D na bagay, maaari kang gumamit ng mga karaniwang algorithm para sa mga 2D na texture.

Ngunit ang mga mapa ng displacement ay mayroon ding ilang mga limitasyon; Halimbawa, ang mga makinis na bagay na hindi naglalaman ng maraming pinong detalye ay mas mahusay na kakatawanin ng mga karaniwang polygon mesh o iba pang mas mataas na antas na mga ibabaw gaya ng Bezier curves. Sa kabilang banda, ang mga napakakomplikadong modelo tulad ng mga puno o halaman ay hindi rin madaling kinakatawan ng mga mapa ng displacement. Mayroon ding mga problema sa kadalian ng paggamit; ito ay halos palaging nangangailangan ng mga espesyal na kagamitan, dahil napakahirap direktang lumikha ng mga mapa ng displacement (maliban kung pinag-uusapan natin ang tungkol sa mga simpleng bagay, tulad ng isang landscape). Marami sa mga problema at limitasyon ng mga mapa ng displacement ay kapareho ng sa , dahil ang dalawang pamamaraan ay mahalagang dalawang magkaibang representasyon ng magkatulad na ideya.

Bilang halimbawa mula sa mga totoong laro, magbibigay ako ng laro na gumagamit ng texture sampling mula sa vertex shader, isang feature na lumabas sa NVIDIA NV40 video chips at shader model 3.0. Maaaring gamitin ang vertex texturing para sa isang simpleng paraan ng pag-overlay ng mga mapa ng displacement, na ganap na ginawa ng video chip, nang walang tessellation (paghahati sa mas malaking bilang ng mga tatsulok). Limitado ang paggamit ng naturang algorithm; Halimbawa, ito ay isang pag-render ng malalaking ibabaw ng tubig, gaya ng ginawa sa larong Pacific Fighters:


Ang normal na pagmamapa ay isang pinahusay na bersyon ng bump mapping technique na inilarawan kanina, isang pinalawak na bersyon nito. Ang bump mapping ay binuo ni Blinn noong 1978; Habang binabago lang ng bumpmapping ang kasalukuyang normal para sa mga surface point, ganap na pinapalitan ng normal na pagmamapa ang mga normal sa pamamagitan ng pag-sample ng kanilang mga value mula sa isang espesyal na inihandang normal na mapa. Ang mga mapa na ito ay karaniwang mga texture na may paunang kinakalkula na mga normal na halaga na nakaimbak sa mga ito, na ipinakita bilang mga bahagi ng kulay ng RGB (gayunpaman, may mga espesyal na format para sa mga normal na mapa, kabilang ang compression), sa kaibahan sa 8-bit na itim at puting mga mapa ng taas sa bumpmapping .

Sa pangkalahatan, tulad ng bumpmapping, isa rin itong "murang" na paraan para sa pagdaragdag ng detalye sa mga modelong medyo mababa ang geometric complexity, nang hindi gumagamit ng mas totoong geometry, mas advanced lang. Ang isa sa mga pinaka-kagiliw-giliw na aplikasyon ng pamamaraan ay isang makabuluhang pagtaas sa detalye ng mga modelong low-polygon gamit ang mga normal na mapa na nakuha sa pamamagitan ng pagproseso ng parehong modelo ng mataas na geometric complexity. Ang mga normal na mapa ay naglalaman ng mas detalyadong paglalarawan ng ibabaw kumpara sa bump mapping at nagbibigay-daan sa iyo na kumatawan sa mas kumplikadong mga hugis. Ang mga ideya para sa pagkuha ng impormasyon mula sa mga napakadetalyadong bagay ay ipinahayag noong kalagitnaan ng 90s ng huling siglo, ngunit pagkatapos ay pinag-uusapan nila ang paggamit nito para sa . Nang maglaon, noong 1998, ipinakita ang mga ideya tungkol sa paglilipat ng mga detalye sa anyo ng mga normal na mapa mula sa mga modelong may mataas na polygon patungo sa mga mababang polygon.

Ang mga normal na mapa ay nagbibigay ng mas mahusay na paraan upang mag-imbak ng detalyadong data sa ibabaw kaysa sa simpleng paggamit ng malaking bilang ng mga polygon. Ang kanilang tanging seryosong limitasyon ay hindi sila masyadong angkop para sa malalaking detalye, dahil ang normal na pagmamapa ay hindi aktwal na nagdaragdag ng mga polygon o binabago ang hugis ng bagay, lumilikha lamang ito ng hitsura nito. Isa lamang itong simulation ng mga detalye, batay sa mga kalkulasyon ng pag-iilaw sa antas ng pixel. Ito ay kapansin-pansin sa matinding polygons ng bagay at sa malalaking anggulo ng pagkahilig ng ibabaw. Samakatuwid, ang pinaka-makatwirang paraan upang magamit ang normal na pagmamapa ay ang gawing sapat na detalyado ang modelong low-poly upang mapanatili ang pangunahing hugis ng bagay, at gumamit ng mga normal na mapa upang magdagdag ng mga mas pinong detalye.

Karaniwang ginagawa ang mga normal na mapa mula sa dalawang bersyon ng modelo, low-poly at high-poly. Ang isang low-poly na modelo ay binubuo ng isang minimum na geometry, ang mga pangunahing hugis ng bagay, habang ang isang high-poly na modelo ay naglalaman ng lahat ng kailangan para sa maximum na detalye. Pagkatapos, gamit ang mga espesyal na kagamitan, inihambing ang mga ito sa bawat isa, ang pagkakaiba ay kinakalkula at nakaimbak sa isang texture na tinatawag na isang normal na mapa. Kapag nililikha ito, maaari ka ring gumamit ng bump map para sa napakaliit na mga detalye na hindi maaaring i-modelo kahit na sa isang high-poly na modelo (mga pores ng balat, iba pang maliliit na depresyon).

Ang mga normal na mapa ay orihinal na kinakatawan bilang mga regular na texture ng RGB, kung saan ang mga bahagi ng kulay ng R, G, at B (0 hanggang 1) ay binibigyang-kahulugan bilang X, Y, at Z na mga coordinate Ang bawat texel sa isang normal na mapa ay kinakatawan bilang normal ng isang punto sa ibabaw. Ang mga normal na mapa ay maaaring may dalawang uri: na may mga coordinate sa espasyo ng modelo (general coordinate system) o tangent space (ang termino sa Russian ay "tangent space", ang lokal na coordinate system ng isang tatsulok). Ang pangalawang pagpipilian ay mas madalas na ginagamit. Kapag ang mga normal na mapa ay ipinakita sa espasyo ng modelo, dapat silang magkaroon ng tatlong bahagi, dahil ang lahat ng mga direksyon ay maaaring katawanin, at kapag nasa lokal na coordinate system tangent space, pagkatapos ay maaari kang makakuha ng may dalawang bahagi, at ang pangatlo ay maaaring makuha sa pixel shader.

Ang mga modernong real-time na application ay mas mababa pa rin sa pre-render na animation sa mga tuntunin ng kalidad ng imahe, ito ay nag-aalala, una sa lahat, ang kalidad ng pag-iilaw at ang geometric na kumplikado ng mga eksena. Limitado ang bilang ng mga vertices at triangles na kinakalkula sa real time. Samakatuwid, ang mga pamamaraan na nagpapababa sa dami ng geometry ay napakahalaga. Ang ilang mga naturang pamamaraan ay binuo bago ang normal na pagmamapa, ngunit ang mga low-poly na modelo, kahit na may bump mapping, ay kapansin-pansing mas masahol pa kaysa sa mas kumplikadong mga modelo. Normal na pagmamapa, bagama't mayroon itong ilang mga disbentaha (ang pinaka-halata ay dahil ang modelo ay nananatiling low-poly, ito ay madaling makita sa pamamagitan ng mga angular na hangganan nito), ngunit ang panghuling kalidad ng pag-render ay kapansin-pansing napabuti, na iniiwan ang geometric complexity ng mga modelo na mababa. . Kamakailan, ang pagtaas ng katanyagan ng diskarteng ito at ang paggamit nito sa lahat ng mga sikat na engine ng laro ay malinaw na nakikita. Ang "sisisi" para dito ay isang kumbinasyon ng mahusay na nagreresultang kalidad at isang sabay-sabay na pagbawas sa mga kinakailangan para sa geometric na kumplikado ng mga modelo. Ang normal na pamamaraan ng pagmamapa ay ginagamit na ngayon sa halos lahat ng dako, lahat ng mga bagong laro ay ginagamit ito nang malawak hangga't maaari. Narito lamang ang isang maikling listahan ng mga kilalang laro sa PC gamit ang normal na pagmamapa: Far Cry, Doom 3, Half-Life 2, Call of Duty 2, F.E.A.R., Quake 4. Lahat sila ay mukhang mas mahusay kaysa sa mga laro ng nakaraan, gayundin dahil sa paggamit ng maps normals.

Mayroon lamang isang negatibong kahihinatnan ng paggamit ng diskarteng ito - isang pagtaas sa dami ng mga texture. Pagkatapos ng lahat, ang normal na mapa ay lubos na nakakaimpluwensya sa kung ano ang magiging hitsura ng bagay, at ito ay dapat na isang medyo malaking resolusyon, kaya ang mga kinakailangan para sa memorya ng video at ang bandwidth nito ay doble (sa kaso ng hindi naka-compress na mga normal na mapa). Ngunit ngayon ang mga video card na may 512 megabytes ng lokal na memorya ay ginagawa na, ang bandwidth nito ay patuloy na lumalaki, ang mga pamamaraan ng compression ay partikular na binuo para sa mga normal na mapa, kaya ang mga maliliit na paghihigpit na ito ay hindi masyadong mahalaga, sa katunayan. Ang epekto na ibinibigay ng normal na pagmamapa ay mas malaki, na nagpapahintulot sa paggamit ng mga medyo low-poly na mga modelo, binabawasan ang mga kinakailangan sa memorya para sa pag-iimbak ng geometric na data, pagpapabuti ng pagganap at pagbibigay ng isang napaka disenteng visual na resulta.

Parallax Mapping/Offset Mapping

Ang normal na pagmamapa, na binuo noong 1984, ay sinundan ng Relief Texture Mapping, na ipinakilala nina Olivera at Bishop noong 1999. Ito ay isang paraan para sa texture mapping batay sa malalim na impormasyon. Ang pamamaraan ay hindi ginamit sa mga laro, ngunit ang ideya nito ay nag-ambag sa pagpapatuloy ng trabaho sa paralaks na pagmamapa at pagpapabuti nito. Ipinakilala ni Kaneko ang parallax mapping noong 2001, na siyang unang epektibong paraan para sa pagpapakita ng parallax effect sa isang pixel-by-pixel na batayan. Noong 2004, ipinakita ng Welsh ang paggamit ng parallax mapping sa mga programmable video chips.

Ang pamamaraang ito ay malamang na may pinakamaraming iba't ibang mga pangalan. Ililista ko ang mga nakilala ko: Parallax Mapping, Offset Mapping, Virtual Displacement Mapping, Per-Pixel Displacement Mapping. Para sa maikli, ginagamit ng artikulo ang unang pamagat.
Ang Parallaxmapping ay isa pang alternatibo sa bumpmapping at normalmapping techniques, na nagbibigay ng mas malawak na insight sa mga detalye sa ibabaw, mas naturalistic na pag-render ng mga 3D surface, nang walang masyadong pagkawala sa performance. Ang pamamaraan na ito ay katulad ng displacement mapping at normal na pagmamapa sa parehong oras, ito ay isang bagay sa pagitan. Ang pamamaraan ay idinisenyo din upang magpakita ng mas maraming detalye sa ibabaw kaysa sa naroroon sa orihinal na geometric na modelo. Ito ay katulad ng normal na pagmamapa, ngunit ang kaibahan ay ang pamamaraan ay pinipilipit ang texture mapping sa pamamagitan ng pagpapalit ng texture coordinates upang kapag tiningnan mo ang ibabaw mula sa iba't ibang mga anggulo, ito ay lumilitaw na matambok, bagaman sa katotohanan ang ibabaw ay flat at hindi nagbabago. . Sa madaling salita, ang Parallax Mapping ay isang pamamaraan para sa pagtatantya ng epekto ng pag-aalis ng mga surface point depende sa mga pagbabago sa punto ng view.

Ang pamamaraan ay nagbabago ng mga coordinate ng texture (kaya naman kung minsan ang pamamaraan ay tinatawag na offset mapping) upang ang ibabaw ay lumilitaw na mas makapal. Ang ideya ng pamamaraan ay upang ibalik ang mga coordinate ng texture ng punto kung saan ang view vector ay nagsalubong sa ibabaw. Nangangailangan ito ng ray tracing (ray tracing) para sa taas na mapa, ngunit kung wala itong masyadong nagbabagong mga halaga ("smooth" o "smooth"), maaaring gumawa ng approximation. Ang pamamaraang ito ay mabuti para sa mga ibabaw na may maayos na pagbabago ng taas, nang hindi kinakalkula ang mga intersection at malalaking halaga ng displacement. Ang simpleng algorithm na ito ay naiiba sa normal na pagmamapa sa tatlong pixel shader na tagubilin lamang: dalawang mathematical na tagubilin at isang karagdagang texture fetch. Pagkatapos kalkulahin ang bagong texture coordinate, pagkatapos ay gagamitin ito upang basahin ang iba pang mga texture layer: base texture, normal na mapa, atbp. Ang pamamaraang ito ng parallax mapping sa modernong video chips ay halos kasing epektibo ng regular na texture mapping, at ang resulta nito ay isang mas makatotohanang surface display kumpara sa simpleng normal na pagmamapa.

Ngunit ang paggamit ng maginoo na paralaks na pagmamapa ay limitado sa mga mapa ng taas na may maliit na pagkakaiba sa mga halaga. Ang mga "matarik" na iregularidad ay hindi naproseso ng algorithm, lumilitaw ang iba't ibang mga artifact, mga texture na "lumulutang," atbp. Maraming binagong pamamaraan ang binuo upang mapabuti ang parallax mapping technique. Ang ilang mga mananaliksik (Yerex, Donnelly, Tatarchuk, Policarpo) ay naglarawan ng mga bagong pamamaraan na nagpapabuti sa paunang algorithm. Halos lahat ng mga ideya ay umaasa sa ray tracing sa isang pixel shader upang matukoy kung paano nagsalubong ang mga feature sa ibabaw sa isa't isa. Nakatanggap ang mga binagong diskarte ng ilang iba't ibang pangalan: Parallax Mapping na may Occlusion, Parallax Mapping na may Distance Functio ns, Parallax Occlusion Mapping. Para sa maikli, tatawagin namin silang lahat ng Parallax Occlusion Mapping.

Kasama rin sa mga paraan ng Parallax Occlusion Mapping ang ray tracing upang matukoy ang mga taas at isaalang-alang ang visibility ng mga texel. Pagkatapos ng lahat, kapag tiningnan sa isang anggulo sa ibabaw, ang mga texel ay nakakubli sa isa't isa, at isinasaalang-alang ito, maaari kang magdagdag ng higit na lalim sa paralaks na epekto. Ang nagreresultang imahe ay nagiging mas makatotohanan at ang gayong mga pinahusay na pamamaraan ay maaaring gamitin para sa mas malalim na kaluwagan; ito ay mahusay para sa paglalarawan ng mga pader ng ladrilyo at bato, mga pavement, atbp. Lalo na dapat tandaan na ang pangunahing pagkakaiba sa pagitan ng Parallax Mapping at Displacement Mapping ay ang mga kalkulasyon lahat ay per-pixel, at hindi nakumpleto. Iyon ang dahilan kung bakit ang pamamaraan ay may mga pangalan tulad ng Virtual Displacement Mapping at Per-Pixel Displacement Mapping. Tingnan ang larawan, mahirap paniwalaan, ngunit ang mga pavement stone dito ay isang pixel-by-pixel effect lamang:

Ang pamamaraan ay nagbibigay-daan sa iyo na mahusay na magpakita ng mga detalyadong ibabaw nang walang milyun-milyong vertex at tatsulok na kakailanganin kung ipapatupad ito ng geometry. Kasabay nito, pinapanatili ang mataas na detalye (maliban sa mga silweta/gilid) at ang mga kalkulasyon ng animation ay makabuluhang pinasimple. Ang diskarteng ito ay mas mura kaysa sa paggamit ng totoong geometry at gumagamit ng mas kaunting mga polygon, lalo na sa mga kaso na may napakaliit na detalye. Mayroong maraming mga application para sa algorithm, ngunit ito ay pinakaangkop para sa mga bato, brick at iba pa.

Gayundin, ang isang karagdagang benepisyo ay ang mga mapa ng taas ay maaaring magbago nang pabago-bago (ibabaw ng tubig na may mga alon, mga butas ng bala sa mga dingding at marami pang iba). Ang mga disadvantages ng pamamaraan ay ang kakulangan ng geometrically correct silhouettes (mga gilid ng object), dahil ang algorithm ay pixel-by-pixel at hindi totoong displacement mapping. Ngunit nakakatipid ito ng pagganap sa anyo ng pinababang pagkarga sa pagbabagong-anyo, pag-iilaw at animation ng geometry. Nagse-save ng memory ng video na kailangan para mag-imbak ng malalaking volume ng data ng geometry. Ang teknolohiya ay may bentahe ng medyo simpleng pagsasama sa mga umiiral na application at ang paggamit ng mga pamilyar na kagamitan na ginagamit para sa normal na pagmamapa sa panahon ng operasyon.

Ang pamamaraan ay ginamit na sa mga totoong laro kamakailan. Sa ngayon, nakakakuha sila ng simpleng paralaks na pagmamapa batay sa mga static na mapa ng taas, nang walang ray tracing o mga kalkulasyon ng intersection. Narito ang mga halimbawa ng paggamit ng parallax mapping sa mga laro:

Postprocessing

Sa isang malawak na kahulugan, ang post-processing ay lahat ng nangyayari pagkatapos ng mga pangunahing hakbang ng pagbuo ng isang imahe. Sa madaling salita, ang post-processing ay anumang mga pagbabago sa larawan pagkatapos itong mai-render. Ang post-processing ay isang hanay ng mga tool para sa paglikha ng mga espesyal na visual effect, at ang mga ito ay nilikha pagkatapos makumpleto ang pangunahing gawain sa paggunita sa eksena, iyon ay, isang handa na raster na imahe ay ginagamit upang lumikha ng mga post-processing effect.

Isang simpleng halimbawa mula sa photography: nakuhanan mo ng larawan ang isang magandang lawa na may mga halaman sa maaliwalas na panahon. Ang kalangitan ay lumiwanag na napakaliwanag, at ang mga puno ay masyadong madilim. Nag-load ka ng larawan sa isang graphics editor at nagsimulang baguhin ang liwanag, contrast at iba pang mga parameter para sa mga seksyon ng larawan o para sa buong larawan. Ngunit wala ka nang pagkakataong baguhin ang mga setting ng camera; Ito ay post-processing. O isa pang halimbawa: pag-highlight sa background sa isang portrait na larawan at paglalapat ng blur filter sa lugar na ito para sa depth of field effect na may mas malalim. Ibig sabihin, kapag binago o itinama mo ang isang frame sa isang graphics editor, ginagawa mo ang post-processing. Ang parehong bagay ay maaaring gawin sa laro, sa real time.

Mayroong maraming iba't ibang mga pagpipilian para sa pagproseso ng isang imahe pagkatapos na ito ay nai-render. Ang lahat ay malamang na nakakita ng maraming tinatawag na mga graphic na filter sa mga graphic editor. Ito mismo ang tinatawag na post-filters: blur, edge detection, sharpen, noise, smooth, emboss, atbp. Kapag inilapat sa real-time na 3D rendering, ito ay ginagawa nang ganito - ang buong eksena ay nai-render sa isang espesyal na lugar, render target, at pagkatapos ng pangunahing pag-render ang larawang ito ay higit pang pinoproseso gamit ang mga pixel shader at pagkatapos ay ipinapakita lamang sa screen. Ang pinakakaraniwang ginagamit na post-processing effect sa mga laro ay , , . Mayroong maraming iba pang mga post-effect: ingay, flare, distortion, sepia, atbp.

Narito ang ilang mga kapansin-pansing halimbawa ng post-processing sa mga application ng gaming:

High Dynamic Range (HDR)

Ang High Dynamic Range (HDR), kapag inilapat sa 3D graphics, ay nagre-render sa isang malawak na dynamic range. Ang kakanyahan ng HDR ay upang ilarawan ang intensity at kulay gamit ang mga tunay na pisikal na dami. Ang isang karaniwang modelo para sa paglalarawan ng isang imahe ay RGB, kung saan ang lahat ng mga kulay ay kinakatawan bilang ang kabuuan ng mga pangunahing kulay na pula, berde at asul, na may iba't ibang intensity hangga't maaari, mga halaga ng integer mula 0 hanggang 255 para sa bawat isa, na naka-encode sa walong bits bawat kulay. . Ang ratio ng maximum hanggang minimum na intensity na available para ipakita ng isang partikular na modelo o device ay tinatawag na dynamic range. Kaya, ang dynamic na hanay ng modelong RGB ay 256:1 o 100:1 cd/m 2 (dalawang order ng magnitude). Ang modelong ito para sa paglalarawan ng kulay at intensity ay karaniwang tinatawag na Low Dynamic Range (LDR).

Ang mga posibleng halaga ng LDR para sa lahat ng mga kaso ay malinaw na hindi sapat, ang isang tao ay nakakakita ng isang mas malaking saklaw, lalo na sa mahinang ilaw, at ang modelo ng RGB ay masyadong limitado sa mga ganitong kaso (at sa mataas na intensity din). Ang dynamic na hanay ng paningin ng tao ay mula 10 -6 hanggang 10 8 cd/m 2, iyon ay, 100000000000000: 1 (14 na order ng magnitude). Hindi namin makita ang buong hanay sa parehong oras, ngunit ang hanay na nakikita ng mata sa anumang partikular na oras ay humigit-kumulang katumbas ng 10,000:1 (apat na mga order ng magnitude). Ang paningin ay umaangkop sa mga halaga mula sa isa pang bahagi ng saklaw ng pag-iilaw nang paunti-unti, gamit ang tinatawag na adaptasyon, na madaling mailarawan ng sitwasyon ng pag-off ng mga ilaw sa isang silid sa gabi - sa una ang mga mata ay kakaunti ang nakikita, ngunit sa paglipas ng panahon sila ay umaangkop sa mga nabagong kondisyon ng pag-iilaw at nakikita ang higit pa. Ang parehong bagay ay nangyayari kapag bumalik ka mula sa isang madilim na kapaligiran patungo sa isang maliwanag.

Kaya, ang dynamic na hanay ng modelo ng paglalarawan ng RGB ay hindi sapat upang kumatawan sa mga imahe na nakikita ng isang tao sa katotohanan, ang modelong ito ay makabuluhang binabawasan ang mga posibleng halaga ng light intensity sa itaas at ibabang bahagi ng saklaw. Ang pinakakaraniwang halimbawang binanggit sa mga materyal na HDR ay isang larawan ng isang madilim na silid na may bintana papunta sa isang maliwanag na kalye sa isang maaraw na araw. Gamit ang modelong RGB, maaari kang makakuha ng alinman sa isang normal na pagpapakita ng kung ano ang nasa labas ng bintana, o kung ano lamang ang nasa loob ng silid. Ang mga value na higit sa 100 cd/m2 ay karaniwang pinuputol sa LDR, kaya naman nahihirapan ang 3D rendering na maayos na ipakita ang maliwanag na pinagmumulan ng liwanag na direktang nakaturo sa camera.

Ang mga data display device mismo ay hindi pa maaaring seryosong mapabuti, ngunit makatuwirang iwanan ang LDR sa mga kalkulasyon, maaari mong gamitin ang mga tunay na pisikal na dami ng intensity at kulay (o mga linearly proportional), at ipakita ang maximum na magagawa nito sa monitor. Ang kakanyahan ng representasyon ng HDR ay ang paggamit ng mga halaga ng intensity at kulay sa mga totoong pisikal na dami o mga linearly proporsyonal at gumamit ng mga floating point na numero na may mataas na katumpakan (halimbawa, 16 o 32 bits) sa halip na mga integer. Aalisin nito ang mga limitasyon ng modelong RGB, at ang dynamic na hanay ng imahe ay tataas nang malaki. Ngunit pagkatapos ay anumang HDR na imahe ay maaaring ipakita sa anumang display medium (ang parehong RGB monitor), na may pinakamataas na posibleng kalidad para dito gamit ang mga espesyal na algorithm.

Nagbibigay-daan sa amin ang pag-render ng HDR na baguhin ang pagkakalantad pagkatapos naming i-render ang larawan. Ginagawa nitong posible na gayahin ang epekto ng adaptasyon ng paningin ng tao (paglipat mula sa maliwanag na bukas na mga puwang patungo sa madilim na mga silid at kabaliktaran), nagbibigay-daan para sa pisikal na tamang pag-iilaw, at isa ring pinag-isang solusyon para sa paglalapat ng mga post-processing effect (glare, flares, bloom. , lumabo ang paggalaw). Ang mga algorithm sa pagpoproseso ng larawan, pagwawasto ng kulay, pagwawasto ng gamma, pag-blur ng paggalaw, pamumulaklak at iba pang mga pamamaraan ng post-processing ay mas mahusay na gumanap sa representasyon ng HDR.

Sa mga real-time na 3D rendering application (mga laro, pangunahin), ang HDR rendering ay nagsimulang gamitin hindi pa katagal, dahil nangangailangan ito ng mga kalkulasyon at pag-render ng target na suporta sa mga floating-point na format, na sa unang pagkakataon ay naging available lang sa mga video chips na sumusuporta. DirectX 9. Ang karaniwang landas ng pag-render ng HDR sa mga laro ay ang mga sumusunod: pag-render ng eksena sa isang floating-point na format na buffer, post-processing ng imahe sa pinahabang hanay ng kulay (pagbabago ng contrast at liwanag, balanse ng kulay, glare at motion blur effect , lens flare at iba pa), gamit ang tone mapping para i-output ang huling HDR na imahe sa LDR display device. Minsan ang mga mapa ng kapaligiran ay ginagamit sa mga format ng HDR para sa mga static na pagmuni-muni sa mga bagay; Dito maaari kang magdagdag ng mga light na mapa, paunang nakalkula at na-save sa HDR na format. Karamihan sa itaas ay ginawa, halimbawa, sa Half-Life 2: Lost Coast.

Ang pag-render ng HDR ay lubhang kapaki-pakinabang para sa kumplikadong post-processing na may mas mataas na kalidad kumpara sa mga karaniwang pamamaraan. Magiging mas makatotohanan ang parehong pamumulaklak kapag kinakalkula sa modelo ng HDR view. Halimbawa, tulad ng ginagawa sa larong Far Cry mula sa Crytek, gumagamit ito ng mga karaniwang pamamaraan ng pag-render ng HDR: ang paggamit ng mga bloom filter na ipinakilala ng Kawase at ang tone mapping operator na si Reinhard.

Sa kasamaang palad, sa ilang mga kaso, maaaring itago ng mga developer ng laro sa ilalim ng pangalang HDR ang isang bloom filter lamang na kinakalkula sa karaniwang hanay ng LDR. At habang ang karamihan sa ginagawa ng mga laro sa HDR rendering ngayon ay mas mahusay na kalidad ng pamumulaklak, ang mga benepisyo ng HDR rendering ay hindi limitado sa isang post-effect na ito, ito lang ang pinakamadaling gawin.

Iba pang mga halimbawa ng paggamit ng HDR rendering sa mga real-time na application:


Ang tone mapping ay ang proseso ng pag-convert ng HDR luminance range sa LDR range na ipinapakita ng isang output device, gaya ng monitor o printer, dahil ang pag-output ng HDR na mga imahe sa mga ito ay mangangailangan ng pag-convert ng dynamic range at color gamut ng HDR model sa katumbas na dynamic na hanay ng LDR, kadalasan ang modelo ng RGB. Pagkatapos ng lahat, ang hanay ng liwanag na ipinakita sa HDR ay napakalawak; ito ay ilang mga order ng ganap na dynamic na hanay sa isang pagkakataon, sa isang eksena. At ang hanay na maaaring kopyahin sa maginoo na mga aparato ng output (mga monitor, TV) ay halos dalawang order ng magnitude ng dynamic na hanay.

Ang conversion mula sa HDR sa LDR ay tinatawag na tone mapping; ito ay lossy at ginagaya ang mga katangian ng paningin ng tao. Ang ganitong mga algorithm ay karaniwang tinatawag na tone mapping operator. Hinahati ng mga operator ang lahat ng mga halaga ng liwanag ng imahe sa tatlong magkakaibang uri: madilim, katamtaman at maliwanag. Batay sa pagtatantya ng liwanag ng midtone, ang pangkalahatang pag-iilaw ay inaayos, ang mga halaga ng liwanag ng mga pixel ng eksena ay muling ipinamamahagi upang makapasok sa hanay ng output, ang mga dark pixel ay lumiliwanag, at ang mga light pixel ay nagdidilim. Pagkatapos, ang pinakamaliwanag na mga pixel sa larawan ay binabawasan sa hanay ng output device o output view model. Ipinapakita ng sumusunod na larawan ang pinakasimpleng conversion ng isang HDR na imahe sa hanay ng LDR, isang linear na pagbabagong-anyo, at isang mas kumplikadong tone mapping operator na inilalapat sa fragment sa gitna, gumagana tulad ng inilarawan sa itaas:

Makikita na sa paggamit lamang ng nonlinear tone mapping maaari kang makakuha ng maximum na mga detalye sa larawan, at kung linearly mong i-convert ang HDR sa LDR, maraming maliliit na detalye ang mawawala. Walang iisang tamang tone mapping algorithm may ilang mga operator na nagbibigay ng magagandang resulta sa iba't ibang sitwasyon. Narito ang isang malinaw na halimbawa ng dalawang magkaibang tone mapping operator:

Kasama ng HDR rendering, ang tone mapping ay nagsimulang gamitin kamakailan sa mga laro. Naging posible na opsyonal na gayahin ang mga katangian ng paningin ng tao: pagkawala ng katalinuhan sa madilim na mga eksena, pagbagay sa mga bagong kondisyon ng pag-iilaw kapag lumilipat mula sa napakaliwanag na mga lugar patungo sa madilim at kabaligtaran, pagiging sensitibo sa mga pagbabago sa kaibahan, kulay... Ito ay kung ano ang hitsura ng pagtulad sa kakayahan ng paningin na umangkop sa larong Far Cry. Ang unang screenshot ay nagpapakita ng larawan na nakikita ng player pagkatapos lamang lumiko mula sa isang madilim na silid patungo sa isang maliwanag na bukas na espasyo, at ang pangalawa ay nagpapakita ng parehong larawan makalipas ang ilang segundo, pagkatapos ng adaptasyon.

Bloom

Ang Bloom ay isa sa mga cinematic post-processing effect na ginagawang mas maliwanag ang pinakamaliwanag na bahagi ng larawan. Ito ang epekto ng napakaliwanag na liwanag, na nagpapakita ng sarili sa anyo ng isang glow sa paligid ng maliwanag na mga ibabaw Pagkatapos ilapat ang bloom filter, ang mga naturang ibabaw ay hindi lamang nakakatanggap ng karagdagang liwanag, ang liwanag mula sa kanila (halo) ay bahagyang nakakaapekto sa mas madilim na mga lugar na katabi ng. ang maliwanag na mga ibabaw sa frame. Ang pinakamadaling paraan upang ipakita ito ay sa isang halimbawa:

Sa Bloom 3D graphics, ang isang filter ay ginawa gamit ang karagdagang post-processing - paghahalo ng isang frame na blur na may isang blur filter (ang buong frame o ang mga indibidwal na maliliwanag na lugar nito, ang filter ay karaniwang inilalapat nang maraming beses) at ang orihinal na frame. Isa sa mga pinakakaraniwang ginagamit na bloom post-filter algorithm sa mga laro at iba pang real-time na application ay:

  • Ang eksena ay na-render sa isang framebuffer, ang glow intensity ng mga bagay ay naitala sa alpha channel ng buffer.
  • Ang framebuffer ay kinopya sa isang espesyal na texture para sa pagproseso.
  • Ang resolution ng texture ay nabawasan, halimbawa, ng 4 na beses.
  • Ang mga blur na filter ay inilalapat sa larawan nang maraming beses batay sa data ng intensity na naitala sa alpha channel.
  • Ang resultang imahe ay halo-halong sa orihinal na frame sa framebuffer, at ang resulta ay ipinapakita sa screen.

Tulad ng iba pang uri ng post-processing, ang bloom ay pinakamahusay na ginagamit para sa high dynamic range (HDR) rendering. Mga karagdagang halimbawa ng pagpoproseso ng huling bloom na larawan gamit ang isang filter mula sa mga real-time na 3D na application:

Motion Blur

Ang motion blur ay nangyayari sa photography at film dahil sa paggalaw ng mga bagay sa frame sa panahon ng exposure time ng frame habang nakabukas ang lens shutter. Ang frame na kinunan ng camera (larawan, pelikula) ay hindi nagpapakita ng larawang kinunan kaagad, na may zero na tagal. Dahil sa mga teknolohikal na limitasyon, ang frame ay nagpapakita ng isang tiyak na tagal ng panahon, kung saan ang mga bagay sa frame ay maaaring lumipat sa isang tiyak na distansya, at kung mangyari ito, ang lahat ng mga posisyon ng gumagalaw na bagay sa panahon ng bukas na shutter ng lens ay ipapakita sa ang frame bilang isang blur na imahe sa kahabaan ng motion vector . Nangyayari ito kung ang bagay ay gumagalaw nang may kaugnayan sa camera o ang camera na may kaugnayan sa bagay, at ang dami ng blur ay nagbibigay sa amin ng ideya kung gaano kabilis ang paggalaw ng bagay.

Sa three-dimensional na animation, sa bawat partikular na sandali sa oras (frame), ang mga bagay ay matatagpuan sa ilang partikular na coordinate sa three-dimensional na espasyo, katulad ng isang virtual camera na may walang katapusang bilis ng shutter. Bilang resulta, wala ang pag-blur, katulad ng nararanasan ng camera at ng mata ng tao kapag tumitingin sa mga bagay na mabilis na gumagalaw. Mukhang hindi natural at hindi makatotohanan. Isaalang-alang natin ang isang simpleng halimbawa: maraming sphere ang umiikot sa isang partikular na axis. Narito ang isang larawan ng kung ano ang magiging hitsura ng paggalaw na ito nang may at walang blur:

Mula sa isang imahe na walang blur, hindi mo masasabi kung ang mga sphere ay gumagalaw o hindi, habang ang motion blur ay nagbibigay ng isang malinaw na ideya ng bilis at direksyon ng paggalaw ng mga bagay. Siyanga pala, ang kakulangan ng motion blur ay isa ring dahilan kung bakit ang paggalaw sa mga laro sa 25-30 frames per second ay tila maalog, kahit na ang mga pelikula at video ay mukhang mahusay sa parehong mga parameter ng frame rate. Upang mabayaran ang kakulangan ng motion blur, alinman sa isang mataas na frame rate (60 frames per second o mas mataas) o ang paggamit ng mga karagdagang pamamaraan sa pagpoproseso ng imahe upang tularan ang motion blur effect ay kanais-nais. Ito ay ginagamit upang mapabuti ang kinis ng animation at para sa epekto ng photo at film realism sa parehong oras.

Ang pinakasimpleng motion blur algorithm para sa mga real-time na application ay ang paggamit ng data mula sa mga nakaraang animation frame upang i-render ang kasalukuyang frame. Ngunit mayroon ding mga mas epektibo at modernong paraan ng pag-blur ng paggalaw na hindi gumagamit ng mga nakaraang frame, ngunit nakabatay sa mga vector ng paggalaw ng mga bagay sa frame, at nagdaragdag din ng isa pang hakbang sa post-processing sa proseso ng pag-render. Ang blur effect ay maaaring maging full screen (karaniwang ginagawa sa post-processing) o para sa indibidwal, pinakamabilis na gumagalaw na bagay.

Mga posibleng aplikasyon ng motion blur effect sa mga laro: lahat ng racing game (upang lumikha ng epekto ng napakabilis na paggalaw at para magamit kapag nanonood ng mga replay sa TV), sports games (parehong mga replay, at sa laro mismo ang blur ay maaaring gamitin para sa napaka mabilis na gumagalaw na mga bagay, tulad ng bola o pak), fighting game (mabibilis na paggalaw ng mga bladed na armas, braso at binti), marami pang ibang laro (sa panahon ng in-game na 3D cutscenes sa makina). Narito ang mga halimbawa ng paggamit ng motion blur post-effect mula sa mga laro:

Depth Of Field (DOF)

Ang depth of field, sa madaling salita, ay ang pag-blur ng mga bagay depende sa kanilang posisyon na may kaugnayan sa focus ng camera. Sa totoong buhay, sa mga litrato at sa mga pelikula, hindi natin nakikita ang lahat ng mga bagay nang pantay na malinaw; Ang mga optika ng larawan at pelikula ay may isang tiyak na distansya, ang mga bagay na matatagpuan sa layo na ito mula sa camera ay nakatutok at matalim ang hitsura sa larawan, at ang mga bagay na mas malayo sa camera o mas malapit dito ay tumingin, sa kabaligtaran, malabo, ang sharpness ay unti-unting bumababa habang tumataas o bumababa ang distansya.

Tulad ng maaaring nahulaan mo, ito ay isang larawan, hindi isang rendering. Sa computer graphics, ang bawat bagay sa nai-render na imahe ay ganap na malinaw, dahil ang mga lente at optika ay hindi ginagaya sa panahon ng mga kalkulasyon. Samakatuwid, upang makamit ang pagiging totoo ng larawan at pelikula, kailangan mong gumamit ng mga espesyal na algorithm upang makagawa ng katulad na bagay para sa mga graphics ng computer. Ginagaya ng mga diskarteng ito ang epekto ng iba't ibang focus para sa mga bagay sa iba't ibang distansya.

Ang isang karaniwang diskarte para sa real-time na pag-render ay ang paghalo sa orihinal na frame at isang blur na bersyon nito (maraming pass ng blur filter) batay sa depth data para sa mga pixel ng imahe. Sa mga laro, ang DOF effect ay may ilang gamit, halimbawa, in-game cutscenes sa game engine, replay sa mga larong pang-sports at karera. Mga halimbawa ng depth of field sa real time:

Antas ng Detalye (LOD)

Ang antas ng detalye sa mga 3D na application ay isang paraan ng pagbawas sa pagiging kumplikado ng pag-render ng isang frame, pagbabawas ng kabuuang bilang ng mga polygon, texture at iba pang mapagkukunan sa eksena, at sa pangkalahatan ay binabawasan ang pagiging kumplikado nito. Isang simpleng halimbawa: ang pangunahing modelo ng karakter ay binubuo ng 10,000 polygons. Sa mga kaso kung saan ito ay matatagpuan malapit sa camera sa naprosesong eksena, mahalaga na ang lahat ng mga polygon ay ginagamit, ngunit sa isang napakalaking distansya mula sa camera sa huling larawan ay sasakupin lamang nito ang ilang mga pixel, at walang punto. sa pagproseso ng lahat ng 10,000 polygons. Marahil sa kasong ito, isang daang polygons, o kahit isang pares ng mga piraso, at isang espesyal na inihandang texture ay sapat na upang ipakita ang modelo sa humigit-kumulang sa parehong paraan. Alinsunod dito, sa mga katamtamang distansya, makatuwirang gumamit ng isang modelo na binubuo ng isang mas malaking bilang ng mga tatsulok kaysa sa pinakasimpleng modelo at mas kaunti kaysa sa pinaka kumplikado.

Karaniwang ginagamit ang paraan ng LOD kapag nagmomodelo at nagre-render ng mga 3D na eksena, gamit ang maraming antas ng pagiging kumplikado (geometric o kung hindi man) para sa mga bagay, na proporsyonal sa layo ng mga ito mula sa camera. Ang pamamaraan ay kadalasang ginagamit ng mga developer ng laro upang bawasan ang bilang ng mga polygon sa isang eksena at pagbutihin ang pagganap. Kapag matatagpuan malapit sa camera, ginagamit ang mga modelong may maximum na detalye (bilang ng mga tatsulok, laki ng texture, pagiging kumplikado ng pagkakatext), para sa pinakamataas na posibleng kalidad ng larawan, at kabaliktaran, kapag inalis ang mga modelo sa camera, mga modelong may mas kaunting tatsulok. ay ginagamit upang mapataas ang bilis ng pag-render. Ang pagpapalit ng pagiging kumplikado, lalo na, ang bilang ng mga tatsulok sa modelo, ay maaaring awtomatikong mangyari batay sa isang 3D na modelo ng maximum na pagiging kumplikado, o maaaring batay sa ilang pre-prepared na mga modelo na may iba't ibang antas ng detalye. Sa pamamagitan ng paggamit ng mga modelong may mas pinong detalye sa iba't ibang distansya, ang tinantyang pagiging kumplikado ng pag-render ay nababawasan nang hindi pinapababa ang kabuuang detalye ng larawan.

Ang pamamaraan ay lalong epektibo kung ang bilang ng mga bagay sa eksena ay malaki at ang mga ito ay matatagpuan sa iba't ibang distansya mula sa camera. Halimbawa, kumuha tayo ng larong pampalakasan, gaya ng hockey o football simulator. Ang mga modelo ng low-poly na character ay ginagamit kapag malayo ang mga ito sa camera, at kapag lumalapit sila, ang mga modelo ay papalitan ng iba na may mas mataas na bilang ng mga polygon. Ang halimbawang ito ay napaka-simple at ipinapakita nito ang kakanyahan ng pamamaraan batay sa dalawang antas ng detalye ng modelo, ngunit walang sinuman ang nag-abala na lumikha ng ilang mga antas ng detalye upang ang epekto ng pagbabago ng antas ng LOD ay hindi masyadong kapansin-pansin, upang ang unti-unting "lumalaki" ang mga detalye habang papalapit ang bagay.

Bilang karagdagan sa distansya mula sa camera, maaaring mahalaga din ang iba pang mga kadahilanan para sa LOD - ang kabuuang bilang ng mga bagay sa screen (kapag may isa o dalawang character sa frame, mga kumplikadong modelo ang ginagamit, at kapag mayroong 10-20 , lumipat sila sa mas simple) o ang bilang ng mga frame sa bawat segundo (nakatakda ang mga limitasyon ng mga halaga ng FPS kung saan nagbabago ang antas ng detalye, halimbawa, na may FPS na mas mababa sa 30 binabawasan namin ang pagiging kumplikado ng mga modelo sa screen, at sa 60, sa kabaligtaran, dinadagdagan namin ito). Ang iba pang posibleng salik na nakakaimpluwensya sa antas ng detalye ay ang bilis ng paggalaw ng isang bagay (malamang na hindi ka magkaroon ng oras upang makita ang isang rocket na gumagalaw, ngunit madali mong makita ang isang snail), ang kahalagahan ng karakter mula sa isang gaming point of view (kumuha ng parehong football - para sa modelo ng player na kinokontrol mo, maaari kang gumamit ng mas kumplikadong geometry at mga texture, makikita mo ito na pinakamalapit at pinakamadalas). Ang lahat ay nakasalalay sa mga kagustuhan at kakayahan ng isang partikular na developer. Ang pangunahing bagay ay hindi labis na labis ito; ang madalas at kapansin-pansin na mga pagbabago sa antas ng detalye ay nakakainis.

Ipaalala ko sa iyo na ang antas ng detalye ay hindi kinakailangang nauugnay lamang sa geometry ang pamamaraan ay maaari ding gamitin upang i-save ang iba pang mga mapagkukunan: kapag nag-texture (bagaman ang mga video chips ay gumagamit na ng mipmapping, kung minsan ay makatuwirang baguhin ang mga texture sa mabilis na paraan sa iba. na may iba't ibang detalye), mga diskarte sa pag-iilaw (ang mga malalapit na bagay ay iniilaw gamit ang isang kumplikadong algorithm, at ang mga malayo - gamit ang isang simple), mga diskarte sa pag-texture (ginagamit ang kumplikadong parallax mapping sa malapit na mga ibabaw, at ang normal na pagmamapa ay ginagamit sa malalayong ibabaw), atbp. .

Hindi napakadali na magpakita ng isang halimbawa mula sa isang laro sa isang banda, ang LOD ay ginagamit sa isang antas o iba pa sa halos bawat laro, sa kabilang banda, hindi laging posible na malinaw na ipakita ito, kung hindi, magkakaroon ng maliit na punto sa LOD mismo.

Ngunit sa halimbawang ito ay malinaw pa rin na ang pinakamalapit na modelo ng kotse ay may pinakamataas na detalye, ang susunod na dalawa o tatlong mga kotse ay napakalapit din sa antas na ito, at ang lahat ng malalayong ay may nakikitang mga pagpapasimple, narito lamang ang pinakamahalaga: walang rear-view mirror, mga plaka ng lisensya, wiper ng windshield at karagdagang kagamitan sa pag-iilaw. At ang pinakamalayong modelo ay walang kahit anino sa kalsada. Ito ang antas ng algorithm ng detalye sa pagkilos.

Pandaigdigang Pag-iilaw

Mahirap gayahin ang makatotohanang pag-iilaw ng eksena; ang bawat sinag ng liwanag sa realidad ay nasasalamin at na-refract nang maraming beses, ang bilang ng mga pagmumuni-muni na ito ay hindi limitado. At sa 3D rendering, ang bilang ng mga reflection ay lubos na nakadepende sa mga kakayahan sa pagkalkula;

Ang mga algorithm ng pag-iilaw ay maaaring nahahati sa dalawang modelo: direkta o lokal na pag-iilaw at pandaigdigang pag-iilaw (direkta o lokal na pag-iilaw at pandaigdigang pag-iilaw). Ang modelo ng lokal na pag-iilaw ay gumagamit ng pagkalkula ng direktang pag-iilaw, liwanag mula sa mga pinagmumulan ng liwanag bago ang unang intersection ng liwanag na may isang opaque na ibabaw, ang pakikipag-ugnayan ng mga bagay sa bawat isa ay hindi isinasaalang-alang. Bagama't sinusubukan ng naturang modelo na mabayaran ito sa pamamagitan ng pagdaragdag ng background o ambient na pag-iilaw, ito ang pinakasimpleng pagtatantya, isang lubos na pinasimpleng pag-iilaw mula sa lahat ng hindi direktang sinag ng mga pinagmumulan ng liwanag, na nagtatakda ng kulay at intensity ng pag-iilaw ng mga bagay sa kawalan ng direktang liwanag. pinagmumulan.

Kinakalkula ng parehong pagsubaybay sa sinag ang pag-iilaw ng mga ibabaw sa pamamagitan lamang ng direktang mga sinag mula sa mga pinagmumulan ng liwanag, at anumang ibabaw, upang maging nakikita, ay dapat na direktang iluminado ng isang pinagmumulan ng liwanag. Ito ay hindi sapat upang makamit ang mga resulta ng photorealistic bilang karagdagan sa direktang pag-iilaw, ang pangalawang pag-iilaw sa pamamagitan ng mga sinag na makikita mula sa iba pang mga ibabaw ay dapat ding isaalang-alang. Sa totoong mundo, ang mga sinag ng liwanag ay tumatalbog sa ibabaw ng maraming beses hanggang sa tuluyang mawala ang mga ito. Ang liwanag ng araw na dumadaan sa isang bintana ay nagpapaliwanag sa buong silid, bagaman ang mga sinag ay hindi direktang maabot ang lahat ng mga ibabaw. Kung mas maliwanag ang pinagmumulan ng liwanag, mas maraming beses itong masasalamin. Ang kulay ng reflective surface ay nakakaapekto rin sa kulay ng sinasalamin na liwanag, halimbawa, ang pulang pader ay magdudulot ng pulang spot sa malapit na puting bagay. Narito ang isang malinaw na pagkakaiba, pagkalkula nang hindi isinasaalang-alang ang pangalawang pag-iilaw at isinasaalang-alang ito:

Sa modelo ng pandaigdigang pag-iilaw, ang pandaigdigang pag-iilaw, ang pag-iilaw ay kinakalkula na isinasaalang-alang ang impluwensya ng mga bagay sa isa't isa, maraming mga pagmuni-muni at mga repraksyon ng mga sinag ng liwanag mula sa mga ibabaw ng mga bagay, mga caustics at pagkalat sa ilalim ng lupa ay isinasaalang-alang. Ang modelong ito ay nagbibigay-daan sa iyo upang makakuha ng isang mas makatotohanang larawan, ngunit kumplikado ang proseso, na nangangailangan ng mas maraming mapagkukunan. Mayroong ilang mga pandaigdigang algorithm ng pag-iilaw, titingnan natin sandali ang radiosity (pagkalkula ng hindi direktang pag-iilaw) at pagma-map ng photon (pagkalkula ng pandaigdigang pag-iilaw batay sa mga mapa ng photon na paunang nakalkula gamit ang pagsubaybay). Mayroon ding mga pinasimpleng pamamaraan para sa pagtulad sa hindi direktang pag-iilaw, tulad ng pagbabago sa pangkalahatang liwanag ng eksena depende sa bilang at liwanag ng mga pinagmumulan ng liwanag sa loob nito o paggamit ng malaking bilang ng mga puntong pinagmumulan ng liwanag na inilagay sa paligid ng eksena upang gayahin ang naaaninag na liwanag, ngunit ito malayo pa rin sa totoong algorithm G.I.

Ang radiosity algorithm ay ang proseso ng pagkalkula ng pangalawang pagmuni-muni ng mga light ray mula sa isang ibabaw patungo sa isa pa, pati na rin mula sa kapaligiran hanggang sa mga bagay. Ang mga sinag mula sa mga pinagmumulan ng liwanag ay sinusubaybayan hanggang ang kanilang lakas ay bumaba sa ibaba ng isang tiyak na antas o ang mga sinag ay umabot sa isang tiyak na bilang ng mga pagmuni-muni. Ito ay isang karaniwang pamamaraan ng GI, ang mga kalkulasyon ay karaniwang ginagawa bago ang pag-render, at ang mga resulta ng pagkalkula ay maaaring gamitin para sa real-time na pag-render. Ang mga pangunahing ideya ng radiosity ay batay sa pisika ng thermal transfer. Ang mga ibabaw ng mga bagay ay nahahati sa maliliit na lugar na tinatawag na mga patches, at ang sinasalamin na liwanag ay ipinapalagay na nakakalat nang pantay-pantay sa lahat ng direksyon. Sa halip na kalkulahin ang bawat sinag para sa mga ilaw, ginagamit ang isang pamamaraan ng pag-average na naghahati sa mga ilaw sa mga patch batay sa mga antas ng enerhiya na ginagawa ng mga ito. Ang enerhiya na ito ay ipinamamahagi nang proporsyonal sa pagitan ng mga patch sa ibabaw.

Ang isa pang paraan para sa pagkalkula ng pandaigdigang pag-iilaw ay iminungkahi ni Henrik Wann Jensen, ito ang paraan ng pagmamapa ng photon. Ang paggamit ng mga photon maps ay isa pang pandaigdigang algorithm ng pag-iilaw batay sa ray tracing at ginagamit upang gayahin ang interaksyon ng mga light ray sa mga bagay sa eksena. Kinakalkula ng algorithm ang pangalawang pagmuni-muni ng mga sinag, repraksyon ng liwanag sa pamamagitan ng mga transparent na ibabaw, at mga nakakalat na pagmuni-muni. Ang pamamaraang ito ay binubuo ng pagkalkula ng pag-iilaw ng mga punto sa ibabaw sa dalawang pass. Ang una ay nagsasangkot ng direktang pagsubaybay sa sinag ng liwanag na may mga pangalawang pagmuni-muni, isang paunang proseso na isinagawa bago ang pangunahing pag-render. Kinakalkula ng pamamaraang ito ang enerhiya ng mga photon na naglalakbay mula sa isang pinagmumulan ng liwanag patungo sa mga bagay sa eksena. Kapag ang mga photon ay umabot sa isang ibabaw, ang intersection point, direksyon, at enerhiya ng photon ay naka-imbak sa isang cache na tinatawag na photon map. Maaaring i-save ang mga mapa ng photon sa disk para magamit sa ibang pagkakataon nang hindi kinakailangang kalkulahin ang mga ito sa bawat frame. Ang mga pagmuni-muni ng photon ay kinakalkula hanggang sa huminto ang operasyon pagkatapos ng isang tiyak na bilang ng mga pagmuni-muni o kapag naabot ang isang tiyak na enerhiya. Kinakalkula ng pangalawang rendering pass ang pag-iilaw ng mga pixel ng eksena sa pamamagitan ng direktang mga sinag, na isinasaalang-alang ang data na nakaimbak sa mga mapa ng photon, ang enerhiya ng mga photon ay idinagdag sa enerhiya ng direktang pag-iilaw.

Ang mga kalkulasyon ng pandaigdigang pag-iilaw, na gumagamit ng malaking bilang ng mga pangalawang pagmuni-muni, ay mas matagal kaysa sa direktang pagkalkula ng pag-iilaw. Mayroong mga diskarte para sa pagkalkula ng lungsod ng radyo sa real time sa hardware na gumagamit ng mga kakayahan ng pinakabagong henerasyon ng mga programmable video chips, ngunit sa ngayon ang mga eksena kung saan ang global na pag-iilaw ay kinakalkula sa real time ay dapat na medyo simple at maraming mga pagpapasimple ay ginawa sa mga algorithm.

Ngunit ang matagal nang ginagamit ay ang static pre-calculated global illumination, na katanggap-tanggap para sa mga eksena nang hindi binabago ang posisyon ng mga pinagmumulan ng liwanag at malalaking bagay na lubos na nakakaapekto sa pag-iilaw. Pagkatapos ng lahat, ang pagkalkula ng pandaigdigang pag-iilaw ay hindi nakasalalay sa posisyon ng tagamasid, at kung ang posisyon ng naturang mga bagay sa eksena at ang mga parameter ng mga mapagkukunan ng pag-iilaw ay hindi nagbabago sa eksena, kung gayon ang mga paunang nakalkula na mga halaga ng pag-iilaw ay maaaring ginamit. Ginagamit ito ng maraming laro sa pamamagitan ng pag-iimbak ng data ng pagkalkula ng GI bilang mga lightmap.

Mayroon ding mga katanggap-tanggap na algorithm para sa pagtulad sa pandaigdigang pag-iilaw sa dinamika. Halimbawa, mayroong isang simpleng pamamaraan para sa paggamit sa mga real-time na application upang kalkulahin ang hindi direktang pag-iilaw ng isang bagay sa isang eksena: isang pinasimpleng pag-render ng lahat ng mga bagay na may pinababang detalye (maliban sa isa kung saan kinakalkula ang pag-iilaw) sa isang low-resolution na cubemap (maaari rin itong gamitin para sa pagpapakita ng mga dynamic na pagmuni-muni sa ibabaw ng isang bagay), pagkatapos ay i-filter ang texture na ito (ilang pass ng blur filter), at paglalapat ng data mula sa kinakalkula na texture upang maipaliwanag ang bagay na ito bilang pandagdag sa direktang pag-iilaw. Sa mga kaso kung saan ang dynamic na pagkalkula ay masyadong mahirap, maaari kang makayanan gamit ang mga static na radiosity na mapa. Isang halimbawa mula sa larong MotoGP 2, na malinaw na nagpapakita ng kapaki-pakinabang na epekto ng kahit na isang simpleng GI simulation:



Tutulungan ka ng pagtuturo na ito na mag-install ng mga shader sa Minecraft at sa gayon ay mapabuti ang mundo ng laro sa pamamagitan ng pagdaragdag ng mga dynamic na anino, ingay ng hangin at damo, makatotohanang tubig at marami pang iba.

Kapansin-pansin kaagad na ang mga shader ay naglo-load ng system nang napakalakas, at kung mayroon kang mahinang video card o kahit isang pinagsama-sama, inirerekumenda namin na pigilin mo ang pag-install ng mod na ito.

Ang pag-install ay binubuo ng dalawang yugto, una kailangan mong i-install ang shader mod, at pagkatapos ay karagdagang shader pack para dito

HAKBANG #1 - Pag-install ng shader mod

  1. I-download at i-install ang Java
  2. I-install OptiFine HD
    o ShadersMod;
  3. I-unpack ang resultang archive sa anumang lokasyon;
  4. Inilunsad namin ang jar file, dahil siya ay isang installer;
  5. Ipapakita sa iyo ng programa ang landas patungo sa laro, kung tama ang lahat, i-click ang Oo, Ok, Ok;
  6. Tara na sa .minecraft at gumawa ng isang folder doon shaderpacks;
  7. Pumunta kami sa launcher at makita ang isang bagong profile sa linya na may pangalang "ShadersMod", kung hindi, pagkatapos ay piliin ito nang manu-mano.
  8. Susunod na kailangan mong mag-download ng mga shader pack

HAKBANG #2 - Pag-install ng shader pack

  1. I-download ang shader pack na interesado ka (listahan sa dulo ng artikulo)
  2. Pindutin ang mga key WIN+R
  3. Pumunta sa .minecraft/shaderpacks. Kung walang ganoong folder, pagkatapos ay likhain ito.
  4. Ilipat o i-extract ang shader archive sa .minecraft/shaderpacks. Ang landas ay dapat magmukhang ganito: .minecraft/shaderpacks/SHADER_FOLDER_NAME/shaders/[.fsh at .vsh na mga file sa loob]
  5. Ilunsad ang Minecraft at pumunta Mga Setting > Mga Shader. Dito makikita mo ang isang listahan ng mga available na shader. Piliin ang gusto mo
  6. Sa mga setting ng shader, paganahin ang "tweakBlockDamage", huwag paganahin ang "CloudShadow" at "OldLighting"

Ang Mga Hindi Kapani-paniwalang Shader ni Sonic Ether
Mga shaders ni Sildur
Chocapic13's Shaders
sensi277's yShaders
MrMeep_x3's Shaders
Naelego's Cel Shaders
RRe36's Shaders
Mga CUDA Shader ni DeDelner
Mga Acid Shader ng bruceatsr44
Mga Shader ng Beed28
Shader Pack ng Ziipzaap
Mga Shader ng robobo1221
Mga Shader ng dvv16
Stazza85 super Shaders
Hoo00's Shaders pack B
Regi24's Waving Plants
MrButternuss ShaderPack
Ang Kahanga-hangang Graphics ng DethRaid Sa Nitro Shaders
Edi's Shader ForALLPc"s
Mga TME Shader ng CrankerMan
Kadir Nck Shader (para sa skate702)
Mga Shader ni Werrus
Knewtonwako's Life Nexus Shaders
CYBOX shaderpack
CrapDeShoes CloudShade Alpha
AirLocke42 Shader
Mga BSL Shader ni CaptTatsu
Mga shaders ni Triliton
ShadersMcOfficial's Bloominx Shaders (Chocapic13" Shaders)
Continuum Shaders ng dotModded
Qwqx71's Lunar Shaders (chocapic13's shader)

Isang napaka-karaniwang tanong mula sa matanong na mga manlalaro at mga bagong tagalikha ng laro.

Ang isang shader (English shader - shading program) ay isang programa para sa isang video card na ginagamit sa 3D graphics upang maunawaan ang mga huling katangian ng isang bagay o imahe, na maaaring kasama ang pagsipsip at pagkakalat ng liwanag, texture mapping, display at repraksyon, pagtatabing, pag-aalis ng ibabaw at isang malaking bilang ng iba pang mga katangian.

Maliit ang mga shader, wika nga, "mga script para sa isang video card." Pinapayagan ka nila na ipatupad ang iba't ibang mga espesyal na epekto at epekto nang simple.

May mga pixel (gumana sa mga imahe - iyon ay, alinman sa buong screen, o may mga texture) at vertex (gumana sa mga 3D na bagay). Halimbawa, ang paggamit ng mga pixel shader, mga epekto gaya ng 3D texture (bump), parallax texture, sun ray (sunshafts) a la Crisis, distance blur, simpleng motion blur, animated na texture (tubig, lava,... ), HDR, anti -aliasing, shadows (gamit ang ShadowMaps teknolohikal na proseso) at marami pang ibang bagay. Ang mga vertex shader ay ginagamit upang bigyang-buhay ang mga damo, bayani, mga puno, gumawa ng mga alon sa tubig (tulad ng mga malalaking), atbp. Ang mas kumplikado (mas mataas na kalidad, mas moderno) ang epekto, mas maraming mga utos na kailangan nito sa shader code. Ngunit ang mga shader ng iba't ibang bersyon (1.1 - 5.0) ay sumusuporta sa ibang bilang ng mga command: mas mataas ang bersyon, mas maraming command ang magagamit mo. Para sa kadahilanang ito, imposibleng ipatupad ang ilang mga teknolohikal na proseso sa pinakamababang shader. Halimbawa, ito ay para sa kadahilanang ito na ang pinakabagong Dead Space 2 ay nangangailangan ng bersyon 3 ng mga shader (parehong pixel at vertex) - dahil mayroon itong modelo ng pag-iilaw na maaari lamang ipatupad sa bersyon 3 at mas mataas ng mga shader.

Mga pagpipilian sa shader

Depende sa yugto ng pipeline, ang mga shader ay nahahati sa isang tiyak na bilang ng mga uri: vertex, fragment (pixel) at geometry. Well, ang mga bagong uri ng pipeline ay mayroon ding mga tessellation shader. Hindi namin tatalakayin nang lubusan ang graphics pipeline; Iniisip ko pa rin ang pagsulat ng isang hiwalay na artikulo tungkol dito, para sa mga nagpasya na mag-aral ng mga shader at graphics programming. Sumulat sa mga komento kung mausisa ka, magkakaroon ako ng impormasyon, ito ay nagkakahalaga ng pag-aaksaya ng iyong oras.

Vertex shader:
Vertex shaders ay ginagamit upang gumawa ng mga animation ng mga character, damo, puno, alon sa tubig at halos lahat ng iba pang mga bagay. Sa vertex shader, ang programmer ay nakalantad sa data na nauugnay sa mga vertex, halimbawa: ang mga coordinate ng vertex sa espasyo, ang texture coordinate nito, ang kulay at normal na vector nito.

Geometry shader:
Ang mga geometry shader ay handa nang bumuo ng bagong geometry, at maaaring gamitin upang lumikha ng mga particle, i-configure ang detalye ng modelo sa mabilisang, lumikha ng mga silhouette, atbp. Hindi tulad ng nakaraang vertex, handa kaming iproseso hindi lamang ang isang vertex, kundi pati na rin ang isang buong primitive. Ang primitive ay maaaring isang segment (2 vertices) at isang triangle (3 vertices), at sa pagkakaroon ng impormasyon tungkol sa katabing vertices (adjacency) para sa triangular primitive, hanggang 6 vertices ang maaaring iproseso.

Pixel shader:
Gumaganap ang mga pixel shader ng texture mapping, magaan, at iba't ibang texture effect, gaya ng reflection, refraction, fog, Bump Mapping, atbp. Ang mga pixel shader ay katulad na ginagamit para sa mga post-effects. Gumagana ang isang pixel shader sa mga elemento at texture ng bitmap na imahe - pinoproseso nito ang data na nauugnay sa mga pixel (halimbawa, kulay, lalim, mga coordinate ng texture). Ang pixel shader ay ginagamit sa huling yugto ng graphics pipeline upang bumuo ng isang fragment ng imahe.

Bottom line: Ang shader ay iba't ibang epekto sa isang larawan, tulad ng pagpoproseso mo ng iyong larawan sa iyong telepono sa iba't ibang tono o pattern.

" itemprop="image">

"Ano ang shaders?" - isang napaka-karaniwang tanong mula sa mausisa na mga manlalaro at baguhan na mga developer ng laro. Sa artikulong ito sasabihin ko sa iyo nang malinaw at malinaw ang tungkol sa mga kakila-kilabot na shader na ito.

Itinuturing ko na ang mga laro sa computer ang makina ng pag-unlad patungo sa mga larawang photorealistic sa mga computer graphics, kaya pag-usapan natin kung ano ang mga "shader" sa konteksto ng mga video game.

Bago dumating ang mga unang graphics accelerators, ang lahat ng gawain ng pag-render ng mga frame ng video game ay ginawa ng mahinang CPU.

Ang pagguhit ng isang frame ay talagang isang karaniwang gawain: kailangan mong kumuha ng "geometry" - mga polygonal na modelo (mundo, karakter, sandata, atbp.) at i-rasterize ito. Ano ang rasterize? Ang buong 3D na modelo ay binubuo ng maliliit na tatsulok, kung saan ang rasterizer ay nagiging mga pixel (iyon ay, "rasterize" ay nangangahulugan na nagiging mga pixel). Pagkatapos ng rasterization, kumuha ng data ng texture, mga parameter ng ilaw, fog, atbp. at kalkulahin ang bawat resultang pixel ng frame ng laro, na ipapakita sa screen ng player.

Kaya, ang central processing unit (CPU - Central Processing Unit) ay masyadong matalinong tao para pilitin siyang gawin ang ganoong kalakaran. Sa halip, makatuwirang maglaan ng ilang uri ng hardware module na magpapagaan sa CPU upang makagawa ito ng mas mahalagang gawaing intelektwal.

Ang module ng hardware na ito ay isang graphics accelerator o video card (GPU - Graphics Processing Unit). Ngayon, inihahanda ng CPU ang data at nilo-load ang kasamahan nito ng karaniwang gawain. Isinasaalang-alang na ang GPU ngayon ay hindi lamang isang kasamahan, ngunit isang pulutong ng mga pangunahing minions, maaari itong makayanan ang ganitong uri ng trabaho nang sabay-sabay.

Ngunit hindi pa kami nakatanggap ng sagot sa pangunahing tanong: Ano ang mga shaders? Teka, papunta na ako dito.

Ang mahusay, kawili-wili at malapit sa photo-realistic na graphics ay nangangailangan ng mga developer ng video card na magpatupad ng maraming algorithm sa antas ng hardware. Mga anino, liwanag, mga highlight at iba pa. Ang diskarte na ito, kasama ang pagpapatupad ng mga algorithm sa hardware, ay tinatawag na "Fixed Pipeline o Conveyor" at kung saan kinakailangan ang mataas na kalidad na mga graphics, hindi na ito makikita. Ang lugar nito ay kinuha ng "Programmable Pipeline".

Mga kahilingan mula sa mga manlalaro: “Halika, magdala ng magandang graphonia! sorpresa!”, nagtulak sa mga developer ng laro (at mga tagagawa ng video card, ayon sa pagkakabanggit) patungo sa higit at mas kumplikadong mga algorithm. Hanggang sa isang punto, ang mga naka-hardwired na hardware algorithm ay naging napakakaunti para sa kanila.

Dumating na ang oras para maging mas matalino ang mga video card. Ang desisyon ay ginawa upang payagan ang mga developer na i-program ang mga bloke ng GPU sa mga arbitrary na pipeline na nagpapatupad ng iba't ibang mga algorithm. Iyon ay, ang mga developer ng laro at mga graphics programmer ay nakapagsulat na ngayon ng mga programa para sa mga video card.

At ngayon, sa wakas, nakarating na tayo sa sagot sa ating pangunahing tanong.

"Ano ang shaders?"

Ang shader ay isang programa para sa isang video card na ginagamit sa three-dimensional na graphics upang matukoy ang mga huling parameter ng isang bagay o imahe, na maaaring may kasamang paglalarawan ng light absorption at scattering, texture mapping, reflection at refraction, shading, surface displacement at maraming iba pang mga parameter.

Ano ang mga shaders? Halimbawa, ang epekto na ito ay maaaring makuha, ito ay isang water shader na inilapat sa isang globo.

Graphic na pipeline

Ang bentahe ng isang programmable pipeline kaysa sa hinalinhan nito ay ang mga programmer ay maaari na ngayong lumikha ng sarili nilang mga algorithm, sa halip na gumamit ng isang hanay ng mga opsyon na naka-hardwired sa hardware.

Sa una, ang mga video card ay nilagyan ng ilang mga dalubhasang processor na sumusuporta sa iba't ibang hanay ng mga tagubilin. Ang mga shader ay nahahati sa tatlong uri depende sa kung aling processor ang magpapatupad ng mga ito. Ngunit pagkatapos ang mga video card ay nagsimulang nilagyan ng mga unibersal na processor na sumusuporta sa mga set ng pagtuturo ng lahat ng tatlong uri ng shaders. Ang paghahati ng mga shader sa mga uri ay napanatili upang ilarawan ang layunin ng shader.

Bilang karagdagan sa mga graphical na gawain na may ganitong matalinong mga video card, posible na ngayong magsagawa ng mga pangkalahatang layunin na kalkulasyon (hindi nauugnay sa mga graphics ng computer) sa GPU.

Sa kauna-unahang pagkakataon, ang buong suporta para sa mga shader ay lumitaw sa mga video card ng serye ng GeForce 3, ngunit ang mga pangunahing kaalaman ay ipinatupad sa GeForce256 (sa anyo ng Register Combiners).

Mga uri ng shaders

Depende sa yugto ng pipeline, ang mga shader ay nahahati sa maraming uri: vertex, fragment (pixel) at geometry. At ang mga pinakabagong uri ng pipeline ay mayroon ding mga tessellation shader. Hindi namin tatalakayin ang graphics pipeline nang detalyado; iniisip ko pa rin ang pagsulat ng isang hiwalay na artikulo tungkol dito, para sa mga nagpasya na mag-aral ng mga shader at graphics programming. Sumulat sa mga komento kung interesado ka, malalaman ko kung sulit ang iyong oras.

Vertex shader

Ang mga vertex shader ay gumagawa ng mga animation ng mga character, damo, puno, lumikha ng mga alon sa tubig at marami pang iba. Sa isang vertex shader, ang programmer ay may access sa data na nauugnay sa mga vertex, halimbawa: ang mga coordinate ng isang vertex sa espasyo, ang texture coordinate, ang kulay at normal na vector.

Geometry shader

Ang mga geometry shader ay may kakayahang lumikha ng bagong geometry, at maaaring magamit upang lumikha ng mga particle, baguhin ang detalye ng modelo sa mabilisang, lumikha ng mga silhouette, atbp. Hindi tulad ng nakaraang vertex, ang mga ito ay may kakayahang iproseso hindi lamang isang vertex, kundi pati na rin ang isang buong primitive. Ang primitive ay maaaring isang segment (dalawang vertices) at isang triangle (tatlong vertices), at kung ang impormasyon tungkol sa katabing vertices (English adjacency) ay available, hanggang anim na vertices ang maaaring iproseso para sa triangular primitive.

Pixel shader

Gumaganap ang mga pixel shader ng texture mapping, pag-iilaw, at iba't ibang texture effect gaya ng reflection, refraction, fog, Bump Mapping, atbp. Ginagamit din ang mga pixel shader para sa mga post-effects.

Gumagana ang isang pixel shader sa mga fragment at texture ng imahe ng bitmap - pinoproseso ang data na nauugnay sa mga pixel (halimbawa, kulay, lalim, mga coordinate ng texture). Ang pixel shader ay ginagamit sa huling yugto ng graphics pipeline upang bumuo ng isang fragment ng imahe.

Ano ang nakasulat sa mga shader?

Sa una, ang mga shader ay maaaring isulat sa isang wikang tulad ng assembler, ngunit nang maglaon ay lumitaw ang mga high-level shader na wika na katulad ng C, tulad ng Cg, GLSL at HLSL.

Ang ganitong mga wika ay mas simple kaysa sa C, dahil ang mga problema na nalutas sa kanilang tulong ay mas simple. Ang uri ng sistema sa naturang mga wika ay sumasalamin sa mga pangangailangan ng mga graphics programmer. Samakatuwid, binibigyan nila ang programmer ng mga espesyal na uri ng data: mga matrice, sampler, vectors, atbp.

RenderMan

Lahat ng tinalakay namin sa itaas ay nalalapat sa realtime na graphics. Ngunit may mga hindi realtime na graphics. Ano ang pagkakaiba - realtime - real time, ibig sabihin, dito at ngayon - upang magbigay ng 60 frame bawat segundo sa laro, ito ay isang real-time na proseso. Ngunit ang pag-render ng isang kumplikadong frame para sa cutting-edge na animation sa loob ng ilang minuto ay hindi realtime. Ang susi ay oras.

Halimbawa, sa kasalukuyan ay hindi kami makakakuha ng mga graphics na may parehong kalidad tulad ng sa pinakabagong mga animated na pelikula mula sa Pixar studio sa real time. Kinakalkula ng napakalaking render farm ang mga light simulation gamit ang ganap na magkakaibang mga algorithm, na napakamahal, ngunit gumagawa ng halos photorealistic na mga larawan.

Super-realistic na graphics sa Sand piper

Halimbawa, tingnan ang cute na cartoon na ito, mga butil ng buhangin, mga balahibo ng ibon, mga alon, lahat ay mukhang hindi kapani-paniwalang totoo.

*Maaaring i-ban ang video sa Youtube, kung hindi ito magbubukas, ang Google pixar sandpiper - isang maikling cartoon tungkol sa isang matapang na buhangin ay napaka-cute at malambot. Aantig ka nito at ipapakita kung gaano kahusay ang mga graphics ng computer.

Kaya ito ay RenderMan mula sa Pixar. Ito ang naging unang shader programming language. Ang RenderMan API ay ang de facto na pamantayan para sa propesyonal na pag-render, na ginagamit sa buong gawain ng Pixar at higit pa.

Kapaki-pakinabang na impormasyon

Ngayon alam mo na kung ano ang mga shader, ngunit bukod sa mga shader, may iba pang napaka-kagiliw-giliw na mga paksa sa pagbuo ng laro at mga graphics ng computer na malamang na interesado ka:

  • , - isang pamamaraan para sa paglikha ng mga kamangha-manghang epekto sa modernong mga video game. Suriin ang artikulo at video na may mga aralin sa paggawa ng mga epekto sa Unity3d
  • , - kung nag-iisip ka tungkol sa pagbuo ng mga video game, bilang isang propesyonal na karera o libangan, ang artikulong ito ay naglalaman ng isang mahusay na hanay ng mga rekomendasyon sa "kung saan magsisimula", "anong mga libro ang babasahin", atbp.

Kung mayroon kang anumang mga katanungan

As usual, kung may tanong ka pa, itanong mo sa comments, lagi kong sasagutin. Ang anumang uri ng mga salita o pagwawasto ng pagkakamali ay lubos na pinahahalagahan.

Sa pandaigdigang computerization, isang malaking bilang ng mga hindi maintindihang termino ang dumating sa ating mundo. Ang pagharap sa kanilang lahat ay hindi kasingdali ng tila sa unang tingin. Marami sa kanila ay may katulad na mga pangalan, marami ang may malawak na pag-andar. Panahon na upang malaman kung ano ang isang shader, saan ito nanggaling, kung ano ang kailangan nito at kung ano ito.

Optimizer

Malamang, ikaw ay isang masugid na manlalaro ng Minecraft at iyon ang dahilan kung bakit ka napunta upang malaman kung ano ito. Dapat pansinin kaagad na ang konsepto ng "shader" ay madaling ihiwalay mula sa larong ito at maaaring "mabuhay" nang hiwalay mula dito. Parang fashion lang. Samakatuwid, hindi na kailangang mahigpit na ikonekta ang dalawang konsepto na ito.

Sa pangkalahatan, ang shader ay nagmula sa programming at lumitaw bilang isang katulong sa mga espesyalista. Malamang na magiging malakas kung tawagin ang tool na ito bilang isang optimizer, ngunit talagang pinapabuti nito ang imahe sa mga laro. Kaya, kapag nasimulan mo nang halos maunawaan kung ano ito, magpatuloy tayo sa eksaktong interpretasyon.

Interpretasyon

Ano ang isang shader? na pinaandar ng mga processor ng video card. Ang mga tool na ito ay binuo sa isang espesyal na wika. Depende sa layunin, maaari itong mag-iba. Pagkatapos kung saan ang mga shader ay kondisyon na isinalin sa mga tagubilin para sa mga processor ng graphics accelerator.

Aplikasyon

Dapat sabihin kaagad na ang aplikasyon sa kabuuan ay paunang natukoy ng layunin. Ang mga programa ay ipinatupad sa mga processor ng video card, na nangangahulugang gumagana ang mga ito sa mga parameter ng mga bagay at mga imahe ng tatlong-dimensional na graphics. Maaari silang magsagawa ng maraming gawain, kabilang ang pagtatrabaho sa pagmuni-muni, repraksyon, pagdidilim, shift effect, atbp.

Premise

Matagal nang sinusubukan ng mga tao na alamin kung ano ang shader. Bago pa man ang mga programang ito, ginawa ng mga developer ang lahat sa pamamagitan ng kamay. Ang proseso ng pagbuo ng isang imahe mula sa ilang mga bagay ay hindi awtomatiko. Bago isinilang ang laro, ang mga developer ay gumawa ng kanilang sariling pag-render. Nagtatrabaho sila sa algorithm at idinisenyo ito para sa iba't ibang mga gawain. Ganito lumabas ang mga tagubilin para sa paglalapat ng mga texture, video effect, atbp.

Siyempre, ang ilang mga proseso ay binuo pa rin sa pagpapatakbo ng mga video card. Ang ganitong mga algorithm ay maaaring gamitin ng mga developer. Ngunit hindi nila nagawang ipataw ang kanilang mga algorithm sa video card. Ang mga hindi karaniwang tagubilin ay maaaring isagawa ng gitnang processor, na mas mabagal kaysa sa graphics processor.

Halimbawa

Upang maunawaan ang pagkakaiba, ito ay nagkakahalaga ng pagtingin sa ilang mga halimbawa. Malinaw, sa isang laro, ang pag-render ay maaaring alinman sa hardware o software. Halimbawa, naaalala nating lahat ang sikat na Quake 2. Kaya, ang tubig sa laro ay maaaring maging isang asul na filter pagdating sa pag-render ng hardware. Ngunit sa pamamagitan ng interbensyon ng software, lumitaw ang isang splash ng tubig. Ito ay ang parehong kuwento sa CS 1.6. Ang pag-render ng hardware ay nagbigay lamang ng puting flash, habang ang pag-render ng software ay nagdagdag ng isang pixelated na screen.

Access

Kaya naging malinaw na kailangang lutasin ang gayong mga problema. Nagsimulang palawakin ng mga graphics accelerators ang bilang ng mga algorithm na sikat sa mga developer. Ito ay naging malinaw na imposibleng "itulak" ang lahat. Kinakailangang buksan ang access sa video card sa mga espesyalista.

Bago dumating ang mga laro tulad ng Minecraft kasama ng mga mod at shader, nabigyan ang mga developer ng pagkakataong magtrabaho kasama ang mga bloke ng GPU sa mga pipeline na maaaring maging responsable para sa iba't ibang mga tagubilin. Ito ay kung paano nakilala ang mga programang tinatawag na "shader". Ang mga programming language ay espesyal na binuo upang likhain ang mga ito. Kaya, ang mga video card ay nagsimulang ma-load hindi lamang sa karaniwang "geometry", kundi pati na rin sa mga tagubilin para sa processor.

Kapag naging posible ang naturang pag-access, nagsimulang magbukas ang mga bagong posibilidad sa programming. Maaaring malutas ng mga espesyalista ang mga problema sa matematika sa GPU. Ang mga naturang kalkulasyon ay naging kilala bilang GPGPU. Ang prosesong ito ay nangangailangan ng mga espesyal na tool. Mula sa nVidia CUDA, mula sa Microsoft DirectCompute, pati na rin ang OpenCL framework.

Mga uri

Kung mas maraming natutunan ang mga tao tungkol sa mga shader, mas maraming impormasyon ang ipinahayag tungkol sa kanila at sa kanilang mga kakayahan. Sa una, ang mga accelerator ay may tatlong processor. Ang bawat isa ay may pananagutan para sa kanilang sariling uri ng shader. Sa paglipas ng panahon, pinalitan sila ng isang unibersal. Ang bawat isa ay may isang tiyak na hanay ng mga tagubilin, na agad na may tatlong uri ng mga shader. Sa kabila ng pagkakaisa ng gawain, ang paglalarawan ng bawat uri ay nanatili hanggang ngayon.

Ang uri ng vertex ay gumana sa mga vertex ng mga hugis na may maraming mukha. Maaaring maraming mga tool ang kasangkot dito. Halimbawa, pinag-uusapan natin ang mga texture coordinates, tangent vectors, binormals o normals.

Ang geometric na uri ay nagtrabaho hindi lamang sa isang vertex, ngunit sa isang buong primitive. Dinisenyo ang Pixel para sa pagproseso ng mga fragment ng mga raster na ilustrasyon at mga texture sa pangkalahatan.

Sa mga laro

Kung naghahanap ka ng mga shader para sa Minecraft 1.5.2, malamang na gusto mo lang pagbutihin ang larawan sa laro. Upang gawin itong posible, ang mga programa ay dumaan sa "apoy, tubig at mga tubo ng tanso." Ang mga shader ay sinubukan at pino. Bilang resulta, naging malinaw na ang tool na ito ay may mga pakinabang at disadvantages.

Siyempre, ang kadalian ng pag-compile ng iba't ibang mga algorithm ay isang malaking plus. Ito ay parehong flexibility at isang kapansin-pansing pagpapasimple sa proseso ng pagbuo ng laro, at samakatuwid ay isang pagbawas sa gastos. Ang mga resultang virtual na eksena ay nagiging mas kumplikado at makatotohanan. Gayundin, ang proseso ng pag-unlad mismo ay nagiging maraming beses na mas mabilis.

Ang tanging mga disadvantages na dapat tandaan ay kailangan mong matutunan ang isa sa mga programming language, at isaalang-alang din na ang iba't ibang mga modelo ng mga video card ay may ibang hanay ng mga algorithm.

Pag-install

Kung nakakita ka ng isang shader pack para sa Minecraft, kailangan mong maunawaan na maraming mga pitfalls sa pag-install nito. Sa kabila ng kumukupas na kasikatan ng larong ito, nananatili pa rin ang mga tapat na tagahanga nito. Hindi lahat ay gusto ang mga graphics, lalo na sa 2017. Ang ilang mga tao ay nag-iisip na salamat sa shaders maaari nilang mapabuti ito. Sa teorya, ang pahayag na ito ay tama. Ngunit sa pagsasagawa, hindi ka gaanong magbabago.

Ngunit kung naghahanap ka pa rin ng mga paraan upang magamit ang Minecraft 1.7, kung gayon, una sa lahat, mag-ingat. Ang proseso mismo ay hindi kumplikado. Bilang karagdagan, kasama ang anumang na-download na file ay may mga tagubilin para sa pag-install nito. Ang pangunahing bagay ay suriin ang mga bersyon ng laro at shader. Kung hindi, hindi gagana ang optimizer.

Mayroong maraming mga lugar sa Internet kung saan maaari mong i-install at i-download ang naturang tool. Susunod na kailangan mong i-unpack ang archive sa anumang folder. Doon ay makikita mo ang file na "GLSL-Shaders-Mod-1.7-Installer.jar". Pagkatapos ng paglunsad, ipapakita sa iyo ang landas patungo sa laro, kung ito ay tama, pagkatapos ay sumang-ayon sa lahat ng kasunod na mga tagubilin.

Pagkatapos ay kailangan mong ilipat ang folder na "shaderpacks" sa ".minecraft". Ngayon kapag sinimulan mo ang launcher kakailanganin mong pumunta sa mga setting. Dito, kung nakumpleto nang tama ang pag-install, lilitaw ang linyang "Shaders". Maaari mong piliin ang package na kailangan mo mula sa buong listahan.

Kung kailangan mo ng mga shader para sa Minecraft 1.7.10, hanapin lamang ang shader pack ng nais na bersyon at gawin ang parehong. Maaaring may mga hindi matatag na bersyon sa Internet. Minsan kailangan mong baguhin ang mga ito, muling i-install ang mga ito at hanapin ang tama. Mas mainam na tingnan ang mga review at piliin ang pinakasikat.