350 likes | 447 Views
Možnosti moderního grafického HW. Erik "Deathgate" Veselý Mat úš "Backslash" Zamborský. Úvodem. nejen nejnovější technologie, zpětný pohled na vývoj grafiky na PC shrnutí současných technik osvětlení a jeho provedení hraje největší roli při renderingu
E N D
Možnosti moderního grafického HW Erik "Deathgate" VeselýMatúš "Backslash" Zamborský
Úvodem • nejen nejnovější technologie, zpětný pohled na vývoj grafiky na PC • shrnutí současných technik • osvětlení a jeho provedení hraje největší roli při renderingu • každé řešení osvětlení s sebou nese jednotlivé problémy
Co to je? • jedna se o část elektromagnetického spektra, jež je viditelná lidským okem • jednotlivé úhly pohledu • snažíme se co nejvíce přiblížit realitě • v grafice nejde o reálný osvětlovací model, ale snažíme se o co nejkvalitnější vizuální výsledek
Všechno je aproximace • základem je Lambertova rovnice intenzita = n dot l n – normala povrchu l – vektor ke světlu
rendering svetel se tyka distribuce energie elektromagnetického záření do jednotlivych typu povrchu a reakce povrchu na dané záření • materiály část světelné energie přijmou, část ji odrazí • přijmutá energie se částečne přemění v teplo a zbytek se vyzáří zpět • barva materialu závisí na tom, kterou část spektra pohltí a kterou vyzáří zpět • každý povrch přijímá světelnou energii, část ji vyzáří zpět, část jí promění v tepelnou energii
Phongův osvětlovací model • ambient • diffuse • specular intensita = ambient + diffuse + specular
Phongův osvětlovací model • ambient = konstanta • diffuse = N dot L • specular = (V dot R)^shininess farba = ambient + diffuseLight * diffuseMat + specularLight *specularMat
direct a indirect lighting - indirect bere nejen svetlo od zdroje k povrchu, ale take od povrchu k ostatnim povrchum, na zaklade zakona zachovani energie
Metody osvětlení • statická vs. dynamická světla • statické vs. dynamické objekty • při návrhu renderingu je důležité dobře promyslet jednotlivá řešení, všechno má svoje pro a proti
Statické osvětlení 1.) STATICKÁ SVETLA • statický terén • pohyblivé objekty 2.) DYNAMICKÁ SVETLA • statický terén • pohyblivé objekty
Nejstarší osvětlovací metody • simple lightmapper už od dob Quake1 • textury nanesené na statickou scénu obsahují barvu světla, skalární součin a energii světla, reprezentovanou rovnicí útlumu • statické lightmapy pracují pouze se statickými objekty, dynamické věci potřebují svoje vlastní řešení
Per-Vertex lighting • OpenGL přišlo vstříci developerům, FFP per-vertex lighting • intenzita osvětlení počítána na úrovni jednotlivých vertexů • následná interpolace
Per-Vertex Lighting • Výhody: • relativně rychlé • celkem dobrý výsledek • Nevýhody: - nepresne, pro realny vzhled potreba dostatecne teselovat geometrii
Per-Pixel lighting • řeší problémy s nepřenostmi, jež vznikají při per vertex lightingu • intenzita pixelu se počítá pro každý pixel zvlášť
Per-Pixel lighting • Výhody: • přesné, • nepotřebuje teselaci • Nevýhody: • vysoké nároky na výkon • osvětlovací rovnice se počítá pro každý pixel zvlášť
Další fáze vývoje • vyrobci grafickych karet se zacinaji preorientovavat, investuje se hlavne do vyvoje pixel pipeline a do jeji zparalelni k co nejvetsimu vypocetnimu vykonu na urovni pixel computingu • pixely renderuji jednotky paralelne, vykon karty v pripade pixel bottlenecku velmi zavisi na poctu pixel pipelines, ATI i NV pouzivaji mirne jine reseni co se týče architektury pixel pipelines • - objevuji se nove techniky na zdetailneni a zkvalitneni renderingu jednotlivych povrchu • - metody jako Emboss bump mapping, Dot3 bump mapping, Paralax mapping, displacement mapping • - detaily povrchu jsou pridavany pomoci textur, jez definuji tvar povrchu
Emboss bump mapping • první metoda bump mappingu • používá height – mapu • height mapa vyjadřuje nerovnosti povrchu • definuje vyvýšeniny oproti fyzické geometrii dané triangly • nepoužívá se, ale dala vzniku dalším metodám
Dot3 Bump mapping • stará dobrá heightmapa se zderivuje • získáme změny výšky mezi jednotlivými texely textury(povrchu) • vzniká normal mapa, kde jednotlivé texely reprezentují normálu pixelu • používá se klasická RGB textura
Dot3 Bump mapping • jsou dva základní způsoby jak definovat normal mapu • OBJECT SPACE NORMAL MAPA • TANGENT SPACE NORMAL MAPA
Dot3 Bump mapping • OBJECT SPACE BUMP MAPPING • vyhody: relativne jednoduche na pochopeni, netreba delat dalsi vypocty a transformace • nevyhody: kazdy kus geometrie musi mit svoji vlastni object space( world space ) mapu, nemuze se opakovat, ro kazdy bod je identicka, zabira vela mista
Dot3 Bump mapping • TANGENT SPACE BUMP MAPPING • normalova mapa je definovana relativne vuci danemu polygonu • pred vypoctem intenzity daneho bodu je potreba dostat vektor ke svetlu do prostoru dane textury • prostor textury nanesene na jednotlivych polygonech definuje tangent space transformacni matice • urcuje lokalny souradnicovy system textury mapovane na dany polygon
Paralax mapping • vychádza z klasického bumpmappingu • normály jednotlivých pixelov pochádzajú z normal mapy a vyska z height mapy • pridáva zlepšenie v simuláci hrbolatých povrchov • vyhody: zlepšenie vizuálneho dojmu zo scény dynamickosť povrchov pri pohybe kamery • nevýhody: ďalšie inštrukcie na úrovni pixel/fragment shaderu väčšia pamäťová náročnosť, pretože je potreba height mapa pri ostrých uhloch pohľadu efekt ztraci svuj smysl, protoze vynikne planarna podstata povrcha
iným názvom pre parallax mapping je offset mapping, takže ide o offsetovanie texturových koordinátov • koordináty sa offsetujú podľa vektora pohľadu na daný povrch a výšky povrchu • výška povrchu je daná height mapou, ktorá ju kóduje ako hodnoty od 0.0 až 1.0, pričom je na nás aby sme • ich správne rozpakovali do rozsahu aký potrebujeme, teda napríklad -1.5 až 2.8 a pod.
na pervertex úrovni sa vo vertex shaderi vypočíta kamera vektor a prevedie sa do tangent space • kamera vektor sa interpoluje po celom polygone, teda posle sa do pixel/fragment shaderu • je nutné ho normalizovať aby mal jednotkovú dĺžku • na perpixel urovni sa nasampluje heightmapa • k nasamplovanej hodnote sa nasobi scale a pripocita bias, ktorý hodnotu z rozsahu 0.0 až 1.0 dostane do nami zvoleného rozsahu • normalizovaný kamera vektor(koordináty X a Y) sa násobí hodnotou paralaxu, ktorú sme práve vypočítali • tým dostávame offset o ktorý zmeníme textúrové koordináty • na záver sa offset pripočíta k pôvodným texturovacím koordinátom
Po vypočítaní zoffsetovaných koordinátov, ich používame na samplovanie všetkých ostatných textúr(diffuse, normal mapa, specular mapa, ...) float2 GetParalax(float2 baseCoord, float Scale, float Bias, float3 camvect) { float height = tex2D(heightTex, baseCoord); float paralax = height * Scale - Bias; float2 offset = camvect.xy * paralax; return baseCoord + offset; }
Čo to je? • je to forma zobrazenia, pri ktorej simulujeme správanie sa ľudského oka • ľudské oko je schopné zachytiť veľký rozsah intenzít svetla • naraz však dokáže zobraziť len malú časť • vždy sa zobrazuje iný rozsah intenzity svetla, ten závisí od celkovej intenzity svetla, ktoré vstupuje do oka • ďalším faktorom pri HDR je pomalá adaptácia svetelným podmienkam
Výhody • dynamickosť scény • energia, ktorú vyžarujú povrchy v scéne je čo najlepšie rozdistribuovaná do rozsahu 0 až 1 • možnosť pridania ďalších efektov ako je bloom, star efekt a pod.
Nevýhody • niekoľkonásobné väčšie nároky na bandwidth grafickej karty • vyžaduje niekoľko dodatočných výpočtov na konci renderovania scény • vyžaduje float textúry(SM 2.0 HW) • zatiaľ obmedzené použitie antialiasingu s HDR • vhodná je aj podpora float blendingu(SM 3.0 HW)
Postup • scéna sa vyrenderuje do float framebuffru • vypočíta sa priemerná luminancia scény • (môže sa pridať bloom alebo star effekt) • prebehne tonemapping • Výsledok sa zobrazí na obrazovke
Počítanie luminancie • všteko prebieha na grafickej karte • z float framebufferu s vyrenderovanou scénou vytvoríme luminance textúru scény • Na každom pixeli prebehne funkcia float CalculateLuminance(float red, float green, float blue) { float luminance = red*0.3 + green*0.59 + blue*0.11; return log(luminance + epsilon); // epsilon bude mala konstanta } • získame priemernú luminanciu scény pomocou mipmapovania • to sa bude líšiť na NVIDA a ATI kartách
GeForce 6 a 7 • podporuje mipmapovanie NPOT(non-power of two) textur – luminančná textúra • zmipmapujeme túto textúru • priemerná luminancia bude uložená v poslednej mipmape
ATI Radeon • nepodporuje mipmapovanie NPOT(non-power of two) textur • najprv pomocou shaderu namapujeme luminančnú textúru na POT 1-komponentovú textúru s pomocou lineárneho - filteringu ... • 512x512 a pod. • - ďalej pokračujeme ručným downsaplovaním textúry až sa dostaneme na rozmer 1x1
Tonemapping • spočíva v mapovaní hodnot z framebuffera v rozmedzi 0 az nekonecno na rozsah 0 az 1, ktorý je pripravený na zobrazenie na monitore • dosiahneme to delenim farby pixelu z float framebuffru, sebou samou + 1 • final_color = HDR_color / (HDR_color + 1.0) • spôsobov ako dosiahnuť tonemapping, je viacero a väčšina je omnoho sofistikovanejšia ako uvádzaná metóda • - prípadne sa dá doimplementovať postupná adaptácia na zmenu osvetlenia