>>> 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).