Sledovanie lúčov v reálnom čase. DirectX Raytracing: sledovanie lúčov v reálnom čase

Nie je to tak dávno, čo 4A Games, tvorca úžasne realistických hier Metro, zverejnil video využívajúce technológiu Nvidia RTX, pričom ako príklad použil METRO: EXODUS. Táto grafická inovácia je veľkým a sebavedomým krokom vpred v oblasti sledovania lúčov. Ale čo to všetko znamená?

Za rúškom tajomstva

Začnime od úplného začiatku. Po prvé, ray tracing je jedným zo základných typov vizualizácie, ktorý sa používa vo filmoch a rôznych typoch dizajnu: od priemyslu po architektúru. To znamená, že to, čo vidíte na webových stránkach ako fotografie zariadení, je presne 3D render.

Podstata technológie spočíva v tom, že počítač modeluje fyzikálne správanie svetla výpočtom trajektórie podmienene jednotlivých fotónov svetla, to znamená, že ak lúč dopadá na objekt, potom sa v ňom buď láme, alebo sa od neho odrazí pri jednom. uhol alebo iný. Výsledkom je určitá stopa tohto lúča svetla, preto názov „ray tracing“.

Tento počítačom vytvorený obrázok od Enrica Cericu pomocou OctaneRender ukazuje lúče, tiene a odrazy na zložitom povrchu podlahy.

Jediným problémom je, že je potrebných veľa lúčov a pre každý z nich je potrebné opakovane počítať každú zrážku lúča s prekážkami. V skutočnosti ide o jednoduchý matematický problém. Najprv musíte vypočítať, kde lúč zasiahne existujúci objekt, to znamená vypočítať kolíziu, potom na základe špecifikovaných vlastností musíte vykonať ďalšie matematické transformácie.


Zjednodušená schéma sledovania lúčov

Napríklad existuje matný povrch s určitou danou podmienenou drsnosťou, ale nie absolútne drsný, a lúč sa od neho odchyľuje s určitou pravdepodobnosťou v určitom uhle odlišnom od uhla dopadu. Malo by sa vziať do úvahy, že ak má objekt vlastnosť nekonečne hladkého, potom sa uhol dopadu rovná uhlu odrazu. Ak vlastnosti povrchu hovoria o zákalu, potom sa to matematicky realizuje odchýlkou ​​uhla odrazu od uhla dopadu.

V živote je to pravda, povrch nie je takmer vždy úplne hladký. Preto, keď svetlo zasiahne jeden alebo druhý bod, odráža sa vzhľadom na povrch, ktorý môže byť nejakým spôsobom otočený vzhľadom na rovinu, ktorá sa nám zdá rovnomerná, a susedný lúč sa odráža úplne iným smerom. Je teda celkom jasné, že nemá zmysel robiť modely objektov príliš polygonálne, takže nepravidelnosti sú dané vlastnosťami povrchu. Výsledok je podobný skutočnému rozptylu svetla z matných povrchov.

Teraz v hrách používajú predmet, ktorý vyzerá, akoby bol natretý niečím ako polevou. Každý nepochybne videl v hrách zvláštne steny a podlahy, ktoré vyzerajú ako namazané nejakým slizom. No, nemusíte to robiť s ray tracingom - povrchy môžu rozptyľovať svetlo celkom prirodzene. Perfektne to ukazuje ukážka, je tam množstvo oblastí od najzrkadlenejších až po najmatnejšie.

Je obzvlášť zrejmé, že v matných oblastiach odraz silne závisí od blízkosti objektu k povrchu. To znamená, že čím ďalej je objekt od povrchu, tým viac je rozmazaný. To je dôležitá vlastnosť, ktorú si v živote ani nevšimneme, hoci existuje.

Najdôležitejšie sú však tiene. V žiadnej hre nie je nič horšie ako tiene.

Väčšinou ide len o projekcie predmetov, ktoré majú ostré, neprirodzené hrany. Existujú však lepšie, podľa herných štandardov, tiene. Ide o mäkké možnosti s prechodovou líniou, to znamená tieň a penumbru.


Na vytvorenie jemných tieňov alebo rozptýlených odrazov (ako napríklad tie, ktoré vidíte na brúsenom kove) sú potrebné pokročilejšie techniky sledovania lúčov.

Jediný problém je, že to tak v reálnom živote nefunguje. Ak zdroj svetla nie je bod a nie je nekonečne vzdialený, potom množstvo penumbry závisí od pomeru vzdialenosti zdroja svetla od objektu a vzdialenosti objektu od jeho tieňa. To znamená, že okraje penumbry na rôznych miestach môžu byť širšie alebo užšie, najmä pokiaľ ide o veľké zdroje svetla.

Napríklad svetlo z okna v zamračenom počasí poskytuje také jemné tiene, že ak umiestnite objekt oveľa menší dva metre od tohto okna, môžete vidieť jasný tieň a čiastočný tieň na jeho základni a tieň tam nemusí byť. všetko z hornej časti objektu a penumbra nebude mať jasné hranice. V hrách s tradičnou rasterizáciou k tomu nedochádza.

Trasovanie lúčov nie je zložité, no lúčov je veľa a, žiaľ, momentálne nie je možné robiť všetko v reálnom čase. Faktom je, že v živote sa lúče rozchádzajú v úplne odlišných smeroch. Ideálne by bolo, keby sa dopadajúci lúč rozdelil na nekonečný počet lúčov, ktorých celkový jas by závisel od vlastnosti odrážajúceho objektu a počiatočného jasu dopadajúceho lúča.

Aby ste znížili záťaž, môžete obmedziť počet lúčov, počet kolízií, no tieto obmedzenia vedú k tomu, že na obrázku získate mizivé kúsky tieňa a neprirodzene svetlé miesta zo zdrojov svetla. To znamená, že nedostatočné množstvo údajov vedie k výskytu šumu a celý problém spočíva v tom, že nie je možné vypočítať scénu raz a potom v nej zmeniť iba to, čo sa mení od snímky k snímke, pretože akýkoľvek pohybujúci sa objekt sa mení. všetky cesty všetkých lúčov. Z každého pohybu kamery a objektov je potrebné celú scénu „prestavať“ znova, preto filmy vytvárajú renderovacie farmy a početné servery, ktoré nepretržite, niekoľko mesiacov, renderujú grafiku. Ale, bohužiaľ, v reálnom čase v hrách to stále nie je možné.

Preto vyvstáva otázka, ako sa Nvidia a partneri dostali z tejto situácie: čo obetovali, aby dosiahli sledovanie v reálnom čase?

Dve polovice jedného celku

Ak budete pozorne sledovať, ako je obraz vykreslený po etapách, môžete vidieť, že niekde po piatej integrácii sa tiene a samotné svetlo už sotva citeľne menia. Ukazuje sa, kde, čo a ako bude vyzerať vo finálnej podobe. Na to je v zásade potrebný softvér v reálnom čase, aby ste mohli otočiť svetelné zdroje, pochopiť, kde bude nejaké oslnenie, a potom spustiť finálne vykresľovanie. Zostáva zistiť, ako sa dá zo zablateného obrazu pochopiť konečný rámec. V skutočnosti počítač najskôr vymodeluje pôvodný zašumený obraz, potom ho analyzuje a na základe získaných údajov nakreslí ďalší – konečný. Ako ukázala prax, tento prístup je jednoduchší z hľadiska nákladov na zdroje.

V skutočnosti je progresívnym skokom vo vývoji sledovania v reálnom čase vytvorenie algoritmov, ktoré nám umožňujú vyhodnotiť obraz zo zašuměného stavu a nakresliť ho do normálu. Toto je kľúčová inovácia. Všetko ostatné bolo predtým široko používané. Mnoho vykresľovacích modulov má vykresľovanie GPU a pluginy OpenGL podporované akoukoľvek grafickou kartou kompatibilnou s OpenGL.

Dnes sa tvrdí, že táto technika odšumovania funguje len na tendrových jadrách v budúcich kartách od Nvidie. V skutočnosti sa však táto technológia ukázala vo veľkých množstvách až teraz a objavila sa zrejme minulý rok, keďže v októbri Unity na jednom z podujatí ukázal práve túto technológiu na odstraňovanie šumu pri sledovaní v reálnom čase.

Trik je v tom, že nie všetky objekty sa podieľajú na sledovaní lúčov tak, ako by mali. V tejto súvislosti sa dotkneme témy globálneho osvetlenia – mechanizmu sledovania najnáročnejšieho na zdroje. V živote každý predmet, na ktorý dopadá svetlo, odráža časť tohto svetla. Ak napríklad nasmerujete zdroj svetla na zelenú stenu, potom sa všetko osvetlenie zmení na zelenú, pretože zelená stena dobre neabsorbuje svetlo.


Odraz svetelných lúčov od povrchu

V deme takýto efekt nebol. Namiesto odrazu svetla a zmeny svetelného vzoru rámu v závislosti od svetelného zdroja bol celý priestor vyplnený jasnými obrázkami, vďaka ktorým svetlo pôsobí dynamicky. V skutočnosti vývojári neaplikovali sledovanie lúčov na také detaily, ako je opar a plamene.

Faktom je, že lúče svetla sa musia vypočítať bez ohľadu na to, či dopadajú na predmety alebo nie. To znamená, že pridanie veľkého počtu svetiel je pomerne náročná úloha pre výpočty sledovania. Navyše v žiadnom techno deme nie sú žiadne objekty, ktoré napodobňujú priehľadné objekty.

Kedy uvidíme prínos?

Na základe vyššie popísaných kritérií (zakalenie obrazu a obkresľovanie nie všetkých objektov) môžeme povedať, že grafika v hrách ešte nemôže vyzerať tak detailne a realisticky ako vo filmoch.

Pokrok však určite existuje. Po prvé, odrazy sú teraz jednoduchšie, nie je potrebné vytvárať tieňové a svetelné mapy - to všetko je vyriešené trasovaním. Po druhé, objavilo sa aspoň nejaké zdanie rozptýlených odrazov. Po tretie, osvetlenie a tiene objektov sa výrazne zlepšili. Celkovo možno tvrdiť, že to možno považovať za kľúčovú technológiu v hrách, ktorá sa nevzdá svojich pozícií v najbližších desiatich rokoch.

Text: Alexey Kharitonov, QA, Bytex

Metóda spätného sledovania

Metóda spätná stopa lúčov umožňuje výrazne obmedziť vyhľadávanie svetelných lúčov. Metóda bola vyvinutá v 80. rokoch, práce sú považované za zásadné bledý a Kay. Podľa tejto metódy sa sledovanie lúčov nevykonáva zo svetelných zdrojov, ale v opačnom smere - v mieste pozorovania. Takže sa berú do úvahy iba tie lúče, ktoré prispievajú k vytvoreniu obrazu.

Zvážte, ako môžete získať bitmapový obraz nejakej trojrozmernej scény pomocou metódy spätného sledovania. Predpokladajme, že projekčná rovina je rozdelená na veľa štvorcov - pixelov. Vyberme si stredovú projekciu s miznúcim stredom v určitej vzdialenosti od roviny premietania. Nakreslíme priamku od stredu zostupu cez stred štvorca (pixelu) premietacej roviny. Toto bude primárny spätný trasovací lúč. Ak priama čiara tohto lúča zasiahne jeden alebo viacero objektov scény, vyberte najbližší priesečník. Na určenie farby obrazového pixelu je potrebné vziať do úvahy vlastnosti objektu, ako aj to, aký druh svetelného žiarenia dopadá na príslušný bod objektu.

Ak je objekt zrkadlový (aspoň čiastočne), potom vytvoríme sekundárny lúč - dopadový lúč, pričom predchádzajúci, primárny sledovaný lúč považujeme za odrazový lúč. Vyššie sme zvážili zrkadlový odraz a získali sme vzorce pre vektor odrazeného lúča vzhľadom na vektory normálneho a dopadajúceho lúča. Ale tu poznáme vektor odrazeného lúča, ale ako nájsť vektor dopadajúceho lúča? Ak to chcete urobiť, môžete použiť rovnaký vzorec zrkadlového odrazu, ale špecifikujte požadovaný vektor dopadajúceho lúča ako odrazený lúč. Teda opačný odraz i.

Pre ideálne zrkadlo potom stačí sledovať len ďalší priesečník sekundárneho lúča s nejakým objektom. Neideálne zrkadlo značne komplikuje sledovanie – je potrebné sledovať nie jeden, ale mnoho dopadajúcich lúčov a počítať s príspevkom žiarenia z iných objektov viditeľných z daného bodu.

Ak je objekt priehľadný, potom je potrebné postaviť nový lúč, taký, ktorý by pri lámaní vydal predchádzajúci sledovaný lúč. Tu môžete použiť aj reverzibilitu, ktorá platí aj pre refrakciu.

Ak má objekt vlastnosti difúzneho odrazu a lomu, potom vo všeobecnom prípade, ako v prípade neideálneho zrkadla, je potrebné sledovať lúče prichádzajúce zo všetkých dostupných objektov. Pre difúzny odraz je známe, že intenzita odrazeného svetla je úmerná kosínusu uhla medzi vektorom lúča zo zdroja svetla a normálou. Tu môže byť zdrojom svetla akýkoľvek objekt viditeľný z daného bodu, schopný prenášať svetelnú energiu.

Keď sa ukáže; že aktuálny spätný sledovací lúč nepretína žiadny objekt, ale ide do voľného priestoru, potom sa sledovanie pre tento lúč končí.

Ryža. 14.1 Príklad spätného sledovania lúčov.

Sledovanie lúčov v podobe, v akej sme ho tu uvažovali, síce znižuje enumeráciu, ale neumožňuje zbaviť sa nekonečnosti počtu analyzovaných lúčov. Táto metóda skutočne umožňuje okamžite získať jeden primárny spätný lúč pre každý bod obrazu. Sekundárnych odrazových lúčov však už môže byť nekonečné množstvo. Takže napríklad, ak objekt môže odrážať svetlo od akéhokoľvek iného objektu a ak sú tieto ostatné objekty dostatočne veľké, potom ktoré body emitujúcich objektov by sa mali brať do úvahy pri konštrukcii zodpovedajúcich lúčov, napríklad pri difúznom odraze? Jednoznačne všetky body.

Ako funguje sledovanie lúčov:

1. Imaginárny lúč je vyžarovaný z oka pozorovateľa cez nejaký pixel obrazovky a jeho dráha je sledovaná, kým nepretína objekt.

2. Z prvého bodu priesečníka lúča s guľou je vyžarovaný odrazený lúč. Nech je povrch nepriehľadný. Vtedy lomené lúče nekreslíme. Označujeme tieňový lúč od priesečníka k svetelnému zdroju. Keďže tento lúč neprechádza cez iný nepriehľadný povrch, zdroj svetla priamo ovplyvňuje intenzitu osvetlenia v danom bode.

3. Nechajte odrazený lúč pretínať iný objekt, tentoraz priesvitnú guľu, ktorá odráža a prepúšťa svetlo. Odrazené a lomené lúče sú vyžarované spolu s tieňovým lúčom smerujúcim k svetelnému zdroju. Vysielaný lúč mení svoj smer pred a po vstupe do gule v súlade s účinkom lomu.

4. Bod, v ktorom lúč pretína guľu, nech nie je priamo osvetlený zdrojom, pretože dráhu tieňového lúča blokuje nepriehľadná plocha. Ak by scéna obsahovala viacero svetelných zdrojov, potom by sa tieňové lúče museli vrhať do každého z nich.

5. Vplyv všetkých lúčov generovaných explicitne alebo implicitne pomocou počiatočného lúča je sčítaný a výsledok určuje hodnotu RGB tohto bodu.

Na Gamescom 2018 Nvidia oznámila sériu grafických kariet Nvidia GeForce RTX, ktoré budú podporovať technológiu sledovania lúčov Nvidia RTX v reálnom čase. Naši redaktori prišli na to, ako bude táto technológia fungovať a prečo je potrebná.

Čo je Nvidia RTX?

Nvidia RTX je platforma, ktorá obsahuje množstvo užitočných nástrojov pre vývojárov, ktoré otvárajú prístup k novej úrovni počítačovej grafiky. Nvidia RTX je dostupná len pre novú generáciu grafických kariet Nvidia GeForce RTX založených na architektúre Turing. Hlavnou črtou platformy je možnosť sledovanie lúčov v reálnom čase(nazývané aj sledovanie lúčov).

Čo je sledovanie lúčov?

Ray tracing je funkcia, ktorá vám umožňuje simulovať správanie svetla a vytvárať vierohodné osvetlenie. Teraz v hrách sa lúče nepohybujú v reálnom čase, a preto obraz, hoci často vyzerá krásne, stále nie je dostatočne realistický - v súčasnosti používané technológie by vyžadovali obrovské množstvo zdrojov na sledovanie lúčov.

Napravuje to nový rad grafických kariet Nvidia GeForce RTX, ktorý má dostatok výkonu na výpočet dráhy lúčov.

Ako to funguje?

RTX premieta lúče svetla z pohľadu hráča (kamery) do okolitého priestoru a vypočítava tak, kde akej farby by sa mal pixel objaviť. Keď lúče na niečo zasiahnu, môžu:

  • Reflect - to vyvolá vzhľad odrazu na povrchu;
  • Stop – tým sa vytvorí tieň na tej strane objektu, na ktorú nezasiahlo svetlo
  • Refraktovať – zmení smer lúča alebo ovplyvní farbu.
Prítomnosť týchto funkcií umožňuje vytvárať vierohodnejšie osvetlenie a realistickú grafiku. Tento proces je veľmi náročný na zdroje a už dlho sa používa pri vytváraní filmových efektov. Jediný rozdiel je v tom, že pri vykresľovaní snímky filmu majú autori prístup k veľkému množstvu zdrojov a dá sa uvažovať aj na neobmedzený čas. V hrách má zariadenie zlomok sekundy na vytvorenie obrázka a grafická karta sa používa najčastejšie jedna a nie niekoľko, ako pri spracovaní filmov.

To podnietilo Nvidiu, aby predstavila ďalšie jadrá v grafických kartách GeForce RTX, ktoré prevezmú väčšinu pracovného zaťaženia a zvýšia výkon. Sú vybavené aj umelou inteligenciou, ktorej úlohou je vypočítať možné chyby počas procesu sledovania, čo im pomôže vopred sa vyhnúť. To, ako hovoria vývojári, zvýši aj rýchlosť práce.

A ako ovplyvňuje sledovanie lúčov kvalitu?

Počas prezentácie grafických kariet Nvidia ukázala množstvo príkladov, ako funguje sledovanie lúčov: najmä sa zistilo, že niektoré pripravované hry, vrátane Shadow of the Tomb Raider a Battlefield 5, budú fungovať na platforme RTX. Táto funkcia však bude v hre voliteľná, pretože na sledovanie je potrebná jedna z nových grafických kariet. Trailery zobrazené spoločnosťou počas prezentácie si môžete pozrieť nižšie:

Shadow of the Tomb Raider, ktorý vyjde 14. septembra tohto roku:

Battlefield 5, ktorý vyjde 19. októbra:

Metro Exodus, ktorého vydanie je naplánované na 19. februára 2019:

Control , ktorý zatiaľ nemá dátum vydania:

Spolu s tým, Nvidia, aké ďalšie hry dostanú ray tracing.

Ako povoliť RTX?

Vzhľadom na technické vlastnosti tejto technológie budú sledovanie lúčov podporovať iba grafické karty s architektúrou Turing – zariadenia, ktoré sú v súčasnosti dostupné, nedokážu zvládnuť množstvo práce, ktorú sledovanie vyžaduje. V súčasnosti sú jedinými grafickými kartami s touto architektúrou séria Nvidia GeForce RTX, ktorej modely sú k dispozícii na predobjednávku od 48 000 do 96 000 rubľov.

Existujú analógy pre AMD?

AMD má svoj vlastný variant technológie sledovania lúčov v reálnom čase, ktorý je prítomný v ich jadre Radeon ProRender. Spoločnosť oznámila svoj vývoj už na GDC 2018, ktoré sa konalo v marci. Hlavným rozdielom medzi metódou AMD a Nvidia je, že AMD poskytuje prístup nielen k trasovaniu, ale aj k rasterizácii, čo je technológia, ktorá sa teraz používa vo všetkých hrách. To vám umožňuje používať sledovanie, získať lepšie osvetlenie a šetriť zdroje na miestach, kde bude sledovanie zbytočne zaťažovať grafickú kartu.

Technológia, ktorá pobeží na Vulkan API, je stále vo vývoji.

Ako uviedla Nvidia počas svojej prezentácie, vývoj technológie RTX výrazne zlepší grafickú zložku hier, čím sa rozšíri sada nástrojov, ktoré majú vývojári k dispozícii. Napriek tomu je príliš skoro hovoriť o všeobecnej grafickej revolúcii - nie všetky hry budú podporovať túto technológiu a náklady na grafické karty s jej podporou sú dosť vysoké. Prezentácia nových grafických kariet znamená pokrok v grafických detailoch a časom bude rásť a rásť.

ÚVOD

Existuje niekoľko metód na generovanie realistických obrázkov, ako napríklad sledovanie lúčov dopredu (sledovanie fotónov) a sledovanie lúčov zozadu.

Metódy sledovania lúčov sú dnes považované za najvýkonnejšie a najuniverzálnejšie metódy na vytváranie realistických obrázkov. Existuje mnoho príkladov implementácie sledovacích algoritmov pre vysokokvalitné zobrazenie najzložitejších trojrozmerných scén. Možno poznamenať, že univerzálnosť metód sledovania je do značnej miery spôsobená tým, že sú založené na jednoduchých a jasných konceptoch, ktoré odrážajú našu skúsenosť s vnímaním sveta okolo nás.

Objekty okolo nás majú vo vzťahu k svetlu tieto vlastnosti:

vyžarovať;

odrážať a absorbovať;

prejsť cez seba.

Každá z týchto vlastností môže byť opísaná nejakým súborom charakteristík.

Žiarenie možno charakterizovať intenzitou a spektrom.

Vlastnosť odrazu (absorpcie) možno opísať charakteristikami difúzneho rozptylu a zrkadlového odrazu. Transparentnosť možno opísať útlmom intenzity a lomom.

Lúče svetla vychádzajú z bodov na povrchu (objeme) vyžarujúcich predmetov. Takéto lúče možno nazvať primárne - osvetľujú všetko ostatné. Nespočetné množstvo primárnych lúčov vychádza zo zdrojov žiarenia v rôznych smeroch. Niektoré lúče idú do voľného priestoru a niektoré dopadajú na iné predmety.

V dôsledku pôsobenia primárnych lúčov na predmety vznikajú sekundárne lúče. Niektoré z nich skončia na iných predmetoch. Takže, opakovane odrazené a lomené, jednotlivé svetelné lúče prichádzajú do bodu pozorovania. Obraz scény teda tvorí nejaký súbor svetelných lúčov.

Farba jednotlivých bodov obrazu je určená spektrom a intenzitou primárnych lúčov zdrojov žiarenia, ako aj absorpciou svetelnej energie v objektoch, ktoré sa stretávajú v dráhe zodpovedajúcich lúčov.

Priama implementácia tohto lúčového modelu zobrazovania je náročná. Môžete sa pokúsiť vytvoriť algoritmus konštrukcie obrazu špecifikovaným spôsobom. V takomto algoritme je potrebné spočítať všetky primárne lúče a určiť tie, ktoré dopadajú na objekty a kameru. Potom iterujte cez všetky sekundárne lúče a tiež berte do úvahy len tie, ktoré zasiahli objekty a kameru. A tak ďalej. Tento algoritmus sa nazýva priame sledovanie lúčov. Hlavnou nevýhodou tejto metódy je množstvo zbytočných operácií spojených s výpočtom lúčov, ktoré sa potom nepoužívajú.

1. REVERZNÉ SLEDOVANIE LÚČA

Táto práca je venovaná tejto metóde vytvárania realistických obrázkov.

Metóda spätného sledovania lúčov môže výrazne obmedziť vyhľadávanie svetelných lúčov. Metóda bola vyvinutá v 80. rokoch, diela Whitteda a Kaya sú považované za zásadné. Podľa tejto metódy sa sledovanie lúčov nevykonáva zo svetelných zdrojov, ale v opačnom smere - z bodu pozorovania. Týmto spôsobom sa berú do úvahy iba tie lúče, ktoré prispievajú k tvorbe obrazu.

Projekčná rovina je rozdelená na mnoho pixelov. Vyberme si stredovú projekciu s miznúcim stredom v určitej vzdialenosti od roviny premietania. Nakreslite priamku od miznúceho stredu cez stred pixelu projekčnej roviny. Toto bude primárny spätný trasovací lúč. Ak tento lúč zasiahne jeden alebo viacero objektov scény, vyberte najbližší priesečník. Na určenie farby obrazového pixelu je potrebné vziať do úvahy vlastnosti objektu, ako aj to, aký druh svetelného žiarenia dopadá na príslušný bod objektu.

Ak je objekt zrkadlový (aspoň čiastočne), potom vytvoríme sekundárny lúč - dopadový lúč, pričom predchádzajúci, primárny sledovaný lúč považujeme za odrazový lúč.

Pre ideálne zrkadlo potom stačí sledovať len ďalší priesečník sekundárneho lúča s nejakým objektom. Ideálne zrkadlo má dokonale hladký leštený povrch, takže jeden odrazený lúč zodpovedá iba jednému dopadajúcemu lúču. Zrkadlo sa dá stmaviť, teda pohltiť časť svetelnej energie, ale stále platí pravidlo: jeden lúč dopadne – jeden sa odrazí.

Ak je objekt priehľadný, potom je potrebné postaviť nový lúč, taký, ktorý by pri lámaní vydal predchádzajúci sledovaný lúč.

Pre difúzny odraz je známe, že intenzita odrazeného svetla je úmerná kosínusu uhla medzi vektorom lúča zo zdroja svetla a normálou.

Keď sa ukáže, že aktuálny spätný sledovací lúč nepretína žiadny objekt, ale ide do voľného priestoru, potom sa sledovanie tohto lúča končí.

Pri praktickej implementácii metódy spätného sledovania sa zavádzajú obmedzenia. Niektoré z nich sú nevyhnutné na to, aby bolo možné v princípe vyriešiť problém syntézy obrazu a niektoré obmedzenia môžu výrazne zvýšiť rýchlosť sledovania.

Obmedzenia pri implementácii sledovania

Spomedzi všetkých typov predmetov vyčleníme niektoré, ktoré nazveme svetelné zdroje. Svetelné zdroje môžu svetlo iba vyžarovať, nemôžu ho odrážať ani lámať. Budeme brať do úvahy iba bodové zdroje svetla.

Vlastnosti reflexných plôch sú opísané súčtom dvoch zložiek – difúznej a zrkadlovej.

Zrkadlivosť je tiež opísaná dvoma zložkami. Prvý (odraz) berie do úvahy odraz od iných objektov, ktoré nie sú zdrojmi svetla. Na ďalšie sledovanie je vytvorený iba jeden zrkadlovo odrazený lúč r. Druhá zložka (specular) znamená odlesky zo svetelných zdrojov. Na tento účel sú lúče nasmerované na všetky svetelné zdroje a určia sa uhly, ktoré tieto lúče zvierajú so zrkadlovo odrazeným spätným sledovaným lúčom (r). Pri zrkadlení je farba povrchového bodu určená natívnou farbou toho, čo sa odráža.

Pri difúznom odraze sa berú do úvahy iba lúče zo svetelných zdrojov. Lúče zo zrkadlovo odrážajúcich povrchov sú IGNOROVANÉ. Ak je lúč nasmerovaný na daný svetelný zdroj zakrytý iným objektom, potom je tento bod objektu v tieni. Pri difúznom odraze je farba osvetleného bodu na povrchu určená vlastnou farbou povrchu a farbou svetelných zdrojov.

Pri transparentných (priehľadných) objektoch sa neberie do úvahy závislosť indexu lomu od vlnovej dĺžky. (Niekedy sa priehľadnosť vo všeobecnosti modeluje bez lomu, to znamená, že smer lomu lúča t sa zhoduje so smerom dopadajúceho lúča.)

Aby sa zohľadnilo osvetlenie objektov svetlom rozptýleným inými objektmi, zavádza sa zložka pozadia (okolie).

Na dokončenie sledovania sa zavádza obmedzenie počtu iterácií (hĺbka rekurzie).

Závery o metóde spätného sledovania

Výhody:

Univerzálnosť metódy, jej použiteľnosť pre syntézu obrazov pomerne zložitých priestorových schém. Stelesňuje mnohé zákony geometrickej optiky. Ide len o rôzne projekcie.

Dokonca aj skrátené verzie tejto metódy umožňujú získať celkom realistické obrázky. Ak sa napríklad obmedzíme len na primárne lúče (z projekčného bodu), potom to má za následok odstránenie neviditeľných bodov. Už sledovanie jedného alebo dvoch sekundárnych lúčov dáva tiene, zrkadlovú priehľadnosť.

Všetky transformácie súradníc sú lineárne, takže je ľahké pracovať s textúrami.

nedostatky:

Problémy s modelovaním difúzneho odrazu a lomu.

Pre každý bod obrazu je potrebné vykonať veľa výpočtových operácií. Sledovanie je jedným z najpomalších algoritmov syntézy obrazu.

2. NÁVRHOVÁ ČASŤ

Algoritmy.

Reverzné sledovanie lúčov.

Ryža. 1 - Bloková schéma rekurentného algoritmu pre spätné sledovanie lúčov

programovací jazyk na sledovanie lúčov

V tomto programe je algoritmus spätného sledovania implementovaný opakujúcim sa spôsobom. Funkcia na výpočet intenzity primárneho lúča sa rekurzívne volá, aby našla intenzitu odrazených a lomených lúčov.

Algoritmus:

Na výpočet farby každého pixelu vo framebufferi sa vykonajú nasledujúce kroky:

Nájdite súradnice pixelu vo svetovom súradnicovom systéme.

Nájdite súradnice primárneho lúča.

Spustenie funkcie na výpočet intenzity primárneho lúča.

Nájdite priesečníky lúča so všetkými primitívami v scéne a vyberte si najbližší.

Ak sa priesečník nenájde, lúč sa dostal do voľného priestoru.

Na výpočet farby berieme celkovú intenzitu rovnú intenzite pozadia. Prejdite na krok 12. Ak sa nájde križovatka, prejdite na krok 6.

Vypočítame „lokálnu“ intenzitu farby objektu, ktorému priesečník patrí. Pod „lokálnou“ intenzitou sa rozumie intenzita zohľadňujúca intenzitu difúzne odrazeného svetla a intenzitu oslnenia.

Ak materiál odráža svetlo len difúzne, tak intenzity odrazeného a lomeného svetla považujeme za nulové. Prejdite na krok 12. V opačnom prípade prejdite na krok 8.

Ak sa dosiahne maximálna hĺbka rekurzie, potom berte intenzity odrazeného a lomeného svetla nulové. Prejdite na krok 12. V opačnom prípade prejdite na krok 9.

Vypočítajte vektor odrazeného lúča. Spustenie rekurzie na zistenie intenzity odrazeného lúča.

Vypočítajte vektor lomeného lúča. Spustenie rekurzie na zistenie intenzity lomeného lúča.

Výpočet celkovej intenzity farby. Celková intenzita zahŕňa intenzitu rozptýleného svetla, lokálnu intenzitu a intenzity odrazených a lomených lúčov.

Vráťte sa do spúšťacieho bodu funkcie výpočtu intenzity lúča.

Ak bol vypočítaný primárny lúč, potom sa pixel vypočítanej farby umiestni do vyrovnávacej pamäte snímok. Prejdeme k výpočtu ďalšieho pixelu vyrovnávacej pamäte snímok Ak bol vypočítaný odrazený (lomený) lúč, potom vypočítaná intenzita bude braná ako intenzita odrazeného (lomeného) lúča v predchádzajúcom kroku rekurzie.

Budovanie tieňov.

Pevné tiene.

Na vytvorenie pevných tieňov v sledovacom algoritme sa vo fáze výpočtu „miestnej“ intenzity farby v bode objektu kontroluje „viditeľnosť“ každého svetelného zdroja z tohto bodu.

Princíp algoritmu.

Z testovaného bodu sa zostrojí lúč smerujúci k zdroju svetla.

Medzi kontrolovaným bodom a zdrojom sa hľadajú priesečníky tohto lúča s primitívami scény.

Ak sa nájde aspoň jeden priesečník, kontrolovaný bod je v tieni. Pri výpočte jeho farby sa neberie do úvahy zdroj, pre ktorý bola kontrola vykonaná.

overiteľný zdroj.

Tento spôsob hľadania tieňov poskytuje prijateľný výsledok, pokiaľ v scéne nie sú žiadne priehľadné objekty. Pevný čierny tieň skla však nepôsobí realisticky. Sklo čiastočne prepúšťa svetlo, preto treba pri výpočte intenzity svetla v bode na predmete brať do úvahy intenzitu zatieneného zdroja, pri prechode svetla cez sklo ho však treba utlmiť.

Matematické a fyzikálne pozadie algoritmu sledovania spätného lúča.

Osvetlenie.

Intenzita svetla je súčtom intenzity podsvietenia scény, intenzity difúzne odrazeného svetla zdrojov, intenzity oslnenia zo zdrojov (charakteristiky "miestneho" osvetlenia), intenzity zrkadlového svetla. odrazený lúč a intenzita lomeného lúča, ak existuje.

Intenzita podsvietenia (IA) je daná nejakou konštantou.

Intenzita difúzne odrazeného svetla (ID) sa vypočíta podľa klasického „kosínusového zákona“.

ID = IL cos α, (2.2.1.6)

kde IL je intenzita svetelného zdroja, α je uhol medzi normálou k povrchu a smerom k zdroju.

V prípade osvetlenia scény viacerými zdrojmi sa Id vypočíta pre každý z nich a následne sa spočíta.

IDi =Σ ILi cos αi.(2.2.1.7)

Intenzita vzplanutia zo zdroja (IS) sa vypočíta podľa Phongovho modelu.

IS = IL cosp β, (2.2.1.8)

kde IL je intenzita svetelného zdroja (0<=IL<=1), β - угол между отраженным лучом от источника света и направлением на точку, в которой расположена камера (центр проекции), p - некоторая степень от 1 до 200 -влияет на размытость блика. При

Pri nízkych hodnotách p je zvýraznenie viac rozmazané.

Podobne ako pri výpočte ID, aj v prípade osvetlenia scény viacerými zdrojmi sa IS vypočítava pre každý zdroj samostatne a následne sa výsledky sčítajú.

ISi =Σ ILi cosp β i.(2.2.1.9)

Intenzity zrkadlovo odrazeného (IR) a lomeného (IT) svetla sa vypočítajú pre odrazené a lomené lúče v ďalšom kroku rekurzie. Ak sa dosiahne limit hĺbky rekurzie, potom sa tieto intenzity považujú za nulové. Z intenzity IR sa berie r percent az IT - t = 1 - r (pozri predchádzajúcu časť).

Okrem toho sa zavádzajú tieto koeficienty: KD - koeficient difúzneho odrazu povrchu, KS - koeficient oslnenia - tento koeficient je charakteristický pre drsnosť odrazového povrchu. Čím väčšia je drsnosť povrchu, tým menej svetla sa od neho odráža zrkadlovo a tým menej svetla prepúšťa, a teda tým viac svetla odráža difúzne.<= KD <= 1.

Pri KD = 0 - všetko svetlo dopadajúce na povrch sa odráža a láme. KD = 1 - všetko svetlo sa odráža difúzne. Týmto faktorom sa násobí intenzita difúzne odrazeného svetla a intenzita podsvietenia. Intenzity zrkadlovo odrazeného a lomeného svetla sa vynásobia (1 - KD), ktorý je zodpovedný za jas oslnenia zo zdroja. 0<=KS<=1.

Pri KS = 0 - zvýraznenie nie je viditeľné, pri KS = 1 - jas zvýraznenia je maximálny.

Takže konečný vzorec na výpočet intenzity objektu v určitom bode bude vyzerať takto:

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

Treba poznamenať, že konečná intenzita by nemala byť väčšia ako jedna. Ak sa tak stane, tento bod na obrázku bude preexponovaný. Jeho intenzita sa musí vynulovať o jeden.

Na získanie farebného obrazu je potrebné vykonať výpočty oddelene pre zložky červeného, ​​zeleného a modrého svetla. Farba obrazového pixelu sa vypočíta vynásobením každej zložky intenzity číslom, ktoré určuje maximálny počet gradácií intenzity obrazu. Pre 32-bitový obrázok sa rovná 255 pre každú z farieb (R, G, B).

255 x IR = 255 x IG = 255 x IB.

Tu IR (nezamieňať s intenzitou zrkadlovo odrazeného svetla), IG, IB sú intenzity troch svetelných zložiek v bode, získané podľa vyššie uvedeného vzorca.

Koeficienty KD, KS, p sú jednotlivé charakteristiky objektu, odrážajúce jeho vlastnosti. Okrem toho existuje ešte jeden koeficient - absolútny index lomu n. n = c / v, kde c je rýchlosť svetla vo vákuu, v je rýchlosť svetla v médiu (vo vnútri objektu). Pre absolútne nepriehľadné telesá je tento koeficient rovný ∞ (pretože rýchlosť svetla vo vnútri telesa je nulová). Ak chcete v programe určiť absolútne nepriehľadné telo, musíte nastaviť tento koeficient >> 1 (asi 10 000). V tomto prípade bude mať podiel zrkadlovo odrazeného svetla r tendenciu k jednotke a lomu k nule.

Výpočet normálov.

V sledovacom algoritme sú normály k objektom potrebné na výpočet odrazených a lomených lúčov, ako aj na určenie osvetlenia podľa Phongovho modelu.

V tomto programe sú tri typy primitív, z ktorých je scéna postavená. Ide o mnohouholník (trojuholník), elipsoid a paraboloid. Posledné dve sú uvedené pre realistickejšiu imitáciu skla (mohlo byť postavené aj z polygónov, ale model by sa ukázal byť drsnejší).

Výpočet normály k mnohouholníku (trojuholníku).

Výpočet normály k trojuholníku je zredukovaný na operáciu vektorového násobenia. Nech je trojuholník ABC daný súradnicami jeho troch vrcholov:

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

Vypočítajme súradnice dvoch vektorov, napríklad AB a AC:

XB – XA,= XB – XA,

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

Normálne vektorové súradnice sa vypočítajú pomocou vzorcov:

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

Nie je potrebné počítať súradnice normálového vektora k trojuholníku zakaždým v tele stopy, pretože normály sú rovnaké v ktoromkoľvek bode trojuholníka. Stačí ich raz spočítať v inicializačnej časti programu a uložiť. Keď otočíte trojuholník, musíte otočiť aj jeho normálu.

Výpočet normály k povrchu druhého rádu.

Povrch druhého rádu je vo všeobecnom prípade daný rovnicou v tvare:

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

Použijeme však inú formu zápisu. Takže elipsoidná rovnica bude vyzerať takto:

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

kde x0, y0, z0 sú súradnice stredu elipsoidu, A, B, C sú dĺžky poloosi elipsoidu.

Paraboloidná rovnica:

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

kde x0, y0, z0 sú súradnice stredu paraboloidu, A, B, C sú dĺžky poloosí paraboloidu. Os paraboloidu sa nachádza pozdĺž osi Oz svetového súradnicového systému. Na výpočet súradníc normálového vektora je potrebné vypočítať parciálne derivácie vzhľadom na x, y, z.

Elipsoidné normálne vektorové súradnice:

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

Smer vektora sa nezmení, ak sú všetky jeho súradnice delené 2:

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

Zn \u003d (z-z0) / C2.

Súradnice normálového vektora paraboloidu sa vypočítajú podobne:

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

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

Normála pre povrch druhého rádu sa bude musieť vypočítať priamo v tele stopy, pretože normály sú v rôznych bodoch obrázku rôzne.

Výpočet odrazeného lúča.

Nech je daný vektor dopadajúceho lúča S a známy normálový vektor N. Je potrebné nájsť vektor odrazeného lúča R.

Zvážte jednotkové vektory R1, S1 a N1. Pretože vektory normály, dopadajúceho a odrazeného lúča sú v rovnakej rovine, môžeme písať R1 + S1 = N`, kde N` je vektor zodpovedajúci uhlopriečke kosoštvorca a zhodný v smere s normálou . Dĺžka vektora N' sa rovná 2cosθ. Pretože vektor N` sa zhoduje v smere s N1, potom

N' = N'2cos9.

Odtiaľ nájdeme jednotkový vektor odrazeného lúča:

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

Poďme nájsť cosθ. Dá sa to urobiť pomocou skalárneho súčinu vektorov N a S:


Za predpokladu, že požadovaný vektor odrazeného lúča bude mať rovnakú dĺžku ako vektor dopadajúceho lúča, teda R = |S| R1, dostaneme

N 2NS/|N|2 - S.

Toto riešenie je vo vektorovej forme. Napíšme súradnice vektora:

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

Výpočet lomu lúča.

Nech sú dané dva jednotkové vektory: S1 je vektor dopadajúceho lúča a N1 je vektor normály na rozhranie medzi dvoma médiami. Pre tieto médiá musia byť známe aj dva indexy lomu - n1 a n2 (alebo ich pomer).

Je potrebné nájsť jednotkový vektor lomeného lúča T1. Pre riešenie vykonávame niektoré geometrické konštrukcie.

Požadovaný vektor T1 sa rovná súčtu dvoch vektorov:

Najprv nájdime vektor NT. Je v opačnom smere ako normálový vektor a jeho dĺžka sa rovná |T1| cos α2 = cos α2 (pretože T1 je jednotka). Teda NT = -N1 cos a2. Je potrebné určiť cos α2. Napíšme zákon lomu n1 sin α1 = n2 sin α2 v tvare:

sinα2 = n sinα1,

kde n = n1 / n2.

Použime identitu cos2α + sin2α = 1. Potom

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

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

Hodnota cos α1 môže byť vyjadrená ako skalárny súčin jednotkových vektorov S1 a N1, to znamená cos α1 = S1N1. Potom môžeme napísať nasledujúci výraz pre vektor NT:

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

Zostáva nájsť výraz pre vektor B. Nachádza sa na rovnakej línii s vektorom A a A = S1 - NS. Ak vezmeme do úvahy, že NS sa rovná N1 cos α1, potom A = S1 - N1 cos α1. Pretože cos α1 = S1N1, potom A = S1 - N1 (S1N1).

Keďže dĺžka vektora A sa rovná sin α1 a dĺžka vektora B sa rovná sin α2, potom

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

odkiaľ |B| = n |A|. Ak vezmeme do úvahy relatívnu polohu vektorov A a B, získame

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

Teraz môžeme napísať požadovaný výraz pre jednotkový vektor lomu T1:

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

Výpočet priesečníka s primitívami.

V sledovacom algoritme je na vytvorenie obrazu potrebné vypočítať priesečníky lúčov s primitívami scény. Nosník je daný parametrickou rovnicou priamky. Rovnicu spĺňa ktorýkoľvek bod lúča

R = A + Vt, (2.2.5.1)

kde R je vektor polomeru ľubovoľného bodu prislúchajúceho lúču, A je vektor polomeru počiatočného bodu lúča, V je smerový vektor lúča, t je parameter.

Ak je smerový vektor V normalizovaný, potom sa parameter t bude číselne rovnať vzdialenosti od počiatočného bodu lúča A k bodu R.

Túto rovnicu môžete napísať v súradnicovom tvare:

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

Tu x1, y1, z1 sú súradnice počiatočného bodu lúča v pravouhlom kartézskom svetovom súradnicovom systéme, a,b,c sú súradnice smerového vektora lúča.

Výpočet priesečníka lúča s povrchom druhého rádu.

Na nájdenie priesečníka lúča daného rovnicami (2) s povrchom druhého rádu daným rovnicami (2.2.2.3) alebo (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),

namiesto x, y a z musia byť zodpovedajúce rovnice lúčov dosadené do rovnice povrchu druhého rádu. Výsledkom je, že po otvorení všetkých zátvoriek a prinesení podobných dostaneme kvadratickú rovnicu vzhľadom na parameter t. Ak je diskriminant kvadratickej rovnice menší ako nula, potom lúč a plocha druhého rádu nemajú spoločné priesečníky. V opačnom prípade bude možné vypočítať dve hodnoty parametra t. Diskriminant sa môže rovnať nule - to zodpovedá limitnému prípadu lúča dotýkajúceho sa povrchu a dostaneme dve zhodné hodnoty parametra t.

Na nájdenie súradníc priesečníkov lúča a povrchu stačí dosadiť nájdené hodnoty parametra t do lúčových rovníc (2).

Keď sa v programe nájdu dve križovatky, na vizualizáciu sa vyberie najbližšia. Najbližší priesečník sa určí porovnaním zistených parametrov t. Bližšie k pozorovaciemu bodu je priesečník, ktorý zodpovedá menšiemu parametru t. Tu je potrebné poznamenať, že v dôsledku riešenia kvadratickej rovnice sa jedna alebo obe hodnoty parametra t môžu ukázať ako záporné. To znamená, že priesečník leží „za“ vzhľadom na východiskový bod lúča, v polovici priamky, ktorá je „na našej strane“ vzhľadom na rovinu obrazu. Takéto body sa pri hľadaní križovatky vyhadzujú.

Okrem toho sa v programe pre každý obrázok zavedie horná a dolná rovina rezu. Zobrazí sa iba časť postavy, ktorá leží medzi nimi.

Za týmto účelom sa po nájdení priesečníka analyzuje jeho súradnica z.

Výpočet priesečníka lúča s mnohouholníkom (trojuholníkom).

Ak chcete vypočítať priesečník lúča daný rovnicami (2), musíte najprv určiť priesečník tohto lúča s rovinou obsahujúcou tento trojuholník.

Rovnica roviny vyzerá takto:

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

Tu sa koeficienty A, B, C zhodujú so súradnicami normály k tejto rovine. Súradnice normály roviny sa zhodujú so súradnicami normály trojuholníka, ktoré sme vypočítali v štádiu načítania scény.

Na nájdenie voľného člena D je potrebné dosadiť súradnice ktoréhokoľvek bodu trojuholníka, napríklad jedného z vrcholov.

Ax-By-Cz.(2.2.5.4)

Hodnota D sa počas vykonávania programu nemení, preto je vhodné ju vypočítať pri inicializácii scény a uložiť ju ako bežné súradnice. Je potrebné ho prepočítať až pri zmene polohy trojuholníka.

Teraz, aby sme našli priesečník, dosadíme rovnice lúčov (2).

rovinná rovnica.

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

kam sa dostaneme

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

Ak je menovateľ tohto zlomku nula, potom je lúč rovnobežný s rovinou, v ktorej leží trojuholník. Neexistuje žiadny priesečník.

Pre zistenie súradníc priesečníka je potrebné dosadiť zistenú hodnotu parametra t do lúčových rovníc (2). Priesečník nazveme D. Dostaneme súradnice xD, yD, zD.

Teraz musíme určiť, či je bod D vo vnútri trojuholníka. Nájdite súradnice vektorov AB, BC, CA (A, B, C sú vrcholy trojuholníka) a súradnice vektorov AD, BD, CD. Potom nájdeme tri krížové produkty:

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

Tieto vektory budú kolineárne. Ak sú všetky tri vektory kosmerné, potom bod D leží vo vnútri trojuholníka. Ko-smer je určený rovnosťou znamienok zodpovedajúcich súradníc všetkých troch vektorov.

Operáciu kontroly, či bod D patrí do trojuholníka ABC, možno urýchliť. Ak ortogonálne premietneme trojuholník ABC a bod D na jednu z rovín xOy, yOz alebo xOz, tak premietnutie bodu do priemetne trojuholníka bude znamenať, že samotný bod spadne do trojuholníka (samozrejme, ak už je známe, že bod D leží v rovine obsahujúcej trojuholník ABC ). Zároveň sa výrazne zníži počet operácií. Ak teda chcete nájsť súradnice všetkých vektorov, musíte pre každý vektor hľadať dve súradnice a pri hľadaní vektorových produktov musíte hľadať iba jednu súradnicu (zvyšné sú rovné nule).

Ak chcete skontrolovať spoločný smer vektorov získaných pri výpočte krížového súčinu, musíte skontrolovať znamienka tejto jedinej súradnice pre všetky tri vektory. Ak sú všetky znaky väčšie ako nula alebo menšie ako nula, potom sú vektory kosmerné. Rovnosť jedného z vektorových súčinov s nulou zodpovedá prípadu, keď bod D padá na priamku obsahujúcu jednu zo strán trojuholníka.

Okrem toho možno pred výpočtom vektorov a krížových produktov vykonať jednoduchý rozmerový test. Ak priemet bodu D leží vpravo, vľavo, nad alebo pod každým z priemetov vrcholov trojuholníka, potom nemôže ležať vo vnútri.

Zostáva dodať, že pre projekciu je lepšie zvoliť jednu z rovín, premietacia plocha trojuholníka je väčšia. Za tejto podmienky je vylúčený prípad premietania trojuholníka do segmentu (za predpokladu, že testovaný trojuholník nie je degenerovaný do segmentu). Okrem toho so zväčšovaním projekčnej plochy klesá pravdepodobnosť chyby. Na určenie takejto premietacej roviny stačí skontrolovať tri súradnice normály trojuholníka. Ak je z-ová súradnica normály väčšia (v absolútnej hodnote) x a y, potom je potrebné premietnuť do roviny xOy. Ak je y väčšie ako x a z, potom premietneme na xOz. V zostávajúcom prípade - na yOz.

Popis dátových typov. Štruktúra programu.

Popis programových modulov

Zoznam modulov: .h-popis štruktúry TTex.h-popis štruktúr TPlaneTex a TEllipsoidTex.h-popis štruktúr TPoint2d a TPoint3d.h-popis štruktúry TRGBColor.h-popis triedy TLamp .h-popis triedy TCam.h-popis triedy TPrimitive Popis triedy h TFrstSurface.h-class popis TScndSurface.h-class popis TTtriangle.h-class description TEllipsoid.h-class description TCylinder.h-class popis THyperboloidVert.h-class popis THyperboloidHor.h-class popis TScene.h- TTracer class popis

Implementačné moduly, rozhranie programu:

Options.h-modul formulára "Options".

ExtraCamOptions.h-modul formulára "Vlastnosti fotoaparátu".

MainUnit.h - modul hlavnej formy programu

Stručný popis štruktúr a tried programu: TPoint3d - štruktúra, ktorá popisuje bod vo svetovom súradnicovom systéme, TPoint2d - štruktúra, ktorá popisuje bod v rovine (v textúre) s celočíselnými súradnicami, TRGBColor - štruktúra ktorá popisuje farbu v troch zložkách (RGB), TTex - štruktúra popisujúca textúru - obsahuje adresu poľa pixelov a jej rozmery, TPlaneTex - štruktúra, ktorá popisuje väzbu textúry na rovinu.

Obsahuje tri body, ku ktorým je pripojená textúra: TLamp ​​​​ - trieda, ktorá popisuje zdroj svetla.

Obsahuje objekt TPoint3d coord so zdrojovými súradnicami a tromi plávajúcimi premennými (Ir, Ig, Ib) na uloženie intenzity troch zložiek svetla TCam je trieda, ktorá popisuje kameru.

Obsahuje dva uhly (a, b) označujúce smer pohľadu kamery, bod, na ktorý kamera smeruje (viewP) a vzdialenosť od kamery k tomuto bodu (r). TPrimitive je abstraktná primitívna trieda. Povrchy prvého a druhého rádu sa z neho dedia. TFrstSurface je abstraktná trieda povrchu prvého rádu. Trieda trojuholník je z nej zdedená.TScndSurface je abstraktná trieda povrchu druhého rádu. Od nej sa dedia triedy elipsoid a paraboloid TTtriangle - trieda trojuholníka. Obsahuje tri vrcholy trojuholníka a jeho normálu TCylinder - trieda valca THyperboloidVert - trieda jednovrstvového hyperboloidu ležiaceho pozdĺž osi oZ.THyperboloidHor - trieda jednovrstvového hyperboloidu ležiaceho pozdĺž osi oX.TEllipsoid - trieda elipsoidu.TScene - trieda scény. Obsahuje informácie o všetkých primitívoch, zdrojoch a fotoaparáte. TTracer je trieda zodpovedná za vykreslenie obrazu. Obsahuje buffer (buffer) s rozložením 400x400 pixelov, v ktorom sa tvorí obraz scény. Pred vygenerovaním je potrebné zavolať funkciu a odovzdať jej ako parameter ukazovateľ na scénu, ktorá sa má vygenerovať. Ak chcete vygenerovať, zavolajte funkciu render.

Všetky triedy - potomkovia TPrimitive poskytujú nasledujúce funkcie: getT(TPoint3d p0, TPoint3d viewDir) - vráti vzdialenosť od bodu pôvodu (p0) lúča viewDir k najbližšiemu bodu priesečníka s primitívom.

void getTArr(float* arr, int& n, TPoint3d p0, TPoint3d viewDir) - vyplní pole arr vzdialenosťami od počiatočného bodu (p0) lúča viewDir k najbližšiemu bodu priesečníka s primitívom.

void getNormal(TPoint3d& n, const TPoint3d& p) - vráti súradnice normálového vektora do primitívu v bode p.

void getColor(TRGBColor& c, const TPoint3d& p) - vráti farbu primitívneho bodu p (vrátane textúry).

3. TECHNOLOGICKÁ ČASŤ

Výber programovacieho jazyka.

Pri vývoji programu bol použitý vysokoúrovňový programovací jazyk C++ ako súčasť vizuálneho programovacieho prostredia CodeGear RAD Studio pre Windows.

Tento jazyk bol vybraný z dôvodu, že poskytuje najpohodlnejšie prostriedky na prácu s RAM, umožňuje vám implementovať algoritmy efektívnejšie ako iné jazyky na vysokej úrovni. Programy napísané v C++ bežia rýchlejšie a zaberajú menej miesta na disku.

Okrem toho vizuálne programovacie prostredie CodeGear RAD Studio pre Windows

poskytuje veľké množstvo štandardných vizuálnych komponentov na vytváranie rozhrania a množstvo knižníc s rôznymi bežne používanými užitočnými funkciami. Taktiež má autor práce najväčšie skúsenosti s programovaním v špecifikovanom vizuálnom programovacom prostredí.

Formulár možností. Karta osvetlenia.

Táto karta obsahuje nástroje na nastavenie osvetlenia scény.

Súradnice zdroja - súradnice vo svetovom súradnicovom systéme svetelného zdroja vybraného v rozbaľovacom zozname.

Intenzita zdroja - hodnoty troch zložiek intenzity svetelného zdroja zvoleného v rozbaľovacom zozname.

Intenzita pozadia - hodnoty troch zložiek intenzity pozadia.

Tlačidlo „+“ (vedľa rozbaľovacieho zoznamu) - pridanie nového svetelného zdroja.

Tlačidlo „-“ (vedľa rozbaľovacieho zoznamu) – vymaže svetelný zdroj vybraný v rozbaľovacom zozname.

Formulár možností. Záložka Fotoaparát.

Táto karta obsahuje nástroje na nastavenie možností fotoaparátu.

Náhľad – tu vidíte približný pohľad na obrázok pred jeho vygenerovaním.

Navigácia – nastavenie polohy kamery.

Pokročilé – po kliknutí na toto tlačidlo sa zobrazí formulár

Vlastnosti fotoaparátu s pokročilými možnosťami fotoaparátu.

Formulár vlastností fotoaparátu.

Polomer - vzdialenosť od fotoaparátu k bodu, na ktorý je nasmerovaný.

Krok zmeny polomeru - zvýšenie polomeru kamery jedným stlačením tlačidla „-“ na karte „Kamera“ vo formulári „Možnosti“ (alebo jeho zmenšením jedným stlačením tlačidla „+“).

Formulár možností. karta materiály.

Toto menu zobrazuje parametre materiálu stola, na ktorom javisko stojí.

Farba - farba materiálu stola.

Coef. difúzny odraz - koeficient Kd materiálu stola (pozri časť 2.2.1).

Textúra - ak je začiarknuté políčko, textúra sa zobrazí na stole

Vybrať textúru – vyberte súbor obrázka (*.bmp), ktorý sa použije ako textúra tabuľky.

Rozšírené – po kliknutí na toto tlačidlo sa zobrazí formulár Vlastnosti tabuľky s ďalšími parametrami materiálu tabuľky.

Formulár vlastností tabuľky.

Koeficient oslnenia je koeficient KS materiálu stola (pozri časť 2.2.1).

Rozmazanie odleskov je exponent p materiálu tabuľky.

Textúra sa opakuje - koľkokrát sa textúra stola zopakuje pozdĺž osí OX a OY.

Formulár možností. Karta Systém.

Na tejto karte môžete nakonfigurovať algoritmy implementované v programe.

Hĺbka rekurzie – tento parameter nastavuje hĺbku rekurzie v algoritme sledovania. Väčšie hodnoty tohto parametra zlepšujú kvalitu generovaného obrazu.

POZOR!

Hĺbka rekurzie má SILNÝ vplyv na rýchlosť generovania obrazu. Neodporúča sa nastaviť tento parameter na viac ako 10.

Anitialiasing - aktivácia algoritmu vyhladzovania obrazu.

Typ tieňa - výber algoritmu konštrukcie tieňa.

4. VÝSKUMNÁ ČASŤ

Štúdie sa uskutočnili na počítači s nasledujúcou konfiguráciou:

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

4.1 Závislosť času generovania od hĺbky rekurzie

V tomto teste bola skúmaná závislosť času generovania obrazu od hĺbky rekurzie. Štúdie sa uskutočňovali pre scénu osvetlenú jediným zdrojom svetla - čas generovania bez tieňa v sekundách - čas generovania s plným tieňom v sekundách - hĺbka rekurzie.


4.2 Závislosť času generovania od počtu zdrojov


4.3 Analýza výsledkov výskumu

Z prvej štúdie je vidieť, že generačný čas silne rastie s počtom úrovní rekurzie. To je v dobrom súlade s teóriou, pretože počet lúčov rastie s hĺbkou rekurzie.

Treba poznamenať, že pre scény s malým počtom polygónov nie je potrebné nastavovať veľké hodnoty pre maximálnu hĺbku rekurzie, pretože rozdiel v kvalite generovaného obrazu bude zanedbateľný.

Druhá štúdia ukazuje, že závislosť doby generovania od počtu svetelných zdrojov je lineárna. Zo získaných hodnôt viete vypočítať čas potrebný na výpočet jedného zdroja. Na stroji, na ktorom bol výskum vykonaný, s hĺbkou rekurzie 5, je tento čas približne 0,5 sekundy.

ZÁVER

V tomto programe boli demonštrované výsledky algoritmu na generovanie realistických obrázkov - spätné sledovanie lúčov.

Táto implementácia demonštruje schopnosť algoritmu vytvárať obrázky blízke fotorealistickým. Sledovanie je jedným z najpokročilejších algoritmov na vytváranie realistických obrázkov. Kvalita výsledného obrazu je neporovnateľne lepšia ako kvalita obrazu získaného pomocou algoritmov ako je Z-buffer. Požiadavky na výpočtový výkon potrebný na vygenerovanie jedného obrazového rámca sú však oveľa vyššie ako v rovnakom Z-bufferi. K dnešnému dňu, v reálnom čase, sa algoritmus spätného sledovania lúča používa iba na výskumné účely na supervýkonných počítačoch, ktoré sú pre jednoduchého používateľa nedostupné. Samozrejme, existujú nadšenci, ktorí vytvárajú 3D hry a iné grafické aplikácie v reálnom čase založené na algoritme spätného sledovania lúča, ale spravidla majú extrémne nízke FPS alebo sú všetky objekty na scéne založené na guli - najjednoduchšie sledovať povrch lúčov. Aby sa však tento algoritmus stal ziskovým v masových projektoch, ako sú 3D hry, je potrebný významný prielom v oblasti hardvéru stolných počítačov.

Aj na príklade počítačových hier možno ľahko vysledovať redundanciu algoritmu spätného sledovania lúča. Koniec koncov, hráč, ktorý je unesený hrou, pravdepodobne nebude obdivovať geometricky správne vykreslenie tieňov a odrazov herných objektov. V tomto smere dnes výrazne vyhráva približná kresba pomocou polygónov, pretože nevyžaduje výkonný počítač a výsledky sa približujú realite.

Algoritmus sledovania lúčov je tiež ideálny pre snímky umelých objektov s geometricky jednoduchými tvarmi, ako sú autá, lietadlá, budovy atď. úloha pre algoritmus, čo zvyšuje tak značné požiadavky na hardvér počítača.

Aj dnes však môžete vidieť výskum implementácie algoritmu spätného sledovania lúčov v reálnom čase. V takýchto projektoch sa spravidla ako scéna používa auto. Ale absolútny fotorealizmus obrazu už bol dosiahnutý a okrem toho zaberie len veľmi málo času na vytvorenie jedného rámčeka. Samozrejme, tieto projekty sú implementované na supervýkonných počítačoch, ale nie je ďaleko deň, kedy budú takéto 3D aplikácie dostupné aj pre bežného používateľa.

BIBLIOGRAFIA

1. Rogers D. Algoritmické základy počítačovej grafiky: Per. z angličtiny - M.: Mir, 1989. - 512 s.

Porev VN Počítačová grafika. - Petrohrad: BHV-Petersburg, 2002. - 432 s.

Nikulin E.A. Počítačová geometria a algoritmy počítačovej grafiky. Petrohrad: BHV-Petersburg, 2003. - 560 s.

Angel E. Interaktívna počítačová grafika. - "Williams", 2001. - 592 s.: chorý. - Paral. Sýkorka. Z angličtiny.

Avdeeva S.M., Kurov A.V. Algoritmy pre 3D počítačovú grafiku: Učebnica. - M.: Vydavateľstvo MSTU im. N.E. Bauman, 1996. - 60 s.