Ēnotājs

thumb|Ēnotājus parasti izmanto, lai 3D modeļiem piešķirtu apgaismojumu un ēnu.

**Ēnotājs** () ir datorgrafikā ēnošanai izmantota programma. Ēnošana ir nepieciešamā līmeņa gaismas, tumsas un krāsu lietošana attēlā. Mūsdienās to izmanto arī specefektu veidošanā un video pēcapstrādē.

Ēnotāji renderēšanas aprēķinus veic ar datora grafikas aparatūru. Lielākā daļa ēnotāju ir radīti, lai tos izmantotu ar datora grafisko procesoru. Visu pikseļu, virsotņu vai tekstūru pozīcija, tonis, piesātinājums, spilgtums un kontrasts veido beigu attēlu. Visus šos rādītājus iespējams mainīt ar ēnotājā noteiktajiem algoritmiem, vai arī izmantojot ārējos mainīgos un tekstūras, ko lieto, izsaucot ēnotāju.

Ēnotājus plaši izmanto kino pēcapstrādē, ar datoru radītos attēlos un datorspēlēs, lai radītu šķietami bezgalīgu efektu virkni. Līdztekus vienkāršai objektu apgaismošanai ar ēnotāju iespējamas arī daudz sarežģītākas darbības, piemēram, attēla nokrāsas, piesātinājuma, spilgtuma vai kontrasta mainīšana, kā arī daudzu citu efektu veidošana.

## Vēsture
Sabiedrību ar ēnotājiem 1988. gada maijā iepazīstināja kinostudija *[[Pixar]]*, publicējot "RenderMan Interface Specification, Version 3.0".

Līdz ar grafikas procesoru attīstību lielākās grafiskās programmatūras bibliotēkas, piemēram, *[[OpenGL]]* un *[[Direct3D]]* atbalsta ēnotāju izmantošanu. Iesākumā grafikas procesori atbalstīja tikai pikseļu ēnojumu, taču, kad izstrādātāji saprata, cik nozīmīgi ir ēnotāji, tika nodrošināts arī virsotņu ēnotāju atbalsts. Pirmā videokarte ar programmējamu pikseļu ēnotāju bija Nvidia GeForce 3 (NV20), to izlaida 2000. gadā. Līdz ar *[[Direct3D]]* 10 un *[[OpenGL]]* 3.2 tika ieviesti ģeometrijas ēnotāji. Grafikas procesoru attīstība tiek virzīta uz vienota ēnotāju modeļa izveidi.

## Dizains
Ēnotāji ir vienkāršas programmas, kas apraksta virsotņu vai pikseļu iezīmes. Virsotņu ēnotāji apraksta virsotņu iezīmes (pozīciju, tekstūras koordinātas, krāsas u.c.), savukārt pikseļu ēnotāji apraksta pikseļu iezīmes (krāsu, dziļumu un alfa vērtību). Katra virsotne tiek renderēta kā pikseļu virkne un tiek nosūtīta uz ekrānu.

Ēnotāji aizvieto grafikas aparatūras sadaļu, ko sauc par fiksētas funkcijas konveijeru (*Fixed Function Pipeline*). Šo procesu tā sauc tādēļ, ka tiek veikta apgaismojuma un tekstūras kartēšana, izmantojot stingro kodēšanu. Ēnotāji šai stingrās programmēšanas pieejai nodrošina programmēšanas iespēju.

## Veidi
Vecākas videokartes izmanto atsevišķas apstrādes vienības katram ēnotāja veidam, bet jaunākās videokartes spēj apstrādāt jebkāda veida ēnotājus. Tas ļauj grafikas kartei efektīvāk izmantot apstrādes jaudu.

### 2D ēnotāji
2D ēnotāji tiek izmantoti ciparattēliem, kurus datorgrafikā sauc arī par tekstūrām. Tie izmaina pikseļu īpašības. 2D ēnotājus var izmantot 3D ģeometrijas renderēšanai. Šobrīd vienīgie 2D ēnotāji ir pikseļu ēnotāji.

#### Pikseļu ēnotāji
Pikseļu ēnotāji tiek saukti arī par fragmentu ēnotājiem, tie aprēķina katra fragmenta (parasti tas nozīmē viena pikseļa) krāsu un citas īpašības. Vienkāršākie pikseļu ēnotāji uz ekrāna izvada vienu pikseli kā krāsas vērtību, taču sarežģītākiem ēnotājiem iespējamas vairākas atšķirīgas ieejas un izejas īpašību noteikšanas iespējas. Izmantojot tikai pikseļu ēnotāju, 3D grafikā nav iespējams veidot sarežģītus efektus, jo tas apstrādā tikai vienu fragmentu, nevis ainu kopumā.

### 3D ēnotāji
3D ēnotājus izmanto 3D modeļiem, ar tiem izspējams arī piekļūt modeļu krāsām un tekstūrām. Vecākais 3D ēnotāju veids ir virsotņu ēnotājs. Ar ģeometrijas ēnotāju iespējams ēnotāja robežās radīt jaunas virsotnes.

#### Virsotņu ēnotāji
Virsotņu ēnotāji ir visbiežāk izmantotais un izplatītākais 3D ēnotāju veids. To mērķis ir pārveidot katru virsotnes 3D pozīciju, kas atrodas virtuālā telpā, par 2D koordinātām, kas redzamas ekrānā (arī dziļumu). Izmantojot virsotņu ēnotāju, iespējams mainīt atrašanās vietas, krāsas un tekstūras koordinātu īpašības, taču jaunas virsotnes radīt nav iespējams.

#### Ģeometrijas ēnotāji
Ģeometrijas ēnotāji ir salīdzinoši jauns ēnotāju veids. Tos ieviesa līdz ar Direct3D 10 un OpenGL 3.2, agrāk tie bija pieejami OpenGL 2.0+ paplašinājumos. Ar šo ēnotāja veidu iespējams radīt jaunus grafikas primitīvus, piemēram, punktus, līnijas un trijstūrus.

Ģeometrijas ēnotāju programmas tiek izpildītas pēc virsotņu ēnotājiem. Tajos tiek ievadīts viss primitīvs kopā ar informāciju par tā apkārtni. Piemēram, darbā ar trijstūriem tiek ievadītas visas trīs virsotnes. Tad ēnotājs var izstarot dažādu virsotņu skaitu, kuras tiek rastrētas un to fragmenti tiek nodoti pikseļu ēnotājam.

## Paralēlā apstrāde
Ēnotāji tiek veidoti, lai varētu vienlaikus pārveidot lielu elementu kopumu, piemēram, visus ekrāna pikseļus vai visas modeļa virsotnes. Ēnotāji ir piemēroti paralēlajai apstrādei, un lielākā daļa mūsdienu grafisko procesoru nodrošina ātru šo procesu norisi.

Ēnotāju programmēšanas modelis ir līdzīgs augsta līmeņa renderēšanas funkcijai. Ēnotājs tiek izmantots kā arguments, un starp starpposmu rezultātiem tiek nodrošināta īpaša datu plūsma, kā arī ir atļauts datu paralēlisms.

## Programmēšana
Ēnotāju programmēšanas valoda ir atkarīga no tā, kādā vidē ēnotājs tiks izmantots. Oficiālā OpenGL un OpenGL ES izmantojamā valoda ir OpenGL, kas pazīstama arī kā GLSL. Oficiālā Direct3D ēnošanas valoda ir HLSL (*High-Level Shading Language*, augsta līmeņa ēnošanas valoda). *CG* ir novecojusi ēnotāju veidošanas valoda, ko izstrādāja Nvidia, ar to var veidot gan OpenGL, gan Direct3D ēnotājus. Apple izlaida savu ēnošanas valodu — *Metal Shading Language*, kas ir daļa no  sistēmas.

## Atsauces