´ o´ 1. Generaci
´ ıtog ´ epes ´ Szam´ Grafika
´ Gergely Klar
[email protected] ¨ os ¨ Lorand ´ ´ Eotv Tudomanyegyetem Informatikai Kar
NVIDIA TNT2, ATI Rage, 3dfx Voodoo3 ´ ak ´ kiegesz´ ´ ıtese ´ A standard 2d-s videokarty ´ okat ´ ´ a CPU csinalja! ´ Csucspont transzformaci meg ´ ´ ´ ast, ´ Z-buffer kezelest ´ vegezte ´ A kartya csak a textur ´ az
˝ ´ ev ´ 2010/2011. oszi fel
´ o´ (1999-2000) 2. Generaci
NVIDIA GeForce 256, GeForce 2, ATI Radeon 7500 ´ ´ ok ´ es ´ az arnyal ´ ´ kezeles ´ et ´ a Atveszik a transzformaci as ´ CPU-tol. ´ DirectX 7 is tamogatja ´ Az OpenGL es a hardveres ´ okat ´ csucspont transzformaci ´ ´ as ´ megjelenese: ´ Multi-textur bump map, light map ´ az ´ ´ nem Konfiguralhat o´ (driver szinten), de meg programozhato´
´ o´ (2001) 3. Generaci
NVIDIA GeForce 3, GeForce 4 Ti, Xbox, ATI Radeon 8500 ´ ´ aga ´ A csucspont pipeline korlatozott programozhatos ´ ´ as, ´ de meg ´ nem Fejlettebb pixel szintu˝ konfigural ´ programozas ´ tobbsz ¨ ¨ os ¨ mintavetelez ´ ´ (antialias-hoz) 3d-s textur or es ´ ak,
´ o´ (2002) 4. Generaci
´ o´ (2004) 5. Generaci
NVIDIA GeForce FX, ATI Radeon 9700 ´ pixel pipeline teljesen programozhato´ A csucspont es ´ ˝ ´ ´ ´ meg ´ vannak) (eroforr as-korl atok azert ´ Magas szintu˝ arnyal o´ nyelvek (shading languages) ´ (NVIDIA Cg, Microsoft HLSL, OpenGL GLSL) megjelenese Shader Model 2.0 (simple branching)
´ o´ (2007) 6. Generaci
DirectX 10
Shader Model 4.0 (Unified Shader Model, geometry shader)
Unified Shading Architecture
Shading performance 2x pixel, 12x vertex above G71
700 Mtransistors
130W to 300W
NVIDIA GeForce 6, ATI Radeon X, GeForce 7 ¨ puffer szimultan ´ renderelese ´ Tobb
64bites pipeline
PCIe busz ¨ memoria, ´ ´ Tobb hosszabb csucspont arnyal o´ programok ´
Shader Model 3.0 (branching and looping in the pixel shader (physics))
HDRI, SLI, TSAA, TMAA
´ o´ (2009-) 7. Generaci
DirectX 11, OpenGL 4.1
Shader Model 5.0 (Compute Shader, Tesselation Shaders: Hull Shader & Domain Shader) ¨ ´ us ´ Tobbsz all ´ ag
´ asok ´ Dynamic Shader Linkage: OOP jellegu˝ szolgatat HLSL-ben
3000+ Mtransistors
1000 GFLOPs
˝ SM3.0 – Grafikus szereloszalag
Vertex Shader
´ eszkoz ¨ Feladata: csucspontok modell k.r. Ñ normalizalt ´ k.r. ´ lefut A vertex buffer minden elemen ´ Bemenet: csucsok modell k.r.-ben + egyeb ´
Vertex Shader
Primitive Assembly
Rasterisation
Fragment Shader
Pixel Rendering
´ eszkoz ¨ k.r.-ben + egyeb ´ Kimenet: csucs ´ normalizalt
Pixel Shader
´ Masik neve: fragment shader ´ u˝ 3Ds darabka Fragment: pixel meret
´ PS feladata: az egyes fragment-ek sz´ınenek ´ ´ meghataroz asa
´ haromsz ´ ¨ ´ A raszterizalt ogek minden egyes fragment-jere lefut.
Az adott fragment-et eldobhatja. ´ Bemenete: A vertex shader kimeno˝ parametereinek ´ interpolaltjai.
´ a csucspont ´ legalabb pozicioja ´ ´ ´ adat, ami a vertex buffer-ben meg van barmilyen egyeb adva ´ a csucspont ´ legalabb pozicioja ´ ´ ´ adat barmilyen egyeb
˝ SM4 – Grafikus szereloszalag
Input Assambler
Vertex Shader
Geometry Shader
Stream Output
Rasterizer
Pixel Shader
Output Merger
Kimenete: Az adott fragment-hez rendelendo˝ sz´ın. msdn.microsoft.com
Geometry Shader
Algoritmusok
´ asa, ´ ´ eltuntet ´ Feladata: uj (vagy regi ese) ´ geometria general ¨ ´ ´ transzformalt ´ primit´ıvekre fut let. A vertex shader altal mar
Point Sprite Expansion
Dynamic Particle Systems
´ agi ´ infokkal, ´ Bemenete: teljes primit´ıv (szomszeds ha vannak)
Fur/Fin Generation
Shadow Volume Generation
Kimenete: ujabb primit´ıv[ek], vagy semmi. ´
Single Pass Render-to-Cubemap
Kimeneti t´ıpusok:PointStream, LineStream, vagy TriangleStream
Per-Primitive Material Swapping
Per-Primitive Material Setup
´ os ´ lep ´ esek ´ Tesszelaci
Input Assambler
Vertex Shader
Hull Shader
Tesselator
Domain Shader
Geometry Shader
Stream Output
Rasterizer
Pixel Shader
Output Merger ˝ szereloszalagon k´ıvul: ¨ Compute Shader
´ primit´ıv tipusokat hasznal ´ Specialis
¨ ´ okat ´ ´ u´ Alapotlet: a transzformaci az alacsony felbontas ´ ´ tesszelaci ´ oval, ´ foltokon vegezz uk, hardveresen bontjuk ¨ es ´ tesszuk ´ ´ fel kisebb darabokra es a. ¨ reszletgazdagg ´ o: ´ Hasznalat
msdn.microsoft.com
´ ¨ foltok (patches) negysz og ´ ¨ foltok haromsz og iso-vonalak
displacement mapping ´ nezet fugg ¨ o˝ dinamikus LOD (level of detail) ´ ´ morph-olasok gyors´ıtasa
Hull Shader Stage
´ dolgozza fel a Foltonkent bementi pontokat.
Konstansokat rendel a folthoz, ´ as ´ modj ´ at ´ amik a tesszelal ´ ´ meg. hatarozz ak ´ o´ mert ´ ek ´ et. ´ Megadja a tesszelaci ´ kul ¨ kimenet: Ket ¨ on
Tesselator Stage
msdn.microsoft.com
´ o˝ pontok a Domain Vezerl Shader-nek Konstansok a Tesselator Stage-nek
Domain Shader Stage
˝ A Tesselator Stage-tol: u, v , pw q-k. ˝ A Hull Shader-tol: ´ o˝ pontok vezerl ˝ A Hull Shader-tol: ´ os ´ faktorok tesszelaci
˝ egyetlen A bemetekbol ´ ıt elo, ˝ es ´ az lesz a csucspontot all´ ´ kimenet.
´ ´ ´ ok ´ a primitive ”Lathatatlan” kimenet: topologiai informaci assembly-nek
Compute Shader
´ A Tesselator Stage soran ´ ıtott minden egyes pontra elo˝ all´ lefut. Bemenete:
´ Nem programozhato. ´ ´ ¨ Felbontja a tartomanyt kisebb darabokra (negsz og, ´ ¨ szakasz). haromsz og, ´ ´ akat ´ ´ ıt elo˝ kimenetkent. ´ u, v (opcionalisan w) koordinat all´
´ anos ´ ´ u´ szam´ ´ ıtasokat ´ ˝ e´ a GPU-n. Altal cel tesz lehetov ´ adatszerkezeteket hasznal. ´ Specialis ´ ´ bemenetekre. Nincsenek megszor´ıtasok a ki- es ´ asai: ´ Felhasznal
msdn.microsoft.com
´ ´ Kepfeldolgoz as/post-processing Ray-tracing Fizika AI
´ ”Testverei”
CUDA OpenCL
´ ´ Absztrakt fenyforr asok (ism.)
´ fenyforr ´ ´ Irany as
´ csak iranya van ´ k.r. beli) vektor megadja egyetlen (vilag ´ ´ a fenysugarakat parhuzamosnak tekintjuk ¨ ´ ´ ´ ´ ara ´ hasznalhat ´ tavoli fenyforr asok megadas o´
´ ´ Pont fenyforr as
´ van csak poz´ıcioja ´ k.r.-ben egy ponttal adjuk meg, vilag ¨ Pl.: villanykorte
~v : ω a nezeti ´ ´ irany ~l : ω 1 a megvilag´ ´ ıto, ´ a fenyt ´ ´ pont fele mutato´ vektor ”ado” ~n a feluleti ´ normalis ¨ ~v ,~l, ~n egysegvektorok ´ ´ a ~n altal ´ ´ szog ¨ θ1 a ~l es bezart
´ ´ es ´ ”fenyk ´ ¨ iranya, pozicioja ore” van ´ szog ¨ + egy pont es ´ egy vektor adja meg (vilag ´ k.r. !) ket ´ Pl.: asztali lampa
Ambiens tag
´ ´ Spot fenyforr as
¨ esek ´ Jelol (ism.)
´ ´ ´ A sz´ınteren mindenutt eg. ¨ jelenlevo˝ fenymennyis ´ Keplet: ka La . ˝ fugg, ka a felulett legyen ¨ ol ¨ float4 ambientColor. ´ ´ atsz ´ og ´ as. ´ A float4 az egy rgba negyes, ahol a az atl ´ ol, ˝ felulett ˝ fuggetlen. ´ legyen La fenyt Szinten ¨ ol ¨ float4 ambientLight, de a 1. ´ ´ Pixel shaderben hasznalhat o: ambientColor*ambientLight
¨ eny ´ Lambert-torv
Li kd cos
θ1
BRDF: Lref
Ezt neveztuk ¨ diffuz ´ sz´ınnek. ´ Li mint az elobb, ˝ ´ fenyforr ´ ´ kd es de Li az aktualis as ´ tulajdonsaga: float4 diffuseColor float4 diffuseLight ´ ´ cos θ1 . Kene meg:
´ ıtasa: ´ Kiszam´ saturate(dot(normal, toLight)) ´ toLight =~l-t. Ismerni kell hozza´ normal = ~n-t es
´ ´ al ´ a fenyk ´ ¨ is figyelembe kell majd venni. Spot fenyforr asn ort
´ visszaverod ˝ es ´ - Phong modell Spekularis
¨ any ´ es ´ a ~v BRDF: Lref Li ks pcos φqn , ahol φ az ~r tuk ¨ orir ´ ´ altal ´ ´ szog. ¨ nezeti irany bezart ´ Li (ez egy masik ´ ˝ ´ kd es Li ) megint mint az elobb, Li szinten ´ fenyforr ´ ´ tulajdonsaga: ´ az aktualis as float4 specularColor float4 specularLight n felulet ¨ fugg ¨ o˝ konstans, legyen float specularPower
´ visszaverod ˝ es ´ - Phong modell Spekularis ¨ any ´ es ´ a ~v nezeti ´ ´ BRDF: Lref Li ks pcos φqn ; ~r tuk irany. ¨ orir Kene ´ ´ ~r es ´ ~v . cos φ, amihez meg kene ~ ¨ epe. ´ ´ ıtasa: ´ r a ~l vektor ~n-re vett tuk Szam´ ¨ ork
¨ Osszefoglalva
´ Felulet ¨ tulajdonsagai
´ Tudd, hogy ertsd
´ ´ tulajdonsagai ´ Fenyforr as
diffuseLight
ambientColor
specularLight
diffuseColor
toLight
specularColor
specularPower
normal
worldPos
float3 reflection = reflect(-toLight, normal) ~v a nezeti ´ ´ ´ a cameraba ´ irany, azaz a feuleti pontbol mutato´ ¨ ´ egysegvektor. float3 directionToEye = normalize(eyePosition-worldPos) ´ ıtasa: ´ pcos φqn szam´ pow(saturate(dot(reflection, directionToEye)), specularPower)
´ tulajdonsagai ´ Sz´ınter
ambientLight
eyePosition
´ Minden feluleti-optikai tulajdonsagot meg lehet adni ¨ ´ textur ´ konstanssal, vagy akar ´ aval. ˝ meg ´ tobbet, ¨ (Sot, ha ugyesek vagyunk!) ¨ ´ pont vilagkoordin ´ ´ Minden vektor es ata-rendszerben adott. ´ ´ eyePosition-t friss´ıteni kell, ha valtozik a nezet! ´ ´ a Vertex Problema: a modellunk ¨ modell k.r.-ben van, es ´ eszkoz ¨ k.r.-be visz at! ´ Shader normalizalt ´ szamoltassunk ´ ´ Megoldas: a Vertex Shader-rel vilag ´ akat ´ k.r.-beli koordinat is!
´ Adatstruktur ´ ak s t r u c t VS INPUT { f l o a t 4 pos : POSITION ; f l o a t 3 normal : NORMAL; }; s t r u c t VS OUTPUT { f l o a t 4 pos : POSITION ; f l o a t 3 normal : TEXCOORD0; f l o a t 3 worldPos : TEXCOORD1; };
Pixel shader f l o a t 4 L i g h t i n g P S ( f l o a t 3 normal : TEXCOORD0, f l o a t 3 worldPos : TEXCOORD1) : COLOR0 { normal = n o r m a l i z e ( normal ) ; f l o a t 3 t o L i g h t = ??? / / F e n y f o r r a s fuggo float diffuseIntensity = s a t u r a t e ( d o t ( normal , t o L i g h t ) ) ; f l o a t 3 r e f l e c t i o n = r e f l e c t ( t o L i g h t , normal ) ; f l o a t 3 directionToEye = n o r m a l i z e ( e y e P o s i t i o n worldPos ) ; // ...
Vertex shader
VS OUTPUT L i g h t i n g V S ( VS INPUT i n p u t ) { VS OUTPUT o u t p u t ; o u t p u t . pos = mul ( i n p u t . pos , W o r l d V i e w P r o j e c t i o n ) ; o u t p u t . worldPos = mul ( i n p u t . pos , World ) . xyz ; o u t p u t . normal = mul ( InvWorld , f l o a t 4 ( i n p u t . normal , 0 ) ) . xyz ; return output ; }
Pixel shader
// ... float specularIntensity = pow ( s a t u r a t e ( d o t ( r e f l e c t i o n , d i r e c t i o n T o E y e ) ) , specularPower ) ; i f ( d i f f u s e I n t e n s i t y <= 0 ) specularIntensity = 0; r e t u r n ambientColor ∗ a m b i e n t L i g h t + diffuseIntensity ∗ diffuseColor ∗ diffuseLight + specularIntensity ∗ specularColor ∗ specularLight ; }
´ ıtasa ´ toLight szam´
´ fenyforr ´ ´ Irany as
´ iranya, ´ ´ iranyvektor: ´ Feny normalizalt float3 lightDirection toLight = -lightDirection
´ ´ Pont fenyforr as
´ ´ hatasa ´ Spot fenyforr as
´ pozicioja, ´ helyvektor: float3 lightPosition Feny toLight = normalize(lightPosition-worldPos)
´ ´ Spot fenyforr as
´ iranya, ´ ´ iranyvektor: ´ Feny normalizalt float3 lightDirection ´ pozicioja, ´ helyvektor: float3 lightPosition Feny toLight = normalize(lightPosition-worldPos) ´ ´ eseten ´ mint pont fenyforr as
´ extra parameter: ´ Ket
´ ¨ amin belul ´ belso˝ fenyk or: hat ¨ teljes intenzitassal ´ ¨ amin belul kuls or: ¨ o˝ fenyk ¨ abszolult ´ nem hat
¨ ott ¨ folyamatosan csokken ¨ ´ intenzitasa. ´ A ketto˝ koz a feny ´ ¨ oket ¨ ´ ´ ol ´ indulo, ´ a feny ´ irany ´ aval ´ A fenyk or a fenyforr asb ´ as ´ u´ (vegtelen)k ´ megeggyezo˝ all upoknak tekintjuk. ´ ¨ Egy feluleti pont akkor van benne egy kupban, ha a pontot ¨ ´ ´ ´ pozicioj ´ aval ´ ¨ ¨ o˝ egyenes a kupon a fenyforr as osszek ot belul ´ ¨ van.
´ ´ hatasa ´ Spot fenyforr as
˝ ´ Az elobbi szakasz iranya pont a toLight. ´ a -toLight altal ´ ´ szog, ¨ Ha a lightDirection es bezart ´ ¨ enek ´ kissebb, mint a kup og a fele, akkor a szakasz ´ ny´ılassz benne van a kupban, azaz a feluleti pont is. ´ ¨ ¨ ´ vizsgalni ´ azok cos-at, ´ ha a max. A szogek helyett eleg ´ ¨ ¤ 180 . ny´ılassz og ´ fenyk ´ ¨ a hozzajuk ´ Adjuk meg a ket ort, tartozo´ kupok ´ ´ ¨ enek ´ ´ ´ ny´ılassz og felenek cos-ava:
´ ¨ cosInnerCone belso˝ fenyk or: ´ ¨ cosOutterCone kuls or: ¨ o˝ fenyk
´ ´ hatasa ´ Spot fenyforr as
smoothstep(min, max, x):
0, ha x<min 1, ha x>max ´ ´ 1 koz ¨ ott ¨ kul. lin. atmenet 0 es ¨
float spotFactor = smoothstep(cosOutterCone, cosInnerCone, dot(lightDirection, -toLight)) ´ a spekularis ´ tagot. Ezzel kell beszorozni a diffuz ´ es
´ specularIntensity Pl. diffuseIntensity-t es