19. 6. 2019

Abakus


Herné objekty zložené z polygónov a pokryté textúrami sú hnusné zlo. Neinteraktívne, rigidné, zaberajúce veľa pamäte, zahlcujúce zbernice. Niet grafika, ktorý by vám povedal niečo iné. Ako ich však nahradiť ? Matematikou. Škola vás určite naučila, že všetky zvuky, mechanické vlnenie, sa dajú rozložiť na sústavu sinusoid. Komplexné rovnice=komplexný zvuk. Vietnamsky syntetizátor z blšáku. Rovnakým spôsobom vieme matematicky zachytiť "optickú" informáciu. Bod, pixel, tvar, svetlo, animáciu, odraz, lom. Totalný binárny Matrix.

V roku 2013 Inigo Quilez a Pol Jeremias založili stránky ShaderToy.com /pomalá srágora v okne, beží to via WebGLS ale na ilustráciu to musí stačiť/, ktorá slúži ako hub pre produkciu, vývoj, experimentovanie, zdieľanie informácii o procedurálnej "non polygón, non bitmap textúra" generovanej grafike a zvuku. Čistá matematická funkcia. Shader SIMD jednotky vašej GPU do boja.


Nič z toho čo vidíte v tom videu vyššie nemá spoločné s grafickými technikami, ktoré používame celé desaťročia. Objekty nie sú zložené z tisícok polygónov, niet tam jedinej textúry /ani problémy s UV mapping, klasickým boj s projekciou 2D obrazku na zakrivený pobvrch/. Animácia, deformácie, ten raytracing, reflexie a tiene. Všetko bez toho aby ste na to mali v VRAM vyhradené gigabajty priestoru. Pritom narozdiel od polygon-raster klasiky nad tým máte absolútnu "parametrickú" invenčnú slobodu. Skúste do štandardného mesh objektu /polygóny+textúra/ umelecky či deštrukčne zasahovať robením dier, ohýbanim, splývanim objektov, zvetravaním, odsekávanim. Tvrdo narazíte.

Ten lesík je prostý 24KB súbor /kód a dáta/, niet tam 20 mega textúr /a mipmáp/, 2 mega modelov /a ich LODov/, megabajt animácie, bez požiadavky na aspoň 2-4-8 giga VRAM v 1080p/4K. Nič z toho. Nižšie zas máte dioráma: krajinka, pyramída, stena, oblaky a hmlu v pár riadkoch kódu. Tak jednoduché to je. V stredoveku, pri pomalých počítačoch bolo rozumné uložiť objekt polygónový mesh a ocapať ho iks textúrami,  "vypočítať" sa to v reálnom čase ešte nedalo. Dnes máme k dispozícií 1000-10 000-100 000 krát a dostávate možnosť voľby.


 
// terrain float f;f = 0.50000000f*noise2f( 1.0f*x, 1.0f*z);f += 0.25000000f*noise2f( 2.0f*x, 2.0f*z);f += 0.12500000f*noise2f( 4.0f*x, 4.0f*z);f += 0.06250000f*noise2f( 8.0f*x, 8.0f*z);f += 0.03125000f*noise2f( 16.0f*x, 16.0f*z);f += 0.01562500f*noise2f( 32.0f*x, 32.0f*z);f += 0.00781250f*noise2f( 64.0f*x, 64.0f*z);f += 0.00390625f*noise2f(128.0f*x, 128.0f*z);f = 0.5f+0.5f*f;f = f*f*(3.0f-2.0f*f);f = f*f*(3.0f-2.0f*f);f = -2.5f + 1.5f*f;
// chinese wall float cx = x-1.5f*noise2f( 2.0f*x, 2.0f*z);float cz = z+1.5f*noise2f( 2.0f*x, 2.0f*z);float di = fabsf(cx+cz);if( di
// pyramid float g;z -= 2.0f;float rx = x*0.9f-z*0.2f;float rz = x*0.2f+z*0.9f;g = 0.25f - fabsf(rx*1.65f) - fabsf(rz*1.65f);g = ((int)(g*10.0f))/10.0f; // stairsif( fabsf(rx+rz) // select terrain or pyramid if( g>f ) f=g;return f;}}
 // void fog ( float *rgb, float t, const float *rayDir){float fog = (1.0f-m2xf(-2.5f*rayDir[1]*t) ) / rayDir[1];collerp(rgb, fog*0.01f, rgb, fogColor);} 

Často tu spomínam rôzne nové princípy modelovania objektov, ich umiestnenie v priestore, súradnicové systémy. Ako prekonať drakonické obmedzenie kombinácie polygon-textúra. Jedeným z nádejných adeptov je SDF /signed distance function-field/. Funkcia ktorá nám okrem  iného určí najkratšiu vzdialenosť istého bodu od určeného povrchu aj počas jeho pohybu. Funkcia pre guľu so stredom v jej centra a polomerom jedna je :