Gradivo · 2. poglavje

Delovanje GPU (rendering pipeline)

Delovanje grafične kartice poteka po korakih. Vsak frame gre skozi cevovod od geometrije do končnega piksla. Zaradi paralelizma lahko GPU obdela veliko število pikslov hkrati.

1. Uvod v delovanje GPU

Ko aplikacija želi prikazati 3D sceno, pošlje CPU grafični kartici podatke o geometriji, teksturah, luči in položajih objektov. GPU te podatke obdela v skladu z grafičnim cevovodom in na koncu pošlje sliko na monitor.

Vsak korak cevovoda se izvaja na specializiranih enotah znotraj GPU-ja, ki delujejo vzporedno na tisočih pikslov hkrati.

2. Grafični cevovod (rendering pipeline)

Grafični cevovod je zaporedje korakov, skozi katere gre vsak frame, ki se izriše na ekranu. Vsak korak je odvisen od prejšnjega in prispeva k zadnji sliki.

1. Priprava scene
CPU pošlje GPU-ju podatke o objektih, teksturah, svetlobi in gibanju.
2. Vertex shader
GPU izračuna položaje točk v 3D prostoru in jih pretvori glede na kamero.
3. Rasterizacija
Trikotniki se pretvorijo v piksle, ki jih je mogoče prikazati na zaslonu.
4. Fragment shader
Za vsak piksel se izračuna barva, osvetlitev, senčenje in teksturiranje.
5. Frame buffer
Končna slika se shrani v VRAM in pošlje monitorju.

3. Vertex shader

Vertex shader je programabilna stopnja cevovoda, ki se izvaja za vsako točko (vertex) geometrije. Njegova naloga je pretvoriti 3D koordinate v 2D projekcijo na zaslon glede na položaj kamere in svetlobne pogoje.

Vsak vertex shader se izvaja neodvisno na svojem jedru, kar GPU-ju omogoča, da obdela tisoče točk hkrati.

Vertex shader je ena od programabilnih faz; razvijalec igre zapiše kodo (GLSL, HLSL), ki GPU izvede za vsako točko v sceni.

4. Rasterizacija

Rasterizacija pretvori vektorsko geometrijo (trikotniki, črte) v diskretne piksle, ki ustrezajo pičlcem na zaslonu. GPU določi, kateri piksli so pokriti z vsakim trikotnikom, in za vsak tak piksel ustvari fragment.

Ta korak je strojno pospešen in se izvaja izjemno hitro; moderni GPU-ji rasterizirajo milijarde trikotnikov na sekundo.

5. Fragment / Pixel shader

Fragment shader (ali pixel shader) se izvaja za vsak fragment (piksel) in izračuna njegovo končno barvo. Upošteva teksture, osvetlitev, odboje in efekte, kot so senče, megla in ambientna okluzija.

V tem koraku nastane realističen videz scen; prav ta faza je računsko najzahtevnejša in največ prispeva k vizualni kakovosti igre.

Ray tracing (sledenje žarkom) nadomesti ali dopolni klasično senčenje in zagotovi fizično točnejše odboje svetlobe, a zahteva specializirane RT jedra.

6. Frame buffer

Ko je vsak piksel obdelan, se končna slika shrani v frame buffer, del VRAM-a, ki hrani sliko za prikaz na monitorju.

GPU običajno uporablja double buffering: medtem ko se ena slika prikazuje, se naslednja že izrisuje v drug buffer. Ko je slika pripravljena, se bufferja zamenjata, kar prepreči metanje (tearing) slike.

V-Sync
Sinhronizira zamenjavo bufferjev z osvježitveno frekvenco monitorja.
G-Sync / FreeSync
Adaptivna sinhronizacija, ki odpravlja tearing brez fiksne frekvence.

7. Zakaj so GPU-ji tako hitri?

GPU je hiter, ker ima tisoče majhnih jeder (npr. CPU ima 8-16 močnih jeder, GPU pa 2000+ manjših, ki vsa delajo hkrati). Ima tudi zelo široko pomnilniško vodilo in lasten hiter VRAM.

GPU-ji lahko zaradi tega izriše veliko slik na sekundo, temu rečemo FPS (frames per second). Močnejša kot je grafična kartica, več FPS-a lahko doseže.

GPU ustvarja veliko toplote in je zato veličkrat nameščen pod heat sinkom. Pri namenskih karticah so vgrajeni ventilatorji ali vodni hladilni sistem.

8. Zaključek

Grafični cevovod je srce delovanja vsakega GPU-ja. Od priprave scene, skozi vertex in fragment shader, do frame bufferja; vsak korak prispeva k temu, kar vidimo na zaslonu.

Razumevanje tega cevovoda je osnova za programiranje grafike, optimizacijo iger in razvoj vizualnih efektov.