Ray tracing în timp real. DirectX Raytracing: ray tracing în timp real

Nu cu mult timp în urmă, 4A Games, creatorul de jocuri Metro uimitor de realiste, a lansat un videoclip folosind tehnologia RTX de la Nvidia folosind METRO: EXODUS ca exemplu. Această inovație grafică este un pas mare și încrezător înainte în ray tracing. Dar ce înseamnă toate acestea?

În spatele vălului secretului

Să începem de la bun început. În primul rând, randarea ray tracing este unul dintre tipurile de bază de vizualizare care este utilizat în filme și diferite tipuri de design: de la industrie la arhitectură. Adică, ceea ce vezi pe site-uri web ca fotografii ale echipamentelor este exact o randare 3D.

Esența tehnologiei este că computerul modelează comportamentul fizic al luminii calculând traiectoria fotonilor individuali ai luminii, adică dacă un fascicul cade asupra unui obiect, atunci este fie refractat în el, fie reflectat dintr-unul. unghi sau altul. Rezultatul este o anumită urmă a acestei raze de lumină, de unde și denumirea de „ray tracing”.

Această imagine generată de computer de Enrico Cerica folosind OctaneRender arată razele, umbrele și reflexiile pe o suprafață complexă a podelei.

Singura problemă este că sunt necesare o mulțime de raze și pentru fiecare dintre ele este necesar să se calculeze în mod repetat fiecare ciocnire a razei cu obstacole. Este, de fapt, o simplă problemă de matematică. Mai întâi, trebuie să calculați unde fasciculul lovește un obiect existent, adică să calculați coliziunea, apoi, pe baza proprietăților specificate, trebuie să faceți transformări matematice suplimentare.


Schemă simplificată de urmărire a razei

De exemplu, există o suprafață mată cu o anumită rugozitate condiționată dată, dar nu absolut rugoasă, iar fasciculul se abate de la ea cu o anumită probabilitate cu un unghi diferit de unghiul de incidență. Trebuie avut în vedere că, dacă obiectul are proprietatea de neted infinit, atunci unghiul de incidență este egal cu unghiul de reflexie. Dacă proprietățile suprafeței vorbesc despre ceață, atunci matematic acest lucru se realizează prin abaterea unghiului de reflexie de la unghiul de incidență.

În viață, acest lucru este adevărat, suprafața nu este aproape întotdeauna complet netedă. Prin urmare, atunci când lumina lovește un punct sau altul, este reflectată în raport cu locația suprafeței, care poate fi rotită cumva față de planul care ni se pare uniform, iar fasciculul adiacent este reflectat într-o direcție complet diferită. Astfel, devine destul de clar că nu are rost să facem modele de obiecte excesiv de poligonale, așa că neregulile sunt stabilite de proprietățile suprafeței. Rezultatul este similar cu împrăștierea reală a luminii de pe suprafețele mate.

Acum, în jocuri, folosesc un obiect care arată ca și cum ar fi uns cu ceva asemănător cu glazura. Fără îndoială, toată lumea a văzut pereți și podele ciudate în jocuri care par uns cu un fel de slime. Ei bine, nu trebuie să faceți acest lucru cu ray tracing - suprafețele pot împrăștia lumina în mod destul de natural. Acest lucru se arată perfect în demo, există o serie de zone de la cele mai oglindite la cele mai mate.

Este de observat mai ales că în zonele mate reflexia depinde foarte mult de apropierea obiectului de suprafață. Adică, cu cât obiectul este mai departe de suprafață, cu atât devine mai neclar. Aceasta este o proprietate importantă pe care nici măcar nu o observăm în viață, deși există.

Dar cel mai important lucru sunt umbrele. Nu există nimic mai rău decât umbrele în orice joc.

Acestea sunt de obicei doar proiecții ale obiectelor care au margini ascuțite, nenaturale. Cu toate acestea, există umbre mai bune, după standardele de joc. Acestea sunt opțiuni moi cu o linie de tranziție, adică umbră și penumbră.


Pentru a crea umbre moi sau reflexii difuze (ca cele pe care le vedeți în metalul periat, de exemplu), sunt necesare tehnici mai avansate de ray tracing.

Singura problemă este că nu funcționează așa în viața reală. Dacă sursa de lumină nu este un punct și nu este infinit de distanță, atunci cantitatea de penumbra depinde de raportul dintre distanța sursei de lumină de la obiect și distanța obiectului de umbra acestuia. Adică, marginea penumbrei în diferitele sale locuri poate fi mai largă sau mai îngustă, mai ales când vine vorba de surse de lumină mari.

De exemplu, lumina de la o fereastră pe vreme înnorată dă umbre atât de blânde, încât dacă plasați un obiect mult mai mic la doi metri de această fereastră, puteți vedea o umbră clară și umbră parțială la baza acesteia și este posibil să nu existe o umbră la toate din partea superioară a obiectului, iar penumbra nu va avea limite clare. În jocurile cu rasterizare tradițională, acest lucru nu se întâmplă.

Ray tracing nu este dificil, dar există o mulțime de raze și, din păcate, în acest moment nu este posibil să faci totul în timp real. Faptul este că în viață razele diverge în direcții complet diferite. Ideal ar fi ca fasciculul incident să fie împărțit într-un număr infinit de fascicule, a căror luminozitate totală ar depinde de proprietatea obiectului care reflectă și de luminozitatea inițială a fasciculului incident.

Pentru a reduce sarcina, puteți limita numărul de raze, numărul de ciocniri, dar aceste restricții duc la faptul că în imagine obțineți bucăți mici de umbră și pete nefiresc de luminoase de la sursele de lumină. Adică, o cantitate insuficientă de date duce la apariția zgomotului, iar întreaga dificultate constă în faptul că este imposibil să calculați scena o dată și apoi să schimbați în ea doar ceea ce se schimbă de la cadru la cadru, deoarece orice obiect în mișcare se schimbă. toate traseele tuturor razelor. Din fiecare mișcare a camerei și a obiectelor, trebuie să „reconstituiți” întreaga scenă din nou, motiv pentru care filmele sunt create de fermele de randare și numeroase servere care redă continuu, timp de câteva luni, grafica. Dar, din păcate, în timp real în jocuri, acest lucru este încă imposibil de făcut.

Prin urmare, se pune întrebarea, cum au ieșit Nvidia și partenerii din această situație: ce au sacrificat pentru a obține urmărirea în timp real?

Două jumătăți dintr-un întreg

Dacă urmăriți cu atenție modul în care imaginea este redată în etape, puteți vedea că undeva după a cincea integrare, umbrele și lumina în sine se schimbă deja vizibil. Devine clar unde, ce și cum va arăta în forma finală. Pentru aceasta, în principiu, este nevoie de software în timp real, astfel încât să poți răsuci sursele de lumină, să înțelegi unde va fi ceva strălucire și apoi să începi redarea finală. Rămâne de văzut cum poate fi înțeles cadrul final din poza noroioasă. De fapt, computerul modelează mai întâi imaginea zgomotoasă inițială, apoi o analizează și, pe baza datelor obținute, desenează alta - cea finală. După cum a arătat practica, această abordare este mai simplă în ceea ce privește costurile resurselor.

De fapt, un salt progresiv în dezvoltarea urmăririi în timp real este crearea unor algoritmi care ne permit să evaluăm o imagine dintr-o stare zgomotoasă și să o ridicăm la normal. Aceasta este inovația cheie. Orice altceva a fost folosit pe scară largă înainte. Multe randare au redare GPU și pluginuri OpenGL acceptate de orice placă grafică compatibilă OpenGL.

Astăzi se susține că această tehnică de reducere a zgomotului funcționează doar pe nucleele fragede din viitoarele carduri de la Nvidia. Dar, de fapt, această tehnologie a fost prezentată în cantități mari abia acum și a apărut, se pare, anul trecut, deoarece în octombrie, la unul dintre evenimente, Unity a arătat tocmai această tehnologie pentru eliminarea zgomotului în urmărirea în timp real.

Trucul este că nu toate obiectele participă la ray tracing așa cum ar trebui. În acest sens, vom atinge subiectul iluminării globale - mecanismul de urmărire cu cel mai mare consum de resurse. În viață, orice obiect pe care cade lumina reflectă o parte din această lumină. De exemplu, dacă îndreptați o sursă de lumină către un perete verde, atunci toată iluminarea va deveni verde, deoarece peretele verde nu absoarbe bine lumina.


Reflectarea razelor de lumină de pe o suprafață

Nu a existat un astfel de efect în demo. În loc să reflecte lumina și să schimbe modelul de lumină al cadrului în funcție de sursa de lumină, întregul spațiu a fost umplut cu imagini luminoase, ceea ce face ca lumina să pară dinamică. De fapt, dezvoltatorii nu au aplicat ray tracing la detalii precum ceață și flăcări.

Cert este că razele de lumină trebuie calculate indiferent dacă cad pe obiecte sau nu. Adică, adăugarea unui număr mare de lumini este o sarcină destul de dificilă pentru urmărirea calculelor. În plus, în nicio demonstrație techno nu există obiecte care imite obiecte transparente.

Când vom vedea beneficiul?

Pe baza criteriilor descrise mai sus (nebulozitatea imaginii și trasarea nu a tuturor obiectelor), putem spune că grafica din jocuri nu poate arăta încă la fel de detaliată și realistă ca în filme.

Cu toate acestea, există cu siguranță progrese. În primul rând, reflexiile sunt acum mai ușor de făcut, nu este nevoie să creați hărți de umbră și lumină - toate acestea sunt rezolvate prin trasare. În al doilea rând, a apărut cel puțin o aparență de reflexii împrăștiate. În al treilea rând, iluminarea și umbrele obiectelor s-au îmbunătățit semnificativ. Toate împreună, se poate argumenta că aceasta poate fi considerată o tehnologie cheie în jocuri care nu va renunța la pozițiile sale în următorii zece ani.

Text: Alexey Kharitonov, QA, Bytex

Metoda urmăririi înapoi

Metodă urma spatelui razele vă permite să reduceți semnificativ căutarea razelor de lumină. Metoda a fost dezvoltată în anii 80, lucrările sunt considerate fundamentale albităși Kay. Conform acestei metode, trasarea razelor se efectuează nu din surse de lumină, ci în direcția opusă - punctul de observație. În acest fel, sunt luate în considerare doar acele raze care contribuie la formarea imaginii.

Luați în considerare modul în care puteți obține o imagine bitmap a unei scene tridimensionale folosind metoda de urmărire a spatelui. Să presupunem că planul de proiecție este împărțit în mai multe pătrate - pixeli. Să alegem o proiecție centrală cu centrul care dispare la o anumită distanță de planul de proiecție. Să tragem o linie dreaptă din centrul coborârii prin mijlocul pătratului (pixel) al planului de proiecție. Aceasta va fi raza principală de urmărire a spatelui. Dacă linia dreaptă a acestei raze lovește unul sau mai multe obiecte de scenă, atunci selectați cel mai apropiat punct de intersecție. Pentru a determina culoarea unui pixel de imagine, este necesar să se țină seama de proprietățile obiectului, precum și de ce fel de radiație luminoasă cade în punctul corespunzător al obiectului.

Dacă obiectul este specular (cel puțin parțial), atunci construim o rază secundară - o rază de incidență, considerând raza urmărită anterioară, primară ca o rază de reflexie. Mai sus, am luat în considerare reflexia speculară și am obținut formule pentru vectorul raze reflectate având în vedere vectorii raze normale și incidente. Dar aici știm vectorul fasciculului reflectat, dar cum să găsim vectorul fasciculului incident? Pentru a face acest lucru, puteți utiliza aceeași formulă de reflexie speculară, dar specificând vectorul de rază incidentă necesar ca raza reflectată. Adică reflecția opusă i.

Pentru o oglindă ideală, este suficient să urmăriți doar următorul punct de intersecție al fasciculului secundar cu un obiect. O oglindă neideală complică foarte mult trasarea - este necesar să urmăriți nu una, ci multe raze incidente și să țineți cont de contribuția radiațiilor de la alte obiecte vizibile dintr-un punct dat.

Dacă obiectul este transparent, atunci este necesar să construiți o nouă rază, una care, atunci când este refractă, ar da raza urmărită anterioară. Aici puteți folosi și reversibilitatea, care este valabilă și pentru refracție.

Dacă un obiect are proprietăți de reflexie difuză și refracție, atunci, în cazul general, ca și pentru o oglindă neideală, este necesar să se urmărească razele care provin de la toate obiectele disponibile. Pentru reflexia difuză, se știe că intensitatea luminii reflectate este proporțională cu cosinusul unghiului dintre vectorul de raze de la sursa de lumină și normal. Aici, sursa de lumină poate fi orice obiect vizibil dintr-un punct dat, capabil să transmită energie luminoasă.

Când se dovedește; că raza curentă de urmărire a spatelui nu intersectează niciun obiect, ci merge în spațiul liber, apoi trasarea pentru această rază se termină.

Orez. 14.1 Un exemplu de trasare inversă a razelor.

Ray tracing în forma în care am considerat-o aici, deși reduce enumerarea, nu permite scăparea de infinitatea numărului de raze analizate. Într-adevăr, această metodă face posibilă obținerea imediată a unei singure raze de urmărire inversă primară pentru fiecare punct al imaginii. Cu toate acestea, poate exista deja un număr infinit de raze de reflexie secundare. Deci, de exemplu, dacă un obiect poate reflecta lumina de la orice alt obiect și dacă aceste alte obiecte sunt suficient de mari, atunci care puncte ale obiectelor emitente ar trebui să fie luate în considerare pentru a construi razele corespunzătoare, de exemplu, în reflexie difuză? Evident, toate punctele.

Cum funcționează ray tracing:

1. O rază imaginară este emisă din ochiul observatorului printr-un pixel al ecranului și traseul acesteia este urmărit până când intersectează obiectul.

2. Din primul punct de intersecție a fasciculului cu sfera se emite un fascicul reflectat. Lasati suprafata sa fie opaca. Atunci nu desenăm raze refractate. Desemnăm o rază de umbră de la punctul de intersecție până la sursa de lumină. Deoarece această rază nu traversează o altă suprafață opacă, sursa de lumină afectează direct intensitatea iluminării la un punct dat.

3. Lăsați fasciculul reflectat să intersecteze un alt obiect, de data aceasta o sferă translucidă care reflectă și transmite lumină. Razele reflectate și refractate sunt emise împreună cu o rază de umbră care se îndreaptă spre sursa de lumină. Fasciculul transmis își schimbă direcția înainte și după intrarea în sferă în conformitate cu efectul refracției.

4. Punctul în care raza traversează sfera să nu fie iluminat direct de sursă, deoarece traseul razei de umbră este blocat de o suprafață opaca. Dacă scena ar conține mai multe surse de lumină, atunci razele de umbră ar trebui să fie aruncate în fiecare dintre ele.

5. Influența tuturor razelor generate explicit sau implicit folosind raza inițială este însumată și rezultatul determină valoarea RGB a acestui punct.

La Gamescom 2018, Nvidia a anunțat o serie de plăci grafice Nvidia GeForce RTX care vor suporta tehnologia Nvidia RTX de ray tracing în timp real. Editorii noștri și-au dat seama cum va funcționa această tehnologie și de ce este necesară.

Ce este Nvidia RTX?

Nvidia RTX este o platformă care conține o serie de instrumente utile pentru dezvoltatori care deschid accesul la un nou nivel de grafică pe computer. Nvidia RTX este disponibil doar pentru noua generație de plăci grafice Nvidia GeForce RTX bazate pe arhitectura Turing. Caracteristica principală a platformei este posibilitatea ray tracing în timp real(numit și ray tracing).

Ce este ray tracing?

Ray tracing este o caracteristică care vă permite să simulați comportamentul luminii, creând o iluminare credibilă. Acum, în jocuri, razele nu se mișcă în timp real, motiv pentru care imaginea, deși arată adesea frumoasă, încă nu este suficient de realistă - tehnologiile utilizate în prezent ar necesita o cantitate imensă de resurse pentru ray tracing.

Acest lucru este corectat de noua serie de plăci grafice Nvidia GeForce RTX, care are suficientă putere pentru a calcula traseul razelor.

Cum functioneaza?

RTX proiectează razele de lumină din punctul de vedere al jucătorului (camera) în spațiul înconjurător și calculează în acest fel unde ar trebui să apară culoarea pixelului. Când grinzile lovesc ceva, pot:

  • Reflect - aceasta va provoca apariția unei reflexii pe suprafață;
  • Stop - aceasta va crea o umbră pe partea obiectului pe care lumina nu a lovit-o
  • Refractare - aceasta va schimba direcția fasciculului sau va afecta culoarea.
Prezența acestor funcții vă permite să creați o iluminare mai credibilă și o grafică realistă. Acest proces consumă foarte mult resurse și a fost folosit de mult timp la crearea efectelor de film. Singura diferență este că atunci când redau un cadru al unui film, autorii au acces la o cantitate mare de resurse și, se poate considera, o perioadă de timp nelimitată. În jocuri, dispozitivul are fracțiuni de secundă pentru a forma o imagine, iar placa video este folosită, cel mai adesea, una, și nu mai multe, ca în procesarea filmelor.

Acest lucru a determinat Nvidia să introducă nuclee suplimentare în plăcile grafice GeForce RTX care vor prelua cea mai mare parte a sarcinii de lucru, îmbunătățind performanța. De asemenea, sunt echipate cu inteligență artificială, a cărei sarcină este să calculeze eventualele erori în timpul procesului de urmărire, ceea ce va ajuta la evitarea lor în avans. Acest lucru, după cum spun dezvoltatorii, va crește și viteza de lucru.

Și cum afectează ray tracing calitatea?

În timpul prezentării plăcilor video, Nvidia a arătat o serie de exemple despre modul în care funcționează ray tracing: în special, a devenit cunoscut faptul că unele jocuri viitoare, inclusiv Shadow of the Tomb Raider și Battlefield 5, vor funcționa pe platforma RTX. Această funcție, totuși, va fi opțională în joc, deoarece una dintre noile plăci video este necesară pentru urmărire. Trailerele prezentate de companie în timpul prezentării pot fi vizionate mai jos:

Shadow of the Tomb Raider, care va fi lansat pe 14 septembrie anul acesta:

Battlefield 5, care va fi lansat pe 19 octombrie:

Metro Exodus, care este programat să fie lansat pe 19 februarie 2019:

Control , care nu are încă o dată de lansare:

Împreună cu asta, Nvidia, ce alte jocuri vor primi ray tracing.

Cum se activează RTX?

Datorită caracteristicilor tehnice ale acestei tehnologii, doar plăcile video cu arhitectura Turing vor suporta ray tracing - dispozitivele disponibile în prezent nu pot face față cantității de muncă pe care o necesită trasarea. Momentan, singurele plăci video cu această arhitectură sunt seria Nvidia GeForce RTX, ale căror modele sunt disponibile pentru precomandă de la 48.000 la 96.000 de ruble.

Există analogi pentru AMD?

AMD are propria sa variantă de tehnologie de urmărire a razelor în timp real, care este prezentă în motorul lor Radeon ProRender. Compania și-a anunțat dezvoltarea la GDC 2018, care a avut loc în martie. Principala diferență dintre metoda AMD și Nvidia este că AMD oferă acces nu numai la urmărire, ci și la rasterizare, tehnologie care este acum folosită în toate jocurile. Acest lucru vă permite atât să utilizați urmărirea, obținerea unei iluminari mai bune, cât și să economisiți resurse în locuri în care urmărirea va fi o sarcină inutilă pe placa video.

Tehnologia care va rula pe API-ul Vulkan este încă în dezvoltare.

După cum a declarat Nvidia în timpul prezentării sale, dezvoltarea tehnologiei RTX va îmbunătăți semnificativ componenta grafică a jocurilor, extinzând setul de instrumente disponibile dezvoltatorilor. Cu toate acestea, este prea devreme să vorbim despre o revoluție grafică generală - nu toate jocurile vor suporta această tehnologie, iar costul plăcilor video cu suportul ei este destul de mare. Prezentarea noilor plăci video înseamnă că există progrese în detaliile grafice, iar în timp va crește și crește.

INTRODUCERE

Există mai multe metode de generare a imaginilor realiste, cum ar fi trasarea razelor înainte (trasarea fotonilor) și urmărirea razelor din spate.

Metodele de ray tracing sunt considerate a fi cele mai puternice și versatile metode pentru crearea de imagini realiste astăzi. Există multe exemple de implementare a algoritmilor de urmărire pentru afișarea de înaltă calitate a celor mai complexe scene tridimensionale. Se poate observa că universalitatea metodelor de urmărire se datorează în mare măsură faptului că acestea se bazează pe concepte simple și clare care reflectă experiența noastră de a percepe lumea din jurul nostru.

Obiectele din jurul nostru au următoarele proprietăți în raport cu lumina:

radia;

reflectă și absorb;

trec prin ei înșiși.

Fiecare dintre aceste proprietăți poate fi descrisă de un set de caracteristici.

Radiația poate fi caracterizată prin intensitate și spectru.

Proprietatea de reflexie (absorbție) poate fi descrisă prin caracteristicile împrăștierii difuze și reflexiei speculare. Transparența poate fi descrisă prin atenuarea intensității și refracția.

Raze de lumină emană din puncte de pe suprafața (volumul) obiectelor care iradiază. Astfel de raze pot fi numite primare - ele luminează orice altceva. Nenumărate raze primare emană din surse de radiații în diferite direcții. Unele raze intră în spațiul liber, iar unele cad pe alte obiecte.

Ca urmare a acțiunii razelor primare asupra obiectelor, apar razele secundare. Unele dintre ele ajung pe alte obiecte. Deci, reflectate și refractate în mod repetat, razele de lumină individuale ajung la punctul de observație. Astfel, imaginea scenei este formată dintr-un set de raze de lumină.

Culoarea punctelor individuale ale imaginii este determinată de spectrul și intensitatea razelor primare ale surselor de radiație, precum și de absorbția energiei luminoase în obiectele întâlnite în calea razelor corespunzătoare.

Implementarea directă a acestui model cu raze de imagistică este dificilă. Puteți încerca să construiți un algoritm de construcție a imaginii în modul specificat. Într-un astfel de algoritm, este necesar să se enumere toate razele primare și să se determine pe cele care lovesc obiectele și camera. Apoi repetați peste toate razele secundare și, de asemenea, luați în considerare doar cele care lovesc obiectele și camera. etc. Acest algoritm se numește trasarea directă a razei. Principalul dezavantaj al acestei metode este o mulțime de operațiuni inutile asociate cu calculul razelor, care apoi nu sunt utilizate.

1. REVERSE RAY TRACING

Această lucrare este dedicată acestei metode de generare a imaginilor realiste.

Metoda de trasare inversă a razelor poate reduce semnificativ căutarea razelor de lumină. Metoda a fost dezvoltată în anii 80, lucrările lui Whitted și Kay sunt considerate fundamentale. Conform acestei metode, trasarea razelor se efectuează nu din surse de lumină, ci în direcția opusă - din punctul de observație. În acest fel, sunt luate în considerare doar acele raze care contribuie la formarea imaginii.

Planul de proiecție este împărțit în mulți pixeli. Să alegem o proiecție centrală cu centrul care dispare la o anumită distanță de planul de proiecție. Desenați o linie dreaptă din centrul care dispare prin mijlocul pixelului planului de proiecție. Aceasta va fi raza principală de urmărire a spatelui. Dacă această rază lovește unul sau mai multe obiecte de scenă, atunci selectați cel mai apropiat punct de intersecție. Pentru a determina culoarea unui pixel de imagine, este necesar să se țină seama de proprietățile obiectului, precum și de ce fel de radiație luminoasă cade în punctul corespunzător al obiectului.

Dacă obiectul este specular (cel puțin parțial), atunci construim o rază secundară - o rază de incidență, considerând raza urmărită anterioară, primară ca o rază de reflexie.

Pentru o oglindă ideală, este suficient să urmăriți doar următorul punct de intersecție al fasciculului secundar cu un obiect. O oglindă ideală are o suprafață lustruită perfect netedă, astfel încât un fascicul reflectat corespunde unui singur fascicul incident. Oglinda poate fi întunecată, adică poate absorbi o parte din energia luminii, dar regula rămâne totuși: un fascicul cade - unul este reflectat.

Dacă obiectul este transparent, atunci este necesar să construiți o nouă rază, una care, atunci când este refractă, ar da raza urmărită anterioară.

Pentru reflexia difuză, se știe că intensitatea luminii reflectate este proporțională cu cosinusul unghiului dintre vectorul de raze de la sursa de lumină și normal.

Când se dovedește că raza de urmărire a spatelui actuală nu intersectează niciun obiect, ci intră în spațiul liber, atunci trasarea pentru această rază se termină.

În implementarea practică a metodei de urmărire înapoi se introduc restricții. Unele dintre ele sunt necesare pentru a putea rezolva problema sintezei imaginii în principiu, iar unele restricții pot crește semnificativ viteza de urmărire.

Restricții la implementarea urmăririi

Dintre toate tipurile de obiecte, vom evidenția unele, pe care le vom numi surse de lumină. Sursele de lumină pot emite doar lumină, nu o pot reflecta sau refracta. Vom lua în considerare doar sursele de lumină punctiforme.

Proprietățile suprafețelor reflectorizante sunt descrise prin suma a două componente - difuză și speculară.

La rândul său, specularitatea este descrisă și de două componente. Prima (reflexia) ia în considerare reflexia de la alte obiecte care nu sunt surse de lumină. Doar o rază r reflectată specular este construită pentru urmărire ulterioară. A doua componentă (speculară) înseamnă evidențieri din surse de lumină. Pentru a face acest lucru, razele sunt direcționate către toate sursele de lumină și se determină unghiurile formate de aceste raze cu raza de urmărire inversă reflectată specular (r). În oglindire, culoarea unui punct de suprafață este determinată de culoarea nativă a ceea ce este reflectat.

În cazul reflexiei difuze, sunt luate în considerare doar razele de la sursele de lumină. Razele de la suprafețele reflectorizante speculare sunt IGNORATE. Dacă un fascicul îndreptat către o anumită sursă de lumină este acoperit de un alt obiect, atunci acest punct al obiectului este în umbră. În reflexia difuză, culoarea unui punct iluminat de pe o suprafață este determinată de culoarea intrinsecă a suprafeței și de culoarea surselor de lumină.

Pentru obiectele transparente (transparente), dependența indicelui de refracție de lungimea de undă nu este luată în considerare. (Uneori, transparența este în general modelată fără refracție, adică direcția fasciculului refractat t coincide cu direcția fasciculului incident.)

Pentru a ține cont de iluminarea obiectelor prin lumina împrăștiată de alte obiecte, se introduce componenta de fundal (ambient).

Pentru a finaliza traseul, se introduce o limitare a numărului de iterații (adâncimea recursiunii).

Concluzii cu privire la metoda back trace

Avantaje:

Universalitatea metodei, aplicabilitatea sa pentru sinteza imaginilor unor scheme spațiale destul de complexe. Întruchipează multe legi ale opticii geometrice. Sunt doar o varietate de proiecții.

Chiar și versiunile trunchiate ale acestei metode permit obținerea de imagini destul de realiste. De exemplu, dacă ne limităm doar la raze primare (din punctul de proiecție), atunci acest lucru duce la eliminarea punctelor invizibile. Trasarea deja una sau două raze secundare oferă umbre, transparență speculară.

Toate transformările de coordonate sunt liniare, deci este ușor să lucrați cu texturi.

Dezavantaje:

Probleme cu modelarea reflexiei difuze și refracției.

Pentru fiecare punct al imaginii trebuie efectuate multe operații de calcul. Urmărirea este unul dintre cei mai lenți algoritmi de sinteză a imaginilor.

2. PARTEA DE DESIGN

Algoritmi.

Trasarea razelor inverse.

Orez. 1 - Diagrama bloc a algoritmului recurent pentru trasarea razelor inverse

limbaj de programare ray tracing

În acest program, algoritmul de backtrace este implementat într-o manieră recurentă. Funcția de calculare a intensității razei primare se numește recursiv pentru a găsi intensitățile razelor reflectate și refractate.

Algoritm:

Pentru a calcula culoarea fiecărui pixel din framebuffer, se parcurg următorii pași:

Găsiți coordonatele unui pixel în sistemul de coordonate mondial.

Aflați coordonatele razei primare.

Pornirea funcției de calcul a intensității fasciculului primar.

Găsiți intersecțiile razei cu toate primitivele din scenă și selectați-o pe cea mai apropiată.

Dacă intersecția nu este găsită, atunci raza a intrat în spațiul liber.

Pentru a calcula culoarea, luăm intensitatea totală egală cu intensitatea fundalului. Treceți la pasul 12. Dacă se găsește o intersecție, mergeți la pasul 6.

Calculăm intensitatea culorii „locală” a obiectului căruia îi aparține punctul de intersecție. Prin intensitate „locală” se înțelege intensitatea ținând cont de intensitatea luminii reflectate difuz și de intensitatea strălucirii.

Dacă materialul reflectă lumina doar difuz, atunci considerăm că intensitățile luminii reflectate și refractate sunt zero. Treceți la pasul 12. În caz contrar, mergeți la pasul 8.

Dacă se atinge adâncimea maximă de recursivitate, atunci se consideră că intensitățile luminii reflectate și refractate sunt zero. Treceți la pasul 12. În caz contrar, mergeți la pasul 9.

Calculați vectorul fasciculului reflectat. Executarea unei recursiuni pentru a găsi intensitatea fasciculului reflectat.

Calculați vectorul raze refractate. Executarea unei recursiuni pentru a găsi intensitatea fasciculului refractat.

Calculul intensității totale a culorii. Intensitatea totală include intensitatea luminii împrăștiate, intensitatea locală și intensitățile razelor reflectate și refractate.

Reveniți la punctul de apel al funcției de calcul al intensității razelor.

Dacă raza primară a fost calculată, atunci un pixel cu culoarea calculată este plasat în tamponul de cadru. Să trecem la calculul următorului pixel al bufferului de cadru Dacă a fost calculat fasciculul reflectat (refractat), atunci intensitatea calculată va fi luată ca intensitate a fasciculului reflectat (refractat) la pasul de recursivitate precedent.

Construirea de umbre.

Umbre solide.

Pentru a construi umbre solide în algoritmul de trasare, în etapa de calcul a intensității culorii „locale” în punctul obiectului, se verifică „vizibilitatea” fiecărei surse de lumină din acest punct.

Principiul algoritmului.

O rază îndreptată către sursa de lumină este construită din punctul testat.

Se caută intersecțiile acestei raze cu primitivele scenei între punctul verificat și sursă.

Dacă se găsește cel puțin o intersecție, atunci punctul care este verificat este în umbră. La calcularea culorii acesteia, nu se ia în considerare sursa pentru care a fost efectuată verificarea.

sursă verificabilă.

Această metodă de găsire a umbrelor dă un rezultat acceptabil atâta timp cât nu există obiecte transparente în scenă. Cu toate acestea, umbra neagră solidă a sticlei nu pare realistă. Sticla transmite parțial lumina, astfel încât intensitatea sursei ascunse trebuie luată în considerare la calcularea intensității luminii în punctul obiectului, dar aceasta trebuie atenuată atunci când lumina trece prin sticlă.

Fundalul matematic și fizic al algoritmului de urmărire a razelor din spate.

Iluminat.

Intensitatea luminii este suma intensității luminii de fundal a scenei, intensitatea luminii reflectate difuz a surselor, intensitatea strălucirii de la surse, caracteristicile de iluminare („locale”), intensitatea luminii speculare. fascicul reflectat și intensitatea fasciculului refractat, dacă există.

Intensitatea luminii de fundal (IA) este dată de o constantă.

Intensitatea luminii reflectate difuz (ID) este calculată în conformitate cu „legea cosinusului” clasică.

ID = IL cos α,(2.2.1.6)

unde IL este intensitatea sursei de lumină, α este unghiul dintre normala la suprafață și direcția către sursă.

În cazul iluminării scenei cu mai multe surse, se calculează Id pentru fiecare dintre ele și apoi se însumează.

IDi =Σ ILi cos αi.(2.2.1.7)

Intensitatea flarei de la sursă (IS) este calculată conform modelului Phong.

IS = IL cosp β,(2.2.1.8)

unde IL este intensitatea sursei de lumină (0<=IL<=1), β - угол между отраженным лучом от источника света и направлением на точку, в которой расположена камера (центр проекции), p - некоторая степень от 1 до 200 -влияет на размытость блика. При

La valori scăzute ale lui p, evidențierea este mai neclară.

Ca și în cazul calculului ID, în cazul iluminării scenei de mai multe surse, IS se calculează separat pentru fiecare sursă, iar apoi se însumează rezultatele.

ISi =Σ ILi cosp β i.(2.2.1.9)

Intensitățile luminii reflectate specular (IR) și refractate (IT) sunt calculate pentru razele reflectate și refractate la următoarea etapă a recursiei. Dacă este atinsă limita de adâncime a recursiei, atunci aceste intensități sunt considerate zero. Din intensitatea IR se ia r procent, iar din IT - t = 1 - r (vezi secțiunea anterioară).

În plus, se introduc următorii coeficienți: KD - coeficient de reflexie difuză a suprafeței, KS - coeficient de strălucire.- acest coeficient este o caracteristică a rugozității suprafeței reflectorizante. Cu cât este mai mare rugozitatea suprafeței, cu atât mai puțină lumină este reflectată de ea în mod specular și cu atât o transmite mai puțină lumină și, în consecință, cu atât mai multă lumină reflectă difuz.<= KD <= 1.

La KD = 0 - toată lumina care cade pe suprafață este reflectată și refractă. KD = 1 - toată lumina este reflectată difuz. Intensitatea luminii reflectate difuz și intensitatea luminii de fundal sunt multiplicate cu acest factor. Intensitățile luminii reflectate specular și refractate sunt înmulțite cu (1 - KD) Acest coeficient este responsabil pentru luminozitatea strălucirii de la sursă. 0<=KS<=1.

La KS = 0 - luminozitatea nu este vizibilă, la KS = 1 - luminozitatea luminii este maximă.

Astfel, formula finală pentru calcularea intensității unui obiect la un moment dat va arăta astfel:

I = IAKD + ​​​​Σ(ILiKDcos αi + ILiKScosp β i) + (1 - KD)(IRr + IT(1 - r)).(2.2.1.10)

Trebuie remarcat faptul că intensitatea finală nu trebuie să fie mai mare de unu. Dacă se întâmplă acest lucru, atunci acest punct al imaginii va fi supraexpus. Intensitatea acestuia trebuie resetata cu unu.

Pentru a obține o imagine color, este necesar să efectuați calcule separat pentru componentele luminii roșii, verzi și albastre. Culoarea unui pixel de imagine va fi calculată prin înmulțirea fiecărei componente de intensitate cu un număr care determină numărul maxim de gradații de intensitate a imaginii. Pentru o imagine pe 32 de biți, este egal cu 255 pentru fiecare dintre culori (R, G, B).

255*IR,= 255*IG,= 255*IB.

Aici IR (a nu se confunda cu intensitatea luminii reflectate specular), IG, IB sunt intensitățile celor trei componente luminoase într-un punct, obținute prin formula de mai sus.

Coeficienții KD, KS, p sunt caracteristicile individuale ale obiectului, reflectând proprietățile acestuia. În plus, mai există un coeficient - indicele absolut de refracție n. n = c / v, unde c este viteza luminii în vid, v este viteza luminii în mediu (în interiorul obiectului). Pentru corpurile absolut opace, acest coeficient este egal cu ∞ (deoarece viteza luminii în interiorul corpului este zero). În program, pentru a specifica un corp absolut opac, trebuie să setați acest coeficient >> 1 (aproximativ 10.000). În acest caz, proporția luminii reflectate specular r va tinde spre unitate și, respectiv, refractă la zero.

Calculul normalelor.

În algoritmul de urmărire, sunt necesare normale la obiecte pentru a calcula razele reflectate și refractate, precum și pentru a determina iluminarea conform modelului Phong.

În acest program, există trei tipuri de primitive din care este construită scena. Acestea sunt un poligon (triunghi), un elipsoid și un paraboloid. Ultimele două sunt introduse pentru o imitație mai realistă a unui pahar (ar putea fi construit și din poligoane, dar modelul s-ar fi dovedit a fi mai dur).

Calculul normalei la un poligon (triunghi).

Calculul normalei la un triunghi se reduce la operația de multiplicare vectorială. Fie triunghiul ABC dat de coordonatele celor trei vârfuri ale sale:

XA, YA, ZA, XB, YB, ZB, XC, YC, ZC.

Să calculăm coordonatele a doi vectori, de exemplu AB și AC:

XB - XA,= XB - XA,

ZAB = XB - XA,(2.2.2.1)= XC - XA,= XC - XA,= XC - XA.

Coordonatele vectoriale normale vor fi calculate folosind formulele:

YABZAC - YACZAB,= XABZAC - XACZAB,(2.2.2.2)= XABYAC - XACYAB.

Nu este nevoie să calculați coordonatele vectorului normal la triunghi de fiecare dată în corpul urmei, deoarece normalele sunt aceleași în orice punct al triunghiului. Este suficient să le numărați o dată în partea de inițializare a programului și să le salvați. Când rotiți un triunghi, trebuie să rotiți și normalul acestuia.

Calculul normalului la suprafața de ordinul doi.

Suprafața de ordinul doi este dată în cazul general de o ecuație de forma:

Q(x,y,z) = a1x2 + a2y2 + a3z2 + b1yz + b2xz + b3xy + c1x +c2y +c3z + d =0.

Dar vom folosi o formă diferită de notație. Deci ecuația elipsoidală va arăta astfel:

(x-x0)2/A2 + (y-y0)2/B2 + (z-z0)2 /C2 = 1,(2.2.2.3)

unde x0, y0, z0 sunt coordonatele centrului elipsoidului, A, B, C sunt lungimile semiaxelor elipsoidului.

Ecuația paraboloidului:

(x-x0)2/A2 + (y-y0)2/B2 - (z-z0)2 /C2 = 1,(2.2.2.4)

unde x0, y0, z0 sunt coordonatele centrului paraboloidului, A, B, C sunt lungimile semiaxelor paraboloidului. Axa paraboloidului este situată de-a lungul axei Oz a sistemului de coordonate mondial. Pentru a calcula coordonatele vectorului normal, este necesar să se calculeze derivatele parțiale în raport cu x, y, z.

Coordonatele vectoriale normale elipsoide:

Yn \u003d 2 (y-y0) / B2, \u003d 2 (z-z0) / C2.

Direcția unui vector nu se va schimba dacă toate coordonatele sale sunt împărțite la 2:

Xn = (x-x0)/A2,= (y-y0)/B2,(2.2.2.5)

Zn \u003d (z-z0) / C2.

Coordonatele vectorului normal al unui paraboloid sunt calculate în mod similar:

Xn = (x-x0)/A2,= (y-y0)/B2,(2.2.2.6)

Zn \u003d - (z-z0) / C2.

Normala pentru suprafața de ordinul doi va trebui calculată direct în corpul urmei, deoarece normalele sunt diferite în diferite puncte ale figurii.

Calculul fasciculului reflectat.

Fie dat vectorul razei incidente S și cunoscut vectorul normal N. Este necesar să se găsească vectorul razei reflectate R.

Luați în considerare vectorii unitari R1, S1 și N1. Deoarece vectorii normalei, raza incidentă și raza reflectată sunt în același plan, putem scrie R1 + S1 = N`, unde N` este vectorul corespunzător diagonalei rombului și care coincide în direcția normală. . Lungimea vectorului N` este egală cu 2cosθ. Deoarece vectorul N` coincide în direcția cu N1, atunci

N` = N`2cosθ.

De aici găsim vectorul unitar al fasciculului reflectat:

R1 = N1 2cosθ - S1 = N/|N| 2cosθ - S/|S|.

Să găsim cosθ. Acest lucru se poate face folosind produsul scalar al vectorilor N și S:


Presupunând că vectorul necesar al fasciculului reflectat va avea aceeași lungime ca și vectorul fasciculului incident, adică R = |S| R1, obținem

N 2NS/|N|2 - S.

Această soluție este sub formă vectorială. Să scriem coordonatele vectorului:

2xN(xNxS+yNyS+zNzS)/(xN2+yN2+zN2) - xS,= 2yN(xNxS+yNyS+zNzS)/(xN2+yN2+zN2) - yS,(2.2.3.1)= 2zN(xNxS+yS) +zNzS)/(xN2+yN2+zN2) - zS.

Calculul fasciculului refractat.

Să fie dați doi vectori unitari: S1 este vectorul fasciculului incident și N1 este vectorul normalei la interfața dintre două medii. Trebuie cunoscuți doi indici de refracție pentru aceste medii - n1 și n2 (sau raportul lor).

Este necesar să se găsească vectorul unitar al razei refractate T1. Pentru rezolvare, executam cateva constructii geometrice.

Vectorul dorit T1 este egal cu suma a doi vectori:

Să găsim mai întâi vectorul NT. Este opusă în direcție vectorului normal, iar lungimea sa este egală cu |T1| cos α2 = cos α2 (deoarece T1 este unitate). Astfel, NT = -N1 cos α2. Este necesar să se determine cos α2. Să scriem legea refracției n1 sin α1 = n2 sin α2 sub forma:

sinα2 = n sinα1,

unde n = n1 / n2.

Să folosim identitatea cos2α + sin2α = 1. Atunci

cosα2 = √ 1 - sin2α2 = √ 1 - n2 sin2α1

cosα2 = √ (1 + n2 (cos2α1 - 1)

Valoarea lui cos α1 poate fi exprimată în termenii produsului scalar al vectorilor unitari S1 și N1, adică cos α1 = S1N1. Apoi putem scrie următoarea expresie pentru vectorul NT:

N1√1+n2((S1N1)2 - 1).

Rămâne de găsit o expresie pentru vectorul B. Acesta este situat pe aceeași linie cu vectorul A și A = S1 - NS. Considerând că NS este egal cu N1 cos α1, atunci A = S1 - N1 cos α1. Deoarece cos α1 = S1N1, atunci A = S1 - N1 (S1N1).

Deoarece lungimea vectorului A este egală cu sin α1, iar lungimea vectorului B este egală cu sin α2, atunci

|B|/|A| = sinα2/ sinα1 = n2/n1 = n,

de unde |B| = n |A|. Ținând cont de poziția relativă a vectorilor A și B, obținem

NA = n(N1(S1N1) - S1).

Acum putem scrie expresia dorită pentru vectorul unitar al razei de refracție T1:

T1 = nN1 (S1N1) - nS1 - N1√1 + n2 ((S1N1)2 - 1).(2.2.4.1)

Calculul punctului de intersecție cu primitivele.

În algoritmul de urmărire, pentru a construi o imagine, este necesar să se calculeze punctele de intersecție ale razelor cu primitivele scenei. Fasciculul este dat de o ecuație parametrică a unei linii drepte. Orice punct al fasciculului satisface ecuația

R = A + Vt,(2.2.5.1)

unde R este vectorul rază al unui punct arbitrar aparținând razei, A este vectorul rază al punctului inițial al razei, V este vectorul direcției razei, t este un parametru.

Dacă vectorul de direcție V este normalizat, atunci parametrul t va fi numeric egal cu distanța de la punctul de pornire al fasciculului A la punctul R.

Puteți scrie această ecuație sub formă de coordonate:

x = x1 + at,= y1 + bt,(2.2.5.2)= z1 + ct.

Aici x1, y1, z1 sunt coordonatele punctului inițial al fasciculului în sistemul de coordonate cartezian dreptunghiular, a,b,c sunt coordonatele vectorului de direcție al fasciculului.

Calculul punctului de intersecție al unei raze cu o suprafață de ordinul doi.

Pentru a găsi punctul de intersecție al unei raze dat de ecuațiile (2) cu o suprafață de ordinul doi dată de ecuațiile (2.2.2.3) sau (2.2.2.4):

(x-x0)2/A2 + (y-y0)2/B2 + (z-z0)2 /C2 = 1 (elipsoid)

(x-x0)2/A2 + (y-y0)2/B2 - (z-z0)2 /C2 = 1 (paraboloid),

în loc de x, y și z, ecuațiile de raze corespunzătoare trebuie înlocuite în ecuația de suprafață de ordinul doi. Ca urmare, după deschiderea tuturor parantezelor și aducerea unora similare, obținem o ecuație pătratică în raport cu parametrul t. Dacă discriminantul ecuației pătratice este mai mic decât zero, atunci raza și suprafața de ordinul doi nu au puncte de intersecție comune. În caz contrar, se vor putea calcula două valori ale parametrului t. Discriminantul poate fi egal cu zero - acesta corespunde cazului limită al unei raze care atinge suprafața și vom obține două valori coincidente ale parametrului t.

Pentru a găsi coordonatele punctelor de intersecție ale razei și ale suprafeței, este suficient să înlocuiți valorile găsite ale parametrului t în ecuațiile razelor (2).

În program, când sunt găsite două intersecții, cea mai apropiată este selectată pentru vizualizare. Cea mai apropiată intersecție se determină prin compararea parametrilor găsiți t. Mai aproape de punctul de observare este intersecția, care corespunde parametrului mai mic t. Trebuie remarcat aici că, ca urmare a rezolvării ecuației pătratice, una sau ambele valori ale parametrului t se pot dovedi negative. Aceasta înseamnă că punctul de intersecție se află „în spate” în raport cu punctul de origine al fasciculului, pe jumătatea dreptei, care este „de partea noastră” în raport cu planul imaginii. Astfel de puncte sunt eliminate atunci când se caută o intersecție.

În plus, în programul pentru fiecare figură sunt introduse planurile de tăiere superior și inferior. Este afișată doar partea figurii care se află între ele.

Pentru a face acest lucru, după găsirea punctului de intersecție, se analizează coordonatele z ale acestuia.

Calculul punctului de intersecție al unei raze cu un poligon (triunghi).

Pentru a calcula punctul de intersecție al razei dat de ecuațiile (2), trebuie mai întâi să determinați punctul de intersecție al acestei raze cu planul care conține acest triunghi.

Ecuația plană arată astfel:

Q(x, y, z) = Ax + By + Cz + D = 0.(2.2.5.3)

Aici coeficienții A, B, C coincid cu coordonatele normalei la acest plan. Coordonatele normalei planului coincid cu coordonatele normalei triunghiului, pe care le-am calculat în stadiul de încărcare a scenei.

Pentru a găsi termenul liber D, este necesar să înlocuiți coordonatele oricărui punct al triunghiului, de exemplu, unul dintre vârfuri.

Ax-By-Cz.(2.2.5.4)

Valoarea D nu se va modifica în timpul execuției programului, așa că este indicat să o calculați când scena este inițializată și să o stocați, ca și coordonatele normale. Este necesar să-l recalculăm numai atunci când poziția triunghiului se schimbă.

Acum, pentru a găsi punctul de intersecție, înlocuim ecuațiile razelor (2) în

ecuația plană.

(x1 + at) + B (y1 + bt) + C (z1 + ct) + D = 0

Unde ajungem

= - (Ax1 + By1 + Cz1 + D) / (Aa + Bb + Cc)(2.2.5.5)

Dacă numitorul acestei fracții este zero, atunci raza este paralelă cu planul în care se află triunghiul. Nu există nici un punct de intersecție.

Pentru a găsi coordonatele punctului de intersecție, este necesar să înlocuiți valoarea găsită a parametrului t în ecuațiile razelor (2). Să numim punctul de intersecție D. Vom obține coordonatele xD, yD, zD.

Acum trebuie să determinăm dacă punctul D se află în interiorul triunghiului. Aflați coordonatele vectorilor AB, BC, CA (A, B, C sunt vârfurile triunghiului) și coordonatele vectorilor AD, BD, CD. Apoi găsim trei produse încrucișate:

nA = AB x AD,= BC x BD,(2.2.5.6)= CA x CD.

Acești vectori vor fi coliniari. Dacă toți cei trei vectori sunt codirecționali, atunci punctul D se află în interiorul triunghiului. Co-direcția este determinată de egalitatea semnelor coordonatelor corespunzătoare tuturor celor trei vectori.

Operația de verificare dacă punctul D aparține triunghiului ABC poate fi accelerată. Dacă proiectăm ortogonal triunghiul ABC și punctul D pe unul dintre planurile xOy, yOz sau xOz, atunci proiecția punctului în proiecția triunghiului va însemna că punctul însuși cade în triunghi (desigur, dacă este deja cunoscut că punctul D se află în planul care conţine triunghiul ABC ). În același timp, numărul de operațiuni este redus semnificativ. Deci, pentru a găsi coordonatele tuturor vectorilor, trebuie să căutați două coordonate pentru fiecare vector, iar atunci când căutați produse vectoriale, trebuie să căutați doar o coordonată (restul sunt egale cu zero).

Pentru a verifica co-direcția vectorilor obținuți la calcularea produsului încrucișat, trebuie să verificați semnele acestei coordonate unice pentru toți cei trei vectori. Dacă toate semnele sunt mai mari decât zero sau mai mici decât zero, atunci vectorii sunt codirecționali. Egalitatea la zero a unuia dintre produsele vectoriale corespunde cazului în care punctul D cade pe o dreaptă care conține una dintre laturile triunghiului.

În plus, un test dimensional simplu poate fi efectuat înainte de calcularea vectorilor și a produselor încrucișate. Dacă proiecția punctului D se află la dreapta, la stânga, deasupra sau sub fiecare dintre proiecțiile vârfurilor triunghiului, atunci nu se poate afla în interior.

Rămâne de adăugat că pentru proiecție este mai bine să alegeți unul dintre planuri, aria de proiecție a triunghiului pe care este mai mare. În această condiție, cazul proiecției unui triunghi într-un segment este exclus (cu condiția ca triunghiul testat să nu fie degenerat într-un segment). În plus, pe măsură ce aria de proiecție crește, probabilitatea de eroare scade. Pentru a determina un astfel de plan de proiecție, este suficient să verificați cele trei coordonate ale normalei triunghiului. Dacă coordonata z a normalei este mai mare (în valoare absolută) x și y, atunci este necesar să se proiecteze pe planul xOy. Dacă y este mai mare decât x și z, atunci proiectăm pe xOz. În cazul rămas - pe yOz.

Descrierea tipurilor de date. Structura programului.

Descrierea modulelor programului

Lista modulelor: .h-descrierea structurii TTex.h-descrierea structurilor TPlaneTex și TEllipsoidTex.h-descrierea structurilor TPoint2d și TPoint3d.h-descrierea structurii TRGBColor.h-descrierea clasei TLamp .h-descrierea clasei TCam.h-descrierea clasei TPrimitive.descrierea clasei h TFrstSurface.h-descrierea clasei TScndSurface.h-descrierea clasei TTriangle.h-descrierea clasei TEllipsoid.h-clasa descrierea TCylinder.h-clasa descriere Descrierea clasei THyperboloidVert.h Descrierea clasei THyperboloidHor.h Descrierea clasei TScene.h- TTracer

Implementarea modulelor, interfata programului:

Opțiuni.h-modulul formularului „Opțiuni”.

Modulul ExtraCamOptions.h din formularul „Proprietăți camere”.

MainUnit.h - modulul formei principale a programului

O scurtă descriere a structurilor și claselor programului: TPoint3d - o structură care descrie un punct în sistemul de coordonate mondial, TPoint2d - o structură care descrie un punct pe un plan (într-o textură) cu coordonate întregi, TRGBColor - o structură care descrie o culoare în trei componente (RGB), TTex - o structură , care descrie textura - conține adresa matricei de pixeli și dimensiunile acesteia, TPlaneTex - o structură care descrie legarea texturii de plan.

Conține trei puncte la care este atașată textura: TLamp ​​​​- o clasă care descrie sursa de lumină.

Conține un obiect de coordonare TPoint3d cu coordonatele sursei și trei variabile float (Ir, Ig, Ib) pentru stocarea intensității celor trei componente de lumină. TCam este o clasă care descrie o cameră.

Conține două unghiuri (a, b) care indică direcția de vedere a camerei, punctul către care este îndreptată camera (vedereP) și distanța de la cameră până la acel punct (r). TPrimitive este o clasă primitivă abstractă. Suprafețele de ordinul întâi și al doilea sunt moștenite de la acesta. TFrstSurface este o clasă abstractă a suprafeței de ordinul întâi. Clasa triunghi este moștenită de la aceasta. TScndSurface este o clasă abstractă de suprafață de ordinul doi. Din el se moștenesc clasele elipsoid și paraboloid.TTriunghi - clasa triunghi. Conține trei vârfuri ale unui triunghi și normala acestuia. TCylinder - clasa unui cilindru. THyperboloidVert - clasa unui hiperboloid cu o singură foaie situată de-a lungul axei oZ.THyperboloidHor - clasa unui hiperboloid cu o singură foaie situată de-a lungul axei oX.TElipsoid - clasă a unui elipsoid.TScenă - clasa unei scene. Conține informații despre toate primitivele, sursele și despre cameră. TTracer este clasa responsabilă pentru redarea imaginii. Conține un buffer (buffer) cu un aspect de 400x400 pixeli, în care se formează imaginea scenei. Înainte de generare, este necesar să apelați funcția, trecându-i ca parametru un pointer către scena care urmează să fie generată. Pentru a genera, apelați funcția de randare.

Toate clasele - descendenții lui TPrimitive oferă următoarele funcții: getT(TPoint3d p0, TPoint3d viewDir) - returnează distanța de la punctul de origine (p0) al razei viewDir până la cel mai apropiat punct de intersecție cu primitiva.

void getTArr(float* arr, int& n, TPoint3d p0, TPoint3d viewDir) - umple matricea arr cu distanțele de la punctul de început (p0) al razei viewDir până la cel mai apropiat punct de intersecție cu primitiva.

void getNormal(TPoint3d& n, const TPoint3d& p) - returnează coordonatele vectorului normal la primitivă în punctul p.

void getColor(TRGBColor& c, const TPoint3d& p) - returnează culoarea punctului primitiv p (inclusiv textura).

3. PARTEA TEHNOLOGICĂ

Alegerea limbajului de programare.

La dezvoltarea programului, limbajul de programare de nivel înalt C++ a fost folosit ca parte a mediului de programare vizuală CodeGear RAD Studio pentru Windows.

Acest limbaj a fost ales datorită faptului că oferă cele mai convenabile mijloace de lucru cu RAM, vă permite să implementați algoritmi mai eficient decât alte limbaje de nivel înalt. Programele scrise în C++ rulează mai repede și ocupă mai puțin spațiu pe disc.

În plus, mediul de programare vizuală CodeGear RAD Studio pentru Windows

oferă un număr mare de componente vizuale standard pentru crearea unei interfețe și un număr de biblioteci cu diverse funcții utile utilizate în mod obișnuit. De asemenea, autorul lucrării are cea mai mare experiență de programare în mediul de programare vizual specificat.

Formular de opțiuni. Fila Iluminare.

Această filă conține instrumente pentru configurarea luminii scenei.

Coordonatele sursei - coordonatele din sistemul de coordonate mondial al sursei de lumină selectate în lista derulantă.

Intensitatea sursei - valorile celor trei componente ale intensității sursei de lumină selectate în lista derulantă.

Intensitatea fundalului - valorile celor trei componente ale intensității fundalului.

Butonul „+” (lângă lista derulantă) - adăugarea unei noi surse de lumină.

Butonul „-” (lângă lista derulantă) - șterge sursa de lumină selectată în lista derulantă.

Formular de opțiuni. fila Cameră.

Această filă conține instrumente pentru setarea opțiunilor camerei.

Previzualizare - aici puteți vedea o vizualizare aproximativă a imaginii înainte ca aceasta să fie generată.

Navigare - setări de poziție a camerei.

Avansat - când faceți clic pe acest buton, apare un formular

Proprietățile camerei cu opțiuni avansate ale camerei.

Formul proprietăților camerei.

Raza - distanța de la cameră până la punctul către care este îndreptată.

Pas de modificare a razei - creșterea razei camerei prin apăsarea butonului „-” o dată pe fila „Cameră” din formularul „Opțiuni” (sau micșorându-l apăsând o dată butonul „+”).

Formular de opțiuni. fila materiale.

Acest meniu afișează parametrii materialului mesei pe care stă scena.

Culoare - culoarea materialului de masă.

Coef. reflexie difuză - coeficientul Kd al materialului de masă (vezi secțiunea 2.2.1).

Textura - dacă caseta de selectare este bifată, atunci textura va fi afișată pe tabel

Selectați textură - selectați un fișier imagine (*.bmp) care va fi folosit ca textură a tabelului.

Avansat - când faceți clic pe acest buton, va apărea formularul Proprietăți tabel cu parametri suplimentari ai materialului tabelului.

Formularul proprietăților tabelului.

Coeficientul de strălucire este coeficientul KS al materialului de masă (vezi secțiunea 2.2.1).

Glare estompare este un exponent p al materialului de masă.

Textura se repetă - de câte ori se va repeta textura tabelului de-a lungul axelor OX și OY.

Formular de opțiuni. fila Sistem.

În această filă, puteți configura algoritmii implementați în program.

Adâncimea recursiunii - acest parametru setează adâncimea recursiunii în algoritmul de urmărire. Valorile mai mari ale acestui parametru îmbunătățesc calitatea imaginii generate.

ATENŢIE!

Adâncimea recursiunii are un efect PUTERN asupra vitezei de generare a imaginii. Nu este recomandat să setați acest parametru la mai mult de 10.

Anitialiasing - activarea algoritmului de netezire a imaginii.

Tipul de umbră - selectarea algoritmului de construcție a umbrei.

4. PARTEA DE CERCETARE

Studiile au fost efectuate pe un computer cu următoarea configurație:

CPU - Intel Core 2 Duo T5850- 2048Mb DDR2 - Nvidia GForce 9300M 256Mb- Windows 7

4.1 Dependența timpului de generare de adâncimea recursiunii

În acest test, a fost investigată dependența timpului de generare a imaginii de adâncimea recursiei. Studiile au fost efectuate pentru o scenă iluminată de o singură sursă de lumină - timpul de generare fără umbră în secunde - timpul de generare cu umbră solidă în secunde - adâncimea recursiei.


4.2 Dependența timpului de generare de numărul de surse


4.3 Analiza rezultatelor cercetării

Din primul studiu se poate observa că timpul de generare crește puternic odată cu numărul de niveluri de recursivitate. Acest lucru este în acord cu teoria, deoarece numărul de raze crește odată cu adâncimea recursiunii.

Trebuie remarcat faptul că pentru scenele cu un număr mic de poligoane, nu este nevoie să setați valori mari pentru adâncimea maximă a recursiunii, deoarece diferența de calitate a imaginii generate va fi nesemnificativă.

Al doilea studiu arată că dependența timpului de generare de numărul de surse de lumină este liniară. Din valorile obținute, puteți calcula timpul necesar pentru calcularea unei surse. Pe aparatul pe care s-a efectuat cercetarea, cu o adâncime de recursivitate de 5, acest timp este de aproximativ 0,5 secunde.

CONCLUZIE

În acest program au fost demonstrate rezultatele algoritmului de generare a imaginilor realiste - reverse ray tracing -.

Această implementare demonstrează capacitatea algoritmului de a construi imagini aproape fotorealiste. Urmărirea este unul dintre cei mai avansați algoritmi pentru generarea de imagini realiste. Calitatea imaginii rezultate este incomparabil mai bună decât calitatea imaginii obținute folosind algoritmi precum Z-buffer. Cu toate acestea, cerințele pentru puterea de calcul necesară pentru a genera un cadru de imagine sunt mult mai mari decât în ​​același Z-buffer. Până în prezent, în timp real, algoritmul de urmărire a razelor inverse este folosit doar în scopuri de cercetare pe computere super-puternice care sunt inaccesibile unui simplu utilizator. Desigur, există pasionați care creează jocuri 3D și alte aplicații de grafică în timp real bazate pe algoritmul de urmărire a razelor inverse, dar de regulă au un FPS extrem de scăzut, sau toate obiectele din scenă se bazează pe o sferă - cel mai simplu pentru a urmări suprafața razelor. Dar pentru ca acest algoritm să devină profitabil în proiecte de masă, cum ar fi jocurile 3D, este necesară o descoperire semnificativă în domeniul hardware-ului computerelor desktop.

Chiar și pe exemplul jocurilor pe calculator, se poate urmări cu ușurință redundanța algoritmului de urmărire a razelor inverse. La urma urmei, jucătorul, fiind pasionat de joc, este puțin probabil să admire redarea corectă din punct de vedere geometric a umbrelor și reflexiilor obiectelor de joc. În acest sens, desenul aproximativ cu ajutorul poligoanelor câștigă astăzi semnificativ, deoarece nu necesită un computer puternic, iar rezultatele sunt apropiate de realitate.

De asemenea, se consideră că algoritmul de urmărire a razelor este ideal pentru imagini cu obiecte artificiale cu forme geometrice simple, precum mașini, avioane, clădiri etc. Generarea de obiecte precum o față umană, păr de animal sau o zonă de pădure este extrem de dificilă. sarcină pentru algoritm, care crește cerințe atât de considerabile pentru hardware-ul computerului.

Cu toate acestea, chiar și astăzi puteți vedea cercetări privind implementarea algoritmului de urmărire a razelor inverse în timp real. De regulă, în astfel de proiecte, o mașină este folosită ca scenă. Dar fotorealismul absolut al imaginii a fost deja atins și, în plus, este nevoie de foarte puțin timp pentru a genera un singur cadru. Desigur, aceste proiecte sunt implementate pe computere super-puternice, dar ziua nu este departe în care astfel de aplicații 3D vor deveni disponibile pentru utilizatorul obișnuit.

BIBLIOGRAFIE

1. Rogers D. Fundamente algoritmice ale graficii computerizate: Per. din engleză - M.: Mir, 1989. - 512 p.

Porev VN Grafică pe computer. - Sankt Petersburg: BHV-Petersburg, 2002. - 432 p.

Nikulin E.A. Geometrie computerului și algoritmi de grafică pe computer. Sankt Petersburg: BHV-Petersburg, 2003. - 560 p.

Angel E. Grafică interactivă pe computer. - „Williams”, 2001. - 592 p.: ill. - Paral. Tit. Din engleza.

Avdeeva S.M., Kurov A.V. Algoritmi pentru grafica pe computer 3D: manual. - M.: Editura MSTU im. N.E. Bauman, 1996. - 60 p.