Shader

Izvor: Wikipedija

Shader je program koji zamjenjuje određene stadije u Fixed Function Pipelineu i omogućava definiranje svakog izvršenog piksela/vertexa/poligona. Doslovan prijevod shadera bio bi "sjenčar".

Podjela Shadera[uredi | uredi kôd]

U DirectX postoje 3 vrste shadera: Piksel Shader (često zvan Fragment Shader u OpenGLu), Vertex Shader, Geometry Shader.


Piksel Shader je vrsta programabilnog shadera koji zamjenjuje određene stadije u pipelineu i utječe na konačnu boju na ekranu. Pixel Shader se izvršava direktno na GPU, a programiranje istog se vrši kroz High Level Shading Language (HLSL) od DX9 verzije, ili u OpenGL Shading Language (GLSL) od OpenGL verzije 2.0. Kroz Pixel Shader se najčešće dobiva efekt Bump Mappinga, Normal Mapping, te Parallax Mapinga. Također Pixel Shader se koristi za dobivanje efekta dinamične vode.

Vertex Shader je vrsta programabilnog shadera koji zamjenjuje određene stadije u pipelineu i utječe na transformacije i upravlja koordinatama tekstura. Kao i Pixel Shader, Vertex Shader se izvršava na GPU ali prije Pixel Shadera. Programiranje istog također se radi najčešće u HLSL (DirectX) i GLSL (OpenGL). Vertex Shader upravlja svojstvima kao što su koordinate tekstura, transformacije, pozicije i sl. ali nemogu kreirati nove vertexe.

Geometry Shader je vrsta programabilnog shadera koji zamjenjuje određene stadije u pipeline i omogućuje stvaranje/odbacivanje novih primitiva. Također se izvršava na GPU i programira se u HLSL ili GLSL.

Pisanje Shadera[uredi | uredi kôd]

Dolaskom DirectX 10 API-a u potpunosti je uklonjen Fixed Function Pipeline, što znači ako želilte isprogramirati i najobičniji trokut morate pisati za njega shader program. S DX9 verzijom uveden je High Level Shading Language (no još uvijek podržava FF Pipeline), programski jezik u kojem se obavlja programiranje shadera, zamjenjujući asemmbler u kojem se obavljalo programiranje shadera u prethodnoj verzij DirectX-a (DX8).

U OpenGL-u je situacija ponešto drukčija. OpenGL dozvoljava korištenje FF Pipeline ili zamjenu pojedinih stadija shaderom. OpenGL Shading Language je uveden u verziji 2.0 OpenGL-a, no dostupan je i u OpenGL verziji 1.4 kroz ekstenzije (GL_ARB_vertex_shader i GL_ARB_fragment_shader).

Još jedan jezik je Cg kojeg je razvila NVIDIA. Cg kompajler dava OpenGL i DirectX shader programe.

Danas svaka igra na tržištu koristi kompleksne kombinacije shadera kako bi prikazala napredne efekte pomoću dočaravanja vode, simulacije ljudskog lica, prikazivanja naprednih efekata osvjetljenja, i sl. Svaka nova verzija DirectX-a donosi povećan broj instrukcija koje dozvoljava trenutna verzija API-a, tako povećavajući slobodu i prostor programerima da urade što više efekata. Shaderi su se počeli upotrebljavati krajem 90-tih s id tech 3 engine, a sredinom 2004. godine doživljeli puni procvat i potpunu upotrebu s igrama kao što su Far Cry, Doom 3 i sl.

Kronologija razvoja Shadera[uredi | uredi kôd]

1990.[uredi | uredi kôd]

Do sredine 1980-tih su PC igre bile ograničene na dvije dimenzije. Jedna uobičajena rezolucija tada je bila 640x350 - najviše 224.000 grubih 2D kockica (piksela) je bilo predviđeno za prikazivanje svijeta, likova i elemenata funkcionalnih radnji (primjer: jedan 22" TFT FHD ima 2,0736 milijuna piksela). Već od 1970-tih godina su na sveučilištima bila dva koncepta za virtualne 3D svjetove: Rasterizacija (eng. Rasterisation) i Raytracing. Rasterizacija pokušava sa što manjim opsegom računanja prikazati što stvarnije približavanje stvarnom svijetu, Raytracing prati više fizičke okolnosti na našem planetu i zbog toga je precizniji, ali je danas za programe u stvarnom vremenu (eng. Realtime) kao PC igre prespor. PC ulazi napokon 1997. godine sa svemirskom igrom Elite u 3. dimenziju. Jedna šaka poligona morala je biti dovoljna, više hardver nije mogao odraditi. U toku godina su u početku goli poligoni počeli biti lijepljeni za teksturama i tako su dobivali više detalja. Do 1996. morali smo se strpjeti, dok je id Software s Quake izdao prvu kompletno u 3D računajuću igru. U tom razdoblju na popularnosti je dobio 3D ubrzivač imenom Voodoo. Četiri godine kasnije je s Geforce 2 izašla zadnja hardver generacija ove 3D ere, prije nego što Nvidia godinu dana kasnije s Geforce 3 i njenom Shader tehnologijom otvara novo doba programiranih grafičkih čipova.

2000.[uredi | uredi kôd]

U današnjem Shader vremenu nestaju granice između CPU i grafičke kartice kao i Rasterizacije i Raytracinga. Od vremena DirectX 8 i Geforce 3, grafičke kartice nesavladavaju samo funkcije koje su programirane unaprijed (kao npr. zalijepiti jednu teksturu na jedan poligon), nego one mogu sa svojim Shader procesorima izvršavati kompleksne programe. 2002. je to Morrowind radio, kako bi za one vrijeme prikazao impresivne refleksije vode (vidi "Shader vremeplov). No još je tada DirectX 8 jako kočio programere. DirectX 9 (Radeon HD 9800, Geforce FX) je bio napokon toliko fleksibilan, da se naprosto svaki zamisljivi računarski podhvat na shaderima mogao poduzeti. Jedino maksimalna moguća snaga računanja je ograničavala slobodni prostor programerima igara. Mnoge moderne efekte programeri ostvaruju putem Shadera, svejedno bilo to fizika, Tezelacija (eng.Tesselation), Parallax Occlusion Mapping, ili Post-Processing. Mnogo ovih efekata su u najboljem slučaju samo približavanje stvarnom svijetu. To su trikovi, kako bi se kod civilnog procesa računanja dobila optički spektakularna 3D grafika. Parallax Occlusion Mapping npr. je prvi put nastupio na scenu u Splinter Cell: kaos teoriji i prikazuje cigle na zidovima i slične strukture u plastičnom svijetlu. Kada se jedan tako teksturiran zid pod jednim jako ravnim kutom promatra, trik se sam otkriva: na kraju se se radi samo o jednoj ravnoj teksturi, dakle o jednoj foto tapeti. S dolazećim DirecX 11 i njegovom podporom za tehniku tezelacije, moguće je svaku ciglu efektivno iz poligona modelirati. Moderne grafičke kartice rade toliko brzo da neki Shader programi koriste čak i podjednostavljene Raytracing algoritme (Raycasting). Često pri kontroli vidljivih objekata ili približavanju uvjerljivom globalnom osvjetljenju.

2010.[uredi | uredi kôd]

Ubrzo je između AMD i Nvidije izbila trka za prvu DirectX 11 grafičku karticu, koju je AMD prvi dobio. Nvidia je tek sredinom 2010. izdala nove Geforce grafičke kartice koje isto podržavaju DirectX 11.

Shader vremeplov[uredi | uredi kôd]

  • 2002: TES 3 Morrowind

S DirectX 8 i Geforce 3 počelo je doba programiranih grafičkih čipova. Morrowind je kao prva igra koristila nove Shader jedinice i pokazivala reflektirajuće površine vode.

  • 2004: Doom 3

Programer John Carmack upotrijebio je za Remake prvog Doom dijela intenzivne igre sijena. Mnogo DirectX 9 grafičkih kartica je ovo teško podnijelo.

  • 2004: Far Cry

Far Cry, FPS iz Njemačke koji po prvi put prikazuje ogromne vanjske površine s gustom vegetacijom. Sa zakrpom 1.3 Crytek nadograđuje High Dynamic Range osvjetljenje, što okolinu prikazuje još stvarnije.

  • 2004: Half-Life 2

Isto u 2004. godini Valve isporučuje Half-Life 2 u trgovine. Isticala napravljeno su bile jasno vidljive grimase i emocije likova u igri, što im je ulijevalo više života i činilo ih stvarnijim. Istotako sinkronizacija usana likova s audio govorom je uspješno odrađena.

  • 2007: Crysis

Crysis je bila PC igra koja je bila tehnički među zahtjevnijim igrama u trenutku objave. Koristi CryEngine2 koji iskorištava mogućnosti DirectX 10, što je omogućilo do tada neviđen prikaz vegetacije.

  • 2009: Colin McRae: Dirt 2

Jedna od prvih igara koje su koristile DirectX 11.