|
  DirectX 8.0: Vertex in Pixel shaderji
Avtor: Marko "Senitel"
Dolenc Datum: 29.12.2000 |
Ker sem v večini člankov o DirectX 8.0, ki sem jih videl
na Internetu, opazil, da so praktično vsi le manjša
predelava dela dokumentacije iz DirectX 8.0 SDK ki opisuje novosti,
sem se odločil, da vse skupaj razložim malo bolj podrobno. V
naslednjih nekaj člankih se bomo tako sprehodili čez
praktično vse novosti, ki jih DirectX 8.0 prinaša. V prvem
delu si bomo tako ogledali, kaj so to vertex in pixel shaderji,
čemu služijo in zakaj jih bo možno uporabiti.
|
| Kaj so vertex shaderji? |
Microsoft je s podporo vertex shaderjem programerjem iger omogočil, da lahko
programirajo T&L (Transformation & Lighting) enoto. Programerji lahko
sedaj napišejo svoje lastne funkcije, ki jih potrebujejo, in grafični procesor
jih bo strojno pospešil (če podpira vertex shaderje). Vertex shaderji so tako
programi za T&L enoto, ki so pisani v nekakšnem zbirniku (assemblerju), ki
jih grafična kartica nato izvaja. Grafična kartica mora za podporo vertex
shaderjem imeti posebno programibilno T&L enoto. Če nima programibilne
enote, se bodo ti programi izvajali preko centralnega procesorja. Za podporo
vertex shaderjem mora T&L enota na grafični kartici zagotoviti naslednje
registre:
- 96 konstantnih registrov
- 12 začasnih registrov
- 16 registrov, preko katerih dobimo točko (vertex)
Programer potem napiše program, ki med temi registri izvaja različne
operacije. Najlepše pri tem pa je to, da se ta program izvaja strojno pospešen
na grafični kartici.
 Poljubno senčenje |
|
 Motion blur |
|
|
| Kaj nam vertex shaderji omogočajo? |
Vertex shaderji programerju pustijo veliko več svobode, saj mu ni več treba
svojih idej prilagajati funkcijam, ki so strojno podprte. Mogoči so raznorazni
efekti:
- morphing (morfiranje - prehajanje iz enega objekta v drugega)
- proceduralna geometrija (geometrija, ki se generira z določenimi funkcijami)
- lastne metode za senčenje (dvo stransko senčenje,...)
- megla (višinska, lokalna,...)
- in še veliko drugih stvari, ki se jih programerji spomnijo
 Obojestransko osvetljevanje trikotnikov |
|
 Sinusoidno valovanje |
|
|
| Plusi in minusi vertex shaderjev: |
Plusi:
- programiranje T&L enote na grafični kartici
- dobra emulacija preko procesorja, če jih grafična kartica ne zmore izvajati
- ne predstavljajo velike dodatne obremenitve (ne za kartico s programabilno
-
T&L enoto in ne za programerja)
Minusi:
- vertex shaderji lahko samo spreminjajo vertexe (točke), ne morejo pa jih
dodajati ali odvzemati
- strojno še niso podprti
 Višinska megla |
|
 Efekt ribjega očesa |
|
|
| Kaj so to pixel shaderji? |
Pixel shaderji, podobno kot vertex shaderji, v svet grafičnih pospeševalcev
vnašajo programabilnost. Za razliko od vertex shaderjev, pa pixel shaderji
omogočajo programiranje rasterizacijske enote (enota, ki izrisuje trikotnike) na
grafični kartici. Podobno, kot pri vertex shaderjih, tudi tukaj programerji
napišejo programe v zbirniku (assemblerju), grafični procesor pa jih nato
strojno pospešuje. Vendar pa pixel shaderjev ni mogoče emulirati s procesorjem,
saj delujejo praktično povsem na koncu obdelave slike (vertex shaderji so povsem
na začetku). Če torej hočemo izvajati pixel shaderje brez strojne podpore, potem
moramo tudi vse ostalo izrisovati brez strojne podpore (ti. referenčni način, ki
teče samo preko CPU-ja). Za podporo pixel shaderjev mora vsak cevovod (pipeline)
za izrisovanje pik na grafični kartici zagotoviti:
- 8 konstantnih registrov
- 4 registre za teksture
- 2 registra za barvo točke (diffuse in specular komponenta)
- 2 začasna registra
Programer nato med temi registri opravlja operacije, kot so: seštevanje,
odštevanje, množenje, dot product 3... Programer ima z uporabo pixel shaderjev
zelo dobro kontrolo nad hitrostjo izvajanja teh programov. Brez uporabe pixel
shaderjev je namreč težje predvideti koliko prehodov bo morala grafična kartica
narediti, da bo izvedla željene operacije.
|
| Kaj nam pixel shaderji omogočajo? |
Pixel shaderji so, za razliko od vertex shaderjev, dosti manj uporabni, saj
morajo biti enote za teksturiranje že same po sebi precej programabilne. Kljub
temu pa marsikaj precej poenostavijo programerjem. Vse skupaj pa tudi ne bo tako
zelo opazno, kot vertex shaderji.
Primer delovanja pixel shaderjev. Na desni vidite program, na levi pa njegov
rezultat:
|
| Plusi in minusi pixel shaderjev: |
Plusi:
- popolna programabilnost rasterizacijske enote na grafični kartici
- enostavnost
- praktično nič dodatnega dela za programerje
Minusi:
- strojno še niso podprti
- manj opazni kot vertex shaderji
|
| Zaključek: |
Tako vertex, kot pixel shaderji, so zelo pomembna novost v DirectX 8.0, saj
prinašajo tako željeno programabilnost. Ker pa trenutno še ni strojne opreme
predvsem za pixel shaderje še ni velike uporabnosti. Vertex shaderji pa so
zaradi zelo dobre emulacije preko procesorja že zelo uporabna zadevica.
Za slike sta uporabljena programa Efect Browser (NVidia) in pa MFCPixelShader
(primer iz DirectX 8.0 SDK).
|
|
|