Polun jäljitys

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 14. kesäkuuta 2013 tarkistetusta versiosta . vahvistus vaatii 31 muokkausta .

Polun jäljitys on tietokonegrafiikan  renderöintitekniikka , joka pyrkii simuloimaan valon fyysistä käyttäytymistä mahdollisimman lähellä todellista asiaa. Polun jäljitys on kehittynyt erikoistapaus perinteisestä säteenseurannasta , jonka algoritmi jäljittää säteet virtuaalikamerasta avaruuden läpi; säde "pomppaa" esineistä, kunnes se imeytyy kokonaan tai hajoaa. Polunjäljitysmenetelmällä tuotettujen kuvien laatu on yleensä parempi kuin muilla renderöintimenetelmillä tuotettujen kuvien laatu, mutta polun jäljitys on paljon laskennallisesti vaativampaa.  

Polun jäljitys on yksinkertaisin, fyysisesti tarkin ja hitain renderöintimenetelmä. Reitin jäljitys toistaa luonnollisesti monia optisia tehosteita, joita on vaikea saavuttaa tai jopa saavuttamattomissa muilla renderöintitekniikoilla : varjostukset , syväterävyys , liikesumentuminen , kaustiset vaikutukset , ympäristön tukos ja epäsuora valaistus . Näiden optisten tehosteiden toteuttaminen polun jäljityksellä on paljon helpompaa kuin muilla tekniikoilla.   

Sen tarkkuuden ja likiarvojen ja oletusten puuttumisen ( englanniksi  puolueeton ) perusteella polun jäljitystä käytetään kuvien luomiseen, joita käytetään sitten vertailunäytteinä muiden algoritmien renderöintilaadun arvioimiseen. Jotta polun jäljityksellä generoituja korkealaatuisia kuvia saataisiin, on jäljitettävä erittäin suuri määrä säteitä; muuten graafiset artefaktit näkyvät kohinan muodossa .

Historia

Renderöintiyhtälön ja sen soveltamisen tietokonegrafiikkaan esitteli James  Kajiya vuonna 1986 [1] . Tämä esitys oli ensimmäinen kuvaus polun jäljitysalgoritmista. Myöhemmin samana vuonna Lafortune ehdotti useita parannuksia algoritmiin, mukaan lukien kaksisuuntainen polkujäljitys [2] .  

Eric Veach ja Leonidas J. esittelivät vuonna 1997 Metropolis - kevyen kuljetuksenhäiritä aiemmin löydettyjä polkuja suorituskyvyn parantamiseksi monimutkaisissa kohtauksissa .  

Jonkin ajan kuluttua GPU :t saavuttivat sen kehitystason, että ne pystyivät herättämään kiinnostusta polkujäljityslaskelmien siirtämiseen niille. Tim Purcell esitteli ensimmäisenä  globaalin valaistusalgoritmin vuonna 2002 , joka toimi GPU: lla [4] . Vuonna 2009 Vladimir Koilazov esitteli ensimmäisen kaupallisen toteutuksen polunjäljitysalgoritmista, joka toimii GPU:lla [5] . Tätä helpotti GPGPU -keskeisten ohjelmointityökalujen, kuten CUDA ja OpenCL , kypsyminen .

Kuvaus

Todellisessa maailmassa valonlähteet säteilevät monia pieniä osia valosta ja ne etenevät suorina linjoina säteinä väliaineen läpi ja kohteesta toiseen, muuttaen niiden väriä ja voimakkuutta. Tämä "matka" jatkuu, kunnes säteet imeytyvät esineisiin, mukaan lukien esineet, kuten ihmissilmä tai kamera. Tätä säteen etenemisprosessia simuloidaan polun jäljityksellä, paitsi että säteet jäljitetään päinvastoin virtuaalikamerasta (tarkkailija) valonlähteeseen. Tämä johtuu siitä, että vain hyvin pieni osa valonlähteestä tulevista säteistä osuu virtuaalikameran linssiin, joten säteiden hallitsevan enemmistön laskenta ei vaikuta virtuaalikameran vastaanottamaan kuvaan. millään tavalla.

Tämä käyttäytyminen kuvataan matemaattisesti renderöintiyhtälössä . Tämä yhtälö yrittää ratkaista polun jäljitysalgoritmit.

Polun jäljitys ei ole yksinkertaista säteen jäljitystä , jossa on rajoittamaton säteen heijastus (eli rekursiivinen syvyys). Perinteisessä säteenseurannassa valo lasketaan sillä hetkellä, kun säde leikkaa suoraan hajapinnan. Polun jäljityksessä uusi säde luodaan satunnaisesti kohteen pallonpuoliskoon ja sitten jäljitetään, kunnes se leikkaa valonlähteen, mikä voi tapahtua tai ei. Reitin jäljityksessä säteen reitti voi risteä monien hajapintojen kanssa ennen kuin se leikkaa valonlähteen.

Polun jäljityksen toteuttava pseudokoodi saattaa näyttää tältä:

Väri TracePath ( Ray ray , count syvyys ) { if ( syvyys >= MaxSyvyys ) { paluu Musta ; // Pomppinut tarpeeksi kertaa. } säde . EtsiLähimmäinenObject (); if ( ray . hitSomething == false ) { paluu Musta ; // Mitään ei osunut. } Materiaali materiaali = säde . thingHit -> materiaali ; värin emittanssi = materiaali . päästöt ; // Valitse satunnainen suunta täältä ja jatka eteenpäin. Ray newRay ; uusiRay . alkuperä = säde . pointWhereObjWasHit ; // Tämä EI ole kosinipainotettu jakauma! uusiRay . suunta = RandomUnitVectorInHemisphereOf ( ray . normalWhereObjWasHit ); // NewRayn todennäköisyys const float p = 1 / ( 2 * M_PI ); // Laske tämän säteen BRDF (olettaen Lambertin heijastuksen) float cos_theta = DotProduct ( newRay . suunta , ray . normalWhereObjWasHit ); Väri BRDF = materiaali . heijastuskyky / M_PI ; // Jäljitä heijastuneita valonlähteitä rekursiivisesti. Väri saapuva = TracePath ( newRay , syvyys + 1 ); // Käytä renderöintiyhtälöä tässä. paluu emittanssi + ( BRDF * saapuva * cos_theta / p ); } void Render ( Image finalImage , count numSamples ) { foreach ( pikseli lopullisessa kuvassa ) { foreach ( i in numSamples ) { Ray r = kamera . generRay ( pikseli ); pikseli . väri += TracePath ( r , 0 ); } pikseli . väri /= numSamples ; //Keskimääräiset näytteet. } }

Jos yllä olevassa esimerkissä jokainen suljetun tilan pinta säteilee ja heijastuisi (0,5, 0,5, 0,5), kuvan jokainen pikseli olisi valkoinen .

Kaksisuuntainen säteen seuranta

Voit ottaa näytteen pisteen integraalista kahdella riippumattomalla menetelmällä:

  • Ammu säteitä  valonlähteistä ja luo polkuja kohtaukseen. Polun katkaisee satunnainen määrä säteen askeleita-pomppuja. Valo suunnataan sitten tuloksena olevan kuvan projisoituun pikseliin. Tämän renderöintimenetelmän aikana luodaan miljoonia polkuja ja osallistuvien polkujen renderöintitulokset tallennetaan kuvaan.
  • Säteiden kerääminen  pinnan pisteestä. Säde laukeaa kuvan pikselien läpi ja pomppii ympäri kohtausta, kunnes se kohtaa tiellään valonlähteen. Valonlähteestä tuleva valo lähetetään sitten kuvan pikselien suuntaan. Polun luomisprosessia kutsutaan "näytteenotoksi". Yksi pintapiste vastaanottaa yleensä 800 näytettä (jopa 3 tuhatta). Lopullinen kuva käännetään aritmeettisten operaatioiden avulla, ei yksinkertaisen näytteiden summauksen avulla.

Kaksisuuntainen säteenseuranta yhdistää kuvaamisen  ja  keräämisen  yhteen algoritmiin, mikä johtaa nopeampaan kuvan lähentymiseen (nopeampi ja vähemmän kohinaa). Nämä 2 polkugenerointimenetelmää jäljitetään itsenäisesti ja sitten ammuntapolun alku yhdistetään vahvistuspolun pyrstöyn. Valon vaimennus jokaisen säteen pomppauksen yhteydessä otetaan huomioon ja tallennetaan kuvan pikseleinä. Tämä tekniikka näyttää ensi silmäyksellä paradoksaalisen hitaalta, mutta tämä johtuu siitä, että 2 polkua tarkastellaan kerralla. Käytännössä päinvastoin kuvan lisäkonvergenssin nopeus kompensoi hidastuksia, jotka johtuvat tarpeesta vapauttaa yhä enemmän uusia säteitä.

Kuvien lähentymisen (konvergenssin, lähentymisen) nopeuttamiseksi kaksisuuntaiset algoritmit jäljittävät polkuja molempiin suuntiin. Eteenpäin suunnattuja säteitä jäljitetään valonlähteestä, kunnes ne ovat niin heikkoja, että niitä ei voi nähdä, tai kunnes ne osuvat virtuaalisen kameran linssiin. Vastakkaiseen suuntaan eli normaaliin tavanomaiseen suuntaan säteitä jäljitetään virtuaalikamerasta, kunnes ne törmäävät valonlähteeseen tai kunnes niiden heijastumien määrä ylittää tietyn rajan. Tämä lähestymistapa johtaa yleensä kuvaan, joka konvergoi paljon nopeammin kuin käyttämällä vain yhtä suuntaa.

Veach ja Guibas antoivat tarkemman kuvauksen kaksisuuntaisesta polun jäljittämisestä [3] :

Nämä menetelmät luovat kaksi alipolkua: toinen alkaa valonlähteestä ja toinen alkaa virtuaalikameran linssistä. Sitten ne <methods> ottavat huomioon kaikki polut, jotka saadaan ketjuttamalla yhden alipolun jokainen etuliite toisen alipirun jokaisen päätteen kanssa. Tämä johtaa joukkoon erilaisia ​​tärkeitä näytteenottotekniikoita, jotka sitten yhdistetään erojen minimoimiseksi.

Alkuperäinen teksti  (englanniksi)[ näytäpiilottaa]

Nämä menetelmät luovat yhden alipolun, joka alkaa valonlähteestä ja toisen, joka alkaa linssistä, ja tarkastelevat sitten kaikkia polkuja, jotka on saatu yhdistämällä yhden alipolun jokainen etuliite toisen alipolun jokaiseen päätteeseen. Tämä johtaa eri tärkeysluokan näytteenottotekniikoiden perheeseen poluille, jotka sitten yhdistetään varianssin minimoimiseksi.

Suorituskyky

Polkujäljitin ottaa jatkuvasti näytteitä ( englanniksi  sampling - sampling ) kuvan pikseleistä. Kuvasta tulee erottuva vain, kun otetaan useita näytteitä pikseliä kohden, jopa 100 näytettä pikseliä kohden. Normaalikuvista ja digitaalisen kohinan vähentämiseksi hyväksyttävälle tasolle otetaan yleensä noin 5000 näytettä. tapauksissa näytteiden määrä kuitenkin paljon Renderöintiprosessi voi kestää tunteja tai päiviä riippuen kohtauksen monimutkaisuudesta ja laitteiston ja ohjelmiston suorituskyvystä. Nykyiset GPU -toteutukset lupaavat 1-10 Ms/s, mikä mahdollistaa suhteellisen äänettömän ja hyväksyttävän laadukkaan kuvan luomisen sekunneissa tai minuuteissa. Digitaalinen kohina muodostaa erityisen ongelman animaatioille ja luo kuvaan yleensä ei-toivotun "rakeisen" vaikutelman.

Metropolis kevytkuljetusmenetelmät onnistuneita polkuja ja tuottavat ensin kuvan kannalta tärkeämmät näytteet. Tämä voi vähentää kuvan kohinaa ja vähemmän näytteitä.

Renderöijän suoritustasoa on melko vaikea arvioida reilusti. Yksi tapa on laskea näytteitä sekunnissa, toinen laskee polkujen määrän, jotka voidaan jäljittää ja lisätä kuvaan sekunnissa. Näiden menetelmien tulokset vaihtelevat huomattavasti kohtauksesta toiseen ja riippuvat "polun syvyydestä", eli kuinka monta kertaa säteen annetaan pomppia kohteesta ennen kuin se pysäytetään. Suorituskyvyn mittaustulos riippuu myös suuresti käytetystä laitteistosta. Lopuksi yksi renderöijä voi tuottaa monia huonolaatuisia näytteitä, kun taas toinen voi hahmontaa lopullisen kuvan nopeammin käyttämällä vähemmän korkealaatuisia näytteitä.

Sirontajakaumafunktiot

Pintojen heijastavuus – heijastuneen valon määrä, suunta ja väri – mallinnetaan kahden säteen heijastusfunktiolla . Siirretyn valon (kohteen läpi kulkeneen valon) ekvivalentti on kaksisuuntaisen pintaheijastuksen sironnan funktio ( eng.  Bidirectional scattering distribution function ). Polun jäljitin voi hyödyntää täyden hyödyn monimutkaisista, huolellisesti mallinnetuista tai lasketuista jakelufunktioista, jotka määrittävät objektin ulkonäön ("materiaali", "tekstuuri" ja "varjostus" CG-termeissä).

Muistiinpanot

  1. Kajiya , JT, Renderöintiyhtälö Arkistoitu 6. lokakuuta 2012 Wayback Machinessa , Proceedings of the 13th Annual Conference on Computer Graphics and Interactive Techniques , ACM, 1986
  2. Lafortune, E, Matemaattiset mallit ja Monte Carlo -algoritmit fyysiseen hahmonnukseen Arkistoitu 24. huhtikuuta 2010 Wayback Machinessa , (PhD thesis), 1996
  3. 1 2 Veach, E. ja Guibas, LJ Metropolis light transport Arkistoitu 16. toukokuuta 2017 Wayback Machinessa . Julkaisussa SIGGRAPH'97 (elokuu 1997), s. 65–76.
  4. Purcell, TJ; Buck, minä; Mark, W; ja Hanrahan, P, "Ray Tracing on Programmable Graphics Hardware", Proc. SIGGRAPH 2002 , 703 - 712. Katso myös Purcell, T, Ray tracing on a stream processor Arkistoitu 10. lokakuuta 2017 Wayback Machinessa (PhD thesis), 2004
  5. Vray-demo Arkistoitu 2. toukokuuta 2016 Wayback Machinessa ; Muita esimerkkejä ovat Octane Render, Arion ja Luxrender.

Ulkoiset linkit