Използване на алгоритъма за обратно проследяване на лъчи за изграждане на реалистично изображение. Метод за обратно проследяване

Наскоро 4A Games, създателят на невероятно реалистичните Metro игри, пусна видео, използващо RTX технологията на Nvidia, използвайки METRO: EXODUS като пример. Тази графична иновация е голяма и уверена стъпка напред в проследяването на лъчи. Но какво означава всичко това?

Зад булото на тайната

Да започнем от самото начало. Първо, изобразяването с проследяване на лъчи е един от основните видове визуализация, който се използва във филми и различни видове дизайн: от индустрията до архитектурата. Тоест това, което виждате на уебсайтовете като снимки на оборудване, е точно 3D рендер.

Същността на технологията се свежда до факта, че компютър симулира физическото поведение на светлината, като изчислява траекторията на условно отделни фотони на светлината, тоест, ако лъч попадне върху обект, той или се пречупва в него, или се отразява от под един или друг ъгъл. Резултатът е определен път на този лъч светлина, оттук и името „проследяване на лъчи“.

Това компютърно генерирано изображение, създадено от Enrico Cerica с помощта на OctaneRender, показва лъчи, сенки и отражения върху сложна подова повърхност

Единственият проблем е, че са необходими много лъчи и за всеки от тях е необходимо многократно да се изчислява всеки сблъсък на лъча с препятствия. Това по същество е прост математически проблем. Първо, трябва да изчислите къде лъчът удря съществуващ обект, тоест да изчислите сблъсъка, след което, въз основа на дадените свойства, трябва да направите допълнителни математически трансформации.


Опростена схема за проследяване на лъчи

Например, има матова повърхност с определена определена условна грапавост, но тя не е абсолютно грапава и лъчът се отклонява от нея с определена вероятност под определен ъгъл, различен от ъгъла на падане. Трябва да се има предвид, че ако обектът има свойството да бъде безкрайно гладък, тогава ъгълът на падане е равен на ъгъла на отражение. Ако свойствата на повърхността показват мъгла, тогава математически това се реализира чрез отклонението на ъгъла на отражение от ъгъла на падане.

Това е вярно в живота; почти винаги повърхността не е напълно гладка. Следователно, когато светлината попадне в една или друга точка, тя се отразява спрямо място на повърхността, което може по някакъв начин да се завърти спрямо равнина, която ни се струва плоска, а съседният лъч се отразява в съвсем различна посока. Така става съвсем ясно, че няма смисъл да се правят модели на обекти прекалено многоъгълни, така че неравностите се определят от свойствата на повърхността. Резултатът е подобен на реалното разсейване на светлината от матирани повърхности.

В днешните игри се използва обект, който изглежда покрит с някакъв вид глазура. Със сигурност всеки е срещал странни стени и подове в игрите, които изглеждат като намазани с някаква тиня. Така че с проследяването на лъчи не е необходимо да правите това - повърхностите могат да разпръскват светлина напълно естествено. Това е перфектно показано в демонстрацията, има няколко области, вариращи от най-огледалните до най-матовите.

Особено забележимо е, че в матовите области отражението силно зависи от близостта на обекта до повърхността. Тоест, колкото по-далеч е един обект от повърхността, толкова по-размазан става. Това е важно свойство, което дори не забелязваме в живота, въпреки че съществува.

Но най-важното са сенките. Няма нищо по-нестандартно от сенките във всяка игра.

Това обикновено са само проекции на обекти, които имат остри, неестествени ръбове. Има обаче по-добро качество, според стандартите на игрите, сенки. Това са меки опции с преходна линия, тоест сянка и частична сянка.


За да създадете меки сенки или дифузни отражения (като тези, които виждате в полиран метал, например), са необходими по-усъвършенствани техники за проследяване на лъчи

Единственият проблем е, че в живота не става така. Ако източникът на светлина не е точка и не е безкрайно отдалечен, тогава големината на полусянката зависи от съотношението на разстоянието на източника на светлина от обекта и разстоянието на обекта от неговата сянка. Тоест кантът на полусянката на различни места може да бъде по-широк или по-тесен, особено когато става въпрос за големи източници на светлина.

Например, светлината от прозорец в облачно време дава толкова меки сенки, че ако поставите предмет, който е значително по-малък по размер на два метра от този прозорец, тогава в основата му можете да видите ясна сянка и полусянка, но от горната част от обекта може изобщо да няма сянка и полусянката няма да има ясни граници. Това не се случва в игри с традиционно растеризиране.

Проследяването на лъчи не е трудна задача, но има много лъчи и, за съжаление, в момента не е възможно да се направи всичко в реално време. Факт е, че в живота лъчите се разминават напълно различни посоки. В идеалния случай падащият лъч ще бъде разделен на безкраен брой лъчи, общата яркост на които ще зависи от свойствата на отразяващия обект и първоначалната яркост на падащия лъч.

За да намалите натоварването, можете да ограничите броя на лъчите и броя на сблъсъците, но тези ограничения водят до това, че картината получава оскъдни парчета сянка и неестествено ярки петна от източници на светлина. Тоест, недостатъчното количество данни води до появата на шум и цялата трудност е, че е невъзможно да се изчисли сцената веднъж и след това да се промени само това, което се променя от кадър на кадър, тъй като всеки движещ се обект променя всички маршрути на всички лъчи. Всяко движение на камерата и обектите изисква "сглобяване" на цялата сцена наново, поради което филмите се създават от ферми за рендиране и множество сървъри, които непрекъснато рендират графики в продължение на няколко месеца. Но, за съжаление, все още не е възможно да се направи това в реално време в игрите.

Така възниква въпросът как Nvidia и нейните партньори излязоха от тази ситуация: какво пожертваха, за да постигнат проследяване в реално време?

Две половини на едно цяло

Ако внимателно наблюдавате как се изобразява картината стъпка по стъпка, можете да видите, че някъде след петата интеграция самите сенки и светлина се променят едва забележимо. Става ясно къде, какво и как ще изглежда в окончателния вид. За това по принцип е необходимо реално време в софтуера, за да можете да завъртите светлинните източници, да разберете къде ще има някои акценти и след това да започнете окончателното изобразяване. Остава да видим как ще се разбере финалният кадър от мътната картина. Всъщност компютърът първо моделира оригиналната шумна картина, след това я анализира и на базата на получените данни рисува друга – крайната. Както показва практиката, този подход е по-прост по отношение на разходите за ресурси.

Всъщност прогресивен скок в развитието на проследяването в реално време е създаването на алгоритми, които позволяват да се оцени картина въз основа на нейното шумно състояние и да се възстанови нормалното. Това е ключовата иновация. Всичко останало беше широко използвано преди. Много програми за изобразяване имат плъгини за GPU рендиране и OpenGL, поддържани от всяка OpenGL-съвместима графична карта.

Днес се твърди, че тази техника за премахване на шум работи само върху нежни ядра в бъдещи карти от Nvidia. Но всъщност тази технология беше показана масово едва сега и се появи, очевидно, миналата година, тъй като през октомври, на едно от събитията, Unity показа същата технология за премахване на шума при проследяване в реално време.

Номерът е, че не всички обекти участват в проследяването на лъчи толкова добре, колкото би трябвало. В тази връзка ще засегнем темата за глобалното осветление - най-ресурсоемкият механизъм за проследяване. В живота всеки обект, върху който пада светлина, отразява част от тази светлина. Например, ако насочите източник на светлина към зелена стена, тогава цялото осветление ще стане зелено, защото зелената стена не абсорбира добре светлината.


Отражение на светлинни лъчи от повърхност

Нямаше такъв ефект в демото. Вместо отражение на светлината и промяна на светлинния модел на рамката в зависимост от източника на светлина, цялото пространство беше изпълнено с ярки картини, което прави светлината да изглежда динамична. Всъщност разработчиците не са използвали проследяване на лъчи върху детайли като мъгла и пламъци.

Факт е, че лъчите на светлината трябва да бъдат изчислени, независимо дали попадат в предмети или не. Тоест добавянето на голям брой източници на светлина е доста трудна задачаза изчисления на маршрута. В допълнение, нито една технологична демонстрация все още не включва обекти, които да имитират прозрачни обекти.

Кога ще видим ползата?

Въз основа на критериите, описани по-горе (мътност на картината и проследяване на не всички обекти), можем да кажем, че графиките в игрите все още не могат да изглеждат толкова детайлни и реалистични, колкото във филмите.

Въпреки това несъмнено има напредък. Първо, отраженията вече са по-лесни за правене; няма нужда да създавате карти на сенки и светлини - всичко това се решава чрез трасиране. Второ, появи се поне някакво подобие на разпръснати отражения. Трето, осветлението и сенките на обектите са значително подобрени. Като цяло можем да кажем, че това може да се счита за ключова технология в игрите, която няма да загуби позициите си през следващите десет години.

Текст: Алексей Харитонов, QA, Bytex

Тази статия ще обсъди използването на метода за обратно проследяване на лъчи за визуализиране на изображения в компютърни игри. Неговите предимства и недостатъци в сравнение с традиционна технология. Историята е за концептуална 3D игра, която за първи път използва графичен енджин, изграден изцяло на принципа на обратното проследяване на лъчите. Развитието на видеоускорителите за игри също е засегнато.

Традиционна технология

За тези, които не са запознати с теорията на 3D графиката, ще обясня накратко какво представлява методът за обратно проследяване на лъчи и как се различава от традиционния метод на графиката на играта. В традиционния метод за визуализиране на изображения в компютърните игри, сцената или, ако искате, светът на играта, е представен от набор от триъгълници. За всеки триъгълник са посочени текстури и нива на осветеност. След това триъгълниците се избутват масово в 3D ускорител и се рисуват, подобно на художник, който рисува плътен триъгълник върху лист хартия. Разликата е използването на буфер за дълбочина. Необходим е буфер за дълбочина, за да се избегне рисуването на триъгълници, които са покрити от други обекти в сцената. Когато чертаете точките на нов триъгълник, се проверява съответната стойност на буфера за дълбочина. Буферът за дълбочина, наричан още Z-буфер, съхранява разстоянието от наблюдателя до вече начертаното изображение. Ако разстоянието до точката на новия триъгълник е по-малко от стойността, записана в Z-буфера, тогава тази точка не е покрита от точките на по-близко разположени триъгълници и може да бъде начертана, а стойността на буфера за дълбочина също е актуализиран. Този метод ви позволява да конструирате изображение на сцена с произволна сложност, състояща се от триъгълници. Едно от предимствата на този метод е, че той може да бъде приложен - тоест визуализиране на доста смислена игрова сцена в реално време и с висока резолюция - на "древни" процесори от поколение i386, i486.

Различните методи за изграждане на изображение могат да се различават по скоростта на работа, както и по качеството, реализма или красотата на изграденото изображение. Естествено, методите, които ви позволяват да нарисувате по-реалистично изображение, също изискват повече компютърни ресурси. Ние, разбира се, не обмисляме умишлено лоши методи, които работят бавно и рисуват лошо. В зората на развитието на индустрията за компютърни игри, когато персоналните компютри бяха с относително ниска мощност, естествено беше избран най-бързият и най-малко взискателен метод за рендиране, гореспоменатия метод на Z-буфер.

Триизмерната сцена обаче се състои не само от геометрични детайли, тя е немислима без светлина, тъй като иначе просто не бихме я виждали. А методът Z-buffer ви позволява да начертаете само геометрията на сцената. Какво да правя? Точният физически модел на разпространение на светлината е много сложен; можем да говорим за някои приближения на естествената светлина. Изисква се да е тъмно на сенчести места, където не достигат директни светлинни лъчи, и светло в близост до източници на светлина. За да създадат реалистични, по отношение на осветлението, сценични изображения, те започнаха да използват предварително изчислени текстури, така наречената светлинна карта, съдържаща стойностите на осветлението на статични обекти в сцената. Тази текстура се прилага на място с обичайната текстура на материала и го потъмнява в зависимост от позицията на обекта на сцената и неговата осветеност. Естествено, това изисква пълна статичност на сцената и източниците на светлина, тъй като изчисляването на тези светлинни карти отнема изключително много време. Тази технология се използва в компютърните игри от много години и нейното използване доведе до факта, че 3D игрите по отношение на графичния двигател започнаха да се различават само по броя на триъгълниците и текстурите на ниво. Точно както нямаше динамични източници на светлина и възможност за унищожаване на нивото, няма, тъй като няма динамично изчисляване на осветеност и засенчване. Ако преместите лампа или затворите прозорец, никой няма да промени осветеността на сцената, така че това не е опция в игрите. Има само така наречените фалшиви решения, когато нещо може да се направи на определено място, защото тази възможност е предварително предвидена и всичко е предварително изчислено.

Едва наскоро започнаха да се появяват сенки от динамични модели, всякакви чудовища и ботове. Ще засегнем и темата как се изчисляват тези сенки, но често те не изглеждат естествени, защото например има много източници на светлина, но сянката идва само от един, тя е остра и не е красива.
Напредъкът на игралната графика се свързва от много години изключително с появата на нови поколения графични ускорители. Наистина се оказа много удобно работата по рисуване на триъгълници да се прехвърли на ускорителя. Задачата за растеризиране и текстуриране на триъгълник е в основата на графиката на играта, така че е естествено тази много конкретна и специфична операция да бъде драстично ускорена чрез създаването на специално оптимизиран хардуер. Въпреки това, използването на ускорители доведе само до подобрено качество на изображението, висококачествени режими на наслагване на текстури, три линейни и анизотропни филтри, възможност за използване на високи разделителни способности и антиалиасинг на изображението на цял екран. По отношение на изчисляването на осветеността и динамиката на сцената все още нищо не се е променило. Липсата на динамично осветление прави съвременните нива на играта скучни. Статичното осветление и сцена могат постепенно да станат скучни. Сякаш времето е спряло и играчите тичат наоколо в това спряло време. В днешно време, когато изследват възможностите на новите ускорители, те обичат да гледат екрана под лупа, търсейки следващото леко увеличение на качеството на изображението, което е изключително трудно да се различи в игра.

Метод за проследяване на лъчи


Чудя се какъв метод се използва за изчисляване на реалистично осветление при изобразяване на реалистични сцени, карикатури, анимирани сцени, какъв принцип е в основата на изграждането на същите светлинни карти? В тази област методът за проследяване на лъчите и неговите модификации са широко разпространени.

Ревютата на процесори често споменават резултати от тестове в пакети с 3D графика като 3DMax, LightWave и други. Измерва се времето, необходимо за изобразяване на сложна сцена с реалистично осветление, отражение и пречупване на светлината. Това е точно сцената, която се рисува с помощта на метода за проследяване на лъчи.

За разлика от метода Z-буфер, методът за проследяване на лъчи първоначално е предназначен за изграждане на реалистично изображение със сложен модел на осветление. Принципът на обратното проследяване на лъчи е, че обратен светлинен лъч се изтегля през всяка точка на екрана, докато се пресече с най-близкия обект в сцената, след което се изтегля лъч от тази точка по посока на източника на светлина, като по този начин се симулира разпространението на светлината. Ако лъч, насочен към източник на светлина, не пресича нищо по пътя си, тогава тази точка е осветена, в противен случай тя лежи в сянка. Ако лъч удари огледална повърхност, тогава, в съответствие със законите на оптиката, се освобождава отразен лъч, което прави възможно конструирането на отражение. В зависимост от свойствата на средата, през която преминава лъчът, той може да бъде пречупен, което прави възможно симулирането на сложни, реалистични светлинни ефекти. Този метод ви позволява да получите не само сенки от обекти, но и да изчислите вторичното осветление, когато отразената слаба светлина удари директно сенчести зони и замъгли сенките.

Въпреки това е лесно да се разбере, че този метод е изключително сложен от изчислителна гледна точка. Можете да обърнете внимание в процесорните тестове в програмите за 3D моделиране колко дълго се счита дори 1 кадър. Нито един реално времетук няма миризма. Освен това, преди това работеше дори по-бавно на персонални компютри, което не оставяше място за използването му в компютърни игри.
Но през последните няколко години мощността на персоналните компютри се увеличи значително и направи възможно прилагането на проследяване на лъчи в почти реално време, макар и с големи ограничения в качеството и разделителната способност на изображението.

Тъй като за всяка точка на екрана е необходимо да се извърши много сложна процедура за проследяване на лъчи, скоростта на проследяване зависи много от разделителната способност на екрана и неговата площ. Тоест изобразяването на изображение с размери 1024x768 ще отнеме 10 пъти повече време от изобразяването на изображение с размери 320x240. Възможно е прилагането на метода за проследяване на лъчи в реално време, единственият въпрос е в каква резолюция и с какво качество на изображението.


Доскоро проследяването на лъчи в реално време на компютъра беше област на малки демонстрационни програми, които рисуват красиви изображения, но работят с ниска скорост и с ниски разделителни способности. На www.scene.org има много такива програми. Въпреки това успях, временно жертвайки много от предимствата на метода за проследяване на лъчи, да създам пълноценен 3D двигател и, въз основа на него, първата компютърна игра, използваща проследяване на лъчи в реално време.

Концептуална игра с 3D двигател, базиран на обратно проследяване на лъчи

На различни автомобилни изложения се демонстрират така наречените концептуални автомобили, реални прототипи на бъдещи производствени автомобили. Те са изключително скъпи, не са отстранени грешки от потребителска гледна точка, но представляват нови идеи. Създадох концептуална игра. Какво успяхте да внедрите, което да работи в реално време на съвременните персонални компютри?
За двигателя за проследяване на лъчи първоначално бяха зададени две основни изисквания: цялата осветеност на сцената да се изчислява в реално време и да не се използва информация за предварително изчислено ниво. Всичко това трябва да ви позволи произволно да променяте динамично нивото. Нещо, което съвременните двигатели не могат да осигурят.
В съчетание с динамичното изчисляване на осветлението, липсата на предварителна информация прави доста лесно рисуването на безкрайни светове, тъй като трябва да съхранявате само не много обемна информация за геометрията на нивото.

Спазването на тези строги изисквания към съвременните процесори наложи въвеждането на други сериозни ограничения, за щастие, не фундаментални. Въпреки това, с нарастването на наличната изчислителна мощност, тези ограничения ще бъдат премахнати, но същността ще остане.
На първо място, изоставих моделирането на земната реалност в полза на извънземни светове. Това направи възможно да се изостави използването на триъгълник, който не е много удобен за проследяване на лъчи, като основен примитивен за конструиране на сцена. Извънземният свят не трябва да е ъглов, нека бъде кръгъл. Като примитив за изграждане на сцената е избрана сфера. Тъй като съвременните игри трябва да работят с високи разделителни способности, като 1024x768, трябваше да се откажем от изчисляването на отраженията и пречупванията, тъй като това направи много трудно обработването на лъча, съответстващ на точката на екрана. Но с увеличаване на изчислителната мощност ще бъде възможно да се разшири както наборът от примитиви, така и дълбочината на проследяване на лъчите, тоест да се добавят отражения, пречупвания и т.н.

И така, какви са основните характеристики на VirtualRay - 3D двигател, изграден върху метода за проследяване на лъчи? На най-модерните процесори за персонални компютри работи с повече или по-малко приемлива скорост в резолюция 1024x768x32. Ще приемем, че това е използваната разделителна способност, тъй като ако използвате по-ниска разделителна способност, параметрите на производителността може да са различни.

Рендиране на сцени, състоящи се от може би хиляди пресичащи се сфери. В действителност сцената може да бъде безкрайна, което означава само видимата област.

Изчисляване кадър по кадър на цялото осветление и засенчване. Всички източници на светлина са динамични (дори статични), защото те всъщност са динамични, просто не променят позицията си от кадър на кадър.

Попикселно изчисление на осветеността и попикселно наслагване на сенки, естествено динамично.

Изобразяване на меки сенки въз основа на физическо приближение на обемни източници на светлина. Тоест границата на сянката не е рязка, а много замъглена, степента на размазване може да се регулира. Вярно, това не са съвсем реални, физически надеждни меки сенки, а приблизителни.

До 8 източника на светлина могат да осветяват една сфера, съответно една сфера може да хвърля до 8 сенки. Това не е основно ограничение, просто когато има много източници на светлина в една област, всичко, разбира се, се забавя много.

Поддържа точкови източници на светлина и безкрайно далечни източници на светлина като слънцето. По правило сцената се осветява от един „слънчев“ източник на светлина и няколко локални.

Напълно динамична сцена, тоест позицията на обектите може да се променя по всякакъв начин.

Картографиране на текстури и билинейно филтриране.

Ограничено използване на прозрачни сфери с динамична непрозрачност.

Не толкова фино изображение на повърхността на планетата като една голяма сфера, създаваща ефект на хоризонта, където далечни обекти са скрити зад линията на хоризонта.

Местните недостатъци на двигателя включват, на първо място, факта, че той е оскъден с „евтини“ ефекти, като светкавици на спрайтове и т.н., които съвременните видео ускорители правят толкова добре.
Какъв вид игра беше възможно да се създаде с помощта на VirtualRay двигателя? Като цяло можете да правите голямо разнообразие от игри на него, от космически симулатор до мултиплейър онлайн вселена. Между другото, в последния тип предимствата на двигателя при прилагането на динамични промени на сцената са особено очевидни. Като „концептуална игра“ създадох проект, наречен AntiPlanet – прост 3D шутър с обикновени чудовища с поведение, подобно на Doom. Нивата за играта са различни размерипарчета извънземен терен, осветени от местни слънца. Между другото, Слънцето се движи по небето в съответствие с което се променя осветлението и засенчването на сцената. Общо има 5 налични нива в текущата версия на играта, едно от които е на закрито, лабиринт от пещери. Останалите са предимно отворени. Двигателят е достатъчно гъвкав, за да рисува както отворени, така и затворени сцени без специални оптимизации.

Има 5 вида чудовища, които ловуват за играча, като чудовищата се различават по вида на използваното оръжие, скоростта и силата. Между другото, играчът има на разположение десет вида оръжия, изстрелвайки различни снаряди, ракети и бомби. Сферичният характер на оръжието го прави донякъде монотонен, но снарядите експлодират в купчина фрагменти, когато експлодират. Има 3 основни типа игри - просто лов на чудовища, когато играчът трябва да унищожи определен брой чудовища за определено време. Вторият тип игра се състои в намиране на специални артефакти, скрити в нивото. И в третия случай играчът просто трябва да оцелее за определено време на непозната планета. Когато избирате игра, можете да зададете броя на комплектите за първа помощ, оръжията и чудовищата в нивото; те ще бъдат поставени на произволни места. Разбира се, ако зададете много голям брой чудовища, играта ще върви бавно.

За съжаление, играта не разкрива пълния потенциал на двигателя, тъй като моделистът и аз просто нямахме време да го направим. Например, няма унищожаване на нивото, само отделни динамични части, тъй като тогава глупавите чудовища няма да намерят пътя, от друга страна, това не е предвидено от идеите на играта. Възможностите на двигателя по отношение на анимацията на модела не са напълно реализирани. Двигателят позволява произволни независими промени в моделите на всеки кадър, което прави възможно реализирането на най-сложната анимация.
Реших да не предоставям екранни снимки от играта, тъй като те изобщо не предават предимствата на двигателя, като динамично осветление и меки сенки. Изтеглете демо версията, отнема само няколко мегабайта. Така че представете си сюрреалистичен извънземен терен, състоящ се от огромен брой топки, чудовища от малки сфери, които при експлозия се разпръскват на малки парчета. Можете да изтеглите текущата демо версия от тази връзка.

Играта изисква Windows95 и по-нова версия, за предпочитане повече от 128 мегабайта памет, в противен случай деактивирайте музиката, DirectX, видеокарта с поддръжка на 32-битов цвят и, най-важното, по-мощен процесор. Например процесор Intel Pentium 4 с поддръжка на технологията Hyper-Threading или новия AthlonXP. Играта трябва да работи на всеки процесор с MMX технология, но за пълна функционалност се нуждаете от поддръжка на SSE, тоест процесор, започващ от Pentium-III. Не е необходим видеоускорител. Между другото, двигателят поддържа многопроцесорна обработка, включително технологията Hyper-Threading. Не всички програми използват множество нишки за успешно използване на Hyper-Threading, но основният цикъл за проследяване на лъчи е паралелен и се постига печалба от няколко десетки процента. А при многопроцесорна система печалбата е пропорционална на броя на процесорите.

Разработка на двигателя VirtualRay

В момента двигателят ви позволява да показвате фантастични сцени. Но използването на сфери като примитиви не е фундаментално ограничение в момента, използването на по-сложни примитиви е проблематично от гледна точка на скоростта. С увеличаването на производителността можете да приложите обработка на елипси вместо сфери, което ще обогати вашите сцени.

И сега можем да приложим обработка на триъгълници заедно със сфери. Но за да покажете нещо смислено с помощта на триъгълници, имате нужда от много от тях и те се обработват със скоростта на сфери. Лесно е да се разшири разнообразието от примитиви чрез въвеждане на назъбени сфери, сферични сегменти и сферични триъгълници. Но това също ще се отрази негативно на скоростта.
Яжте различни методиподобряване на ефективността на проследяване на лъчи за сметка на влошаване на качеството на изображението. Трасират се не всички лъчи, а само най-важните, като се използва интерполация за изграждане на липсващата част от изображението. Този подход обаче не е приложим за всички сцени; понякога може да даде повече или по-малко качествени резултати, а понякога може сериозно да развали изображението.

Между другото, относно качеството. Тук има много място за подобрение. Факт е, че процедурата за текстуриране се извършва само веднъж на точка и не отнема много време. В момента около 10% от времето за рендиране се изразходва за текстуриране. Така че, за да се подобри качеството на текстурирането, се планира да се приложи трилинейно филтриране на пиксел, което не трябва да намалява значително скоростта.

Проследяване на лъчи и модерни 3D ускорители

Напоследък индустрията на 3D ускорителите прави преход към широкото използване на така наречените пикселни и върхови шейдъри. Когато растеризира триъгълник, за всеки фрагмент от изображението ускорителят изпълнява предварително зададена програма, която променя цвета на фрагмента по сложен начин. Може да направи много повече, например да напише някои междинни изчисления в текстури, които след това ще бъдат прочетени и използвани, когато рисувате нещо друго. Типичен пример за модерен пикселен шейдър или фрагментен шейдър, както още се нарича, е шейдър, който изчислява осветеността на дадена точка от триъгълник. Тя е структурирана по следния начин: взема се вектор - глобалната позиция на източника, взема се текущата координата на точката на триъгълника в триизмерното пространство, която се изчислява в ускорителния чип при растеризиране на триъгълника и нормалата към триъгълник в тази точка. След това се изчислява векторът от тази точка по посока на източника на светлина и в зависимост от ъгъла, който образува с нормалния перпендикулярен вектор, се изчислява осветеността. Колкото по-голям е ъгълът, под който пада светлината, толкова по-малко интензивен е той.
Както виждаме, един модерен шейдър може да бъде смислена програма за геометрия. Вече е обичайно да се тестват нови ускорители чрез измерване на скоростта на изпълнение на такива и по-сложни шейдъри. Производителността е много висока. Шейдърът, който изпълнява осветяване на пиксел, работи с резолюция 1024x768 при 100-200 кадъра в секунда на най-новите ускорители, като Radeon9700 или GeForceFX. Това се отнася само за времето на работа на самия шейдър. В тази връзка идеята отдавна е да се използва такава значителна изчислителна мощност за голямо разнообразие от цели, дори далеч от 3D графики. И, наред с други неща, опитайте да използвате метода за проследяване на лъчи, за да го приложите.

Въпреки това, ако разгледаме тази мощност от гледна точка на броя скаларни и векторни изчисления с плаваща запетая за единица време, тя се оказва сравнима с изчислителната мощност на съвременните процесори. Да вземем днешния най-нов ускорител GeForceFX5900Ultra, той има честота от 450MHz, 4 пикселни процесора, всеки от които може да извърши 1 векторна операция на часовников цикъл. Всъщност може да има повече операции на часовников цикъл, но ние се интересуваме само от изчисления с пълна точност float32, тъй като изчисленията с по-ниска точност имат смисъл главно за изчисляване на цвят, чийто обхват все още е ограничен от не много голяма разделителна способност на цветовете на монитора. А за геометричните изчисления се изисква добра точност. Това се получава като 450Mx4=1800 милиона векторни операции в секунда като груба оценка на производителността. Ако вземем Pentium 4, тогава с помощта на SSE можем да постигнем една векторна операция за един и половина тактови цикъла, тоест при честота от 2700 MHz получаваме същите 1800 милиона векторни операции в секунда. И в двата случая той естествено има предвид пикова производителност, когато целият код се състои от изчисления.
Ясно е, че VPU няма превъзходство в изчислителната мощност. Неговото предимство в графиките се крие във възможността, успоредно с изчисленията на шейдъра, да извършва съпътстващите изчисления, необходими за растеризиране на триъгълник. Изчислете по някакъв начин стойността на буфера за дълбочина, интерполирайте стойностите, зададени във върховете по протежение на повърхността на триъгълника, и вземете проби и филтрирайте текстури в един тактов цикъл. Всичко това се осъществява от различни паралелно работещи видео ускорителни блокове.

Така че, естествено, няма да получим никакво специално предимство при прилагането на проследяване на лъчи от използването на видео ускорител, тъй като ускорителят е напълно оптимизиран и изграден от гледна точка на оптимизиране на рисуването на триъгълници.
Що се отнася до оптимизирането на проследяването на лъчи с помощта на видео ускорител, има друга идея: начертайте цялата геометрия на VPU и извършете изчислението на осветлението, като използвате метода за проследяване на лъчи, като използвате CPU, и след това комбинирайте резултата. Но това няма да е от голяма полза, тъй като основните изчислителни трудности възникват именно при изчисляването на осветлението. Освен това, колкото по-сложна е сцената и съответно колкото по-голяма е ползата от използването на VPU, толкова повече ресурси ще са необходими за изчисляване на осветлението на сложна сцена и изчертаването на сцената ще отнеме значително по-малко време спрямо времето за изчисляване осветлението.

Изчисляване на осветление с помощта на съвременни ускорители

Добре, как се предлага да се изчисли засенчването на сцената в нови игри с динамични източници на светлина, като Doom III? Сега завинаги ли сме обречени да виждаме предварително изчислено статично осветление в компютърните игри? Не, отдавна са известни интересни методи за изчисляване на сенки, като се използва стандартният метод за рисуване на текстурирани триъгълници с помощта на z-буфер. Те са известни отдавна, но са толкова взискателни към изчислителните ресурси, че използването им в компютърни игри, макар и ограничено, стана възможно едва наскоро с появата на ново поколение видео ускорители.

Нека първо да разгледаме метода, по който се рисуват динамичните сенки в гореспоменатата игра Doom III. Игра, която много геймъри очакват с нетърпение. Този метод се нарича метод Shadow Volumes или метод за рисуване на сенки с помощта на шаблонен буфер. Ето основна диаграма за това как работи: първо се рисува неосветена сцена, след което за всеки обект в сцената, хвърлящ сянка, се конструира неговият обем на сянка. Обемът на сянка е фигура, която ограничава областта на сянка, тази област от пространството, в която не попада светлина, която е засенчена от даден обект. Изглежда, че си представяме чернотата, която се простира зад обекта под формата на тяло. Обемът на сянката може дори да се види в действителност, ако осветите с рязка светлина стая, в която летят прахови частици. Незасенчените частици ще светят, докато засенчените частици ще образуват черна зона зад обекта, блокираща светлината. Следващата стъпка е да нарисувате триъгълниците, които съставят границата на този обем на сенките. Чрез сравняване на стойността на буфера за дълбочина с дълбочината на предната и задната стена на обема на сенките се определя дали дадена точка лежи в обема на сенките и по този начин е засенчена или не. При сравняване на дълбочината на стените на обема на сенките и дълбочината на изображението се използва стенсил буфер - масив от стойности, съответстващи на пикселите на екрана. Той съхранява междинни резултати от сравняване на дълбочината на стените на обема на сенките с дълбочината на изображението. Този метод е „добър“ с това, че използва пълноценно скоростта на запълване на ускорителя, тъй като обемите на сенките, като правило, имат по-голяма площ на екрана от обекта, който хвърля сянката. Методът беше достъпен за прилагане на ускорители Riva TNT2, но е толкова взискателен, че използването му стана възможно едва наскоро.

От друга страна, конструирането на оптимални обеми на сенки за сложни неизпъкнали обекти е изчислително предизвикателна задача. Едно просто решение ще доведе до появата на голям брой допълнителни стени на обема на сенките, чието изобразяване ще изисква допълнителни ресурси. Времето за намиране на ефективния обем нараства много бързо със степента на детайлност на модела. Може би затова моделите на чудовища в NewDoom са по-малко детайлни от очакваното.
Но това не са всички недостатъци. За много малки обекти площта на стените на обема на сенките може да достигне гигантски размер. Например, на гребен. Сянката му не е голяма, но много криволичеща. Освен това методът не е много съвместим с прозрачни повърхности. Например, ако прозрачна повърхност попадне в обема на сенките, тогава обектът зад нея не оставя своята информация в буфера за дълбочина, тъй като тази информация се губи от дълбочината на прозрачната повърхност. И е невъзможно да се определи дали даден обект лежи в обема на сенките. Всички случаи от този вид ще трябва да се обработват отделно, което ще доведе до увеличаване на броя на преминаванията на рендиране.

Този метод е труден за усъвършенстване за създаване на размазани сенки. Тези, които са гледали предварителната версия на Doom III, може би са забелязали остротата на сенките. И всъщност този метод е подходящ само за рисуване на сенки, вторичното осветление не може да се изчисли с негова помощ, както и пречупването и отражението на светлината. Сенчестият конус на обекта просто се начертава на челото и това е всичко.

Друг популярен начин за изобразяване на динамични сенки в съвременните игри е използването на проективно картографиране на текстури. Съвременните ускорители са се научили да проектират текстура върху обект, точно както шрайбпроектор проектира слайд върху екран. Просто, когато чертаете обект, той изчислява коя текстурна точка се проектира към дадена точка на обекта. Сега можете, гледайки източника на светлина, да нарисувате обект в черно в текстурата, ще получите силует на сянка. Това е същото като сянката на обект върху вертикална бяла стена. И тази текстура със сянка се нарича маска на сянка, тя може да се проектира върху сенчестите обекти.

Именно този метод се използва в новите игри за изобразяване на сенки от динамични обекти, чудовища и коли. С него можете да рисувате размазани сенки; за това оригиналната текстура със сянката се замъглява, превръщайки се от черно-бяло в бяло и сиво.

Дори не знам кой от описаните по-горе методи е по-взискателен към скоростта на запълване на ускорителя. Факт е, че за да се получи добро качество на сенките, текстурата на сенките трябва да бъде с много висока разделителна способност. В новите игри, като Splinter Cell, се използват текстури от няколко хиляди пиксела. Причината е, че при прожектиране най-малките детайли се увеличават многократно. Пикселите, съставляващи изображението, стават видими. Следователно този метод може да се използва само за хвърляне на сенки върху близки обекти. Вторият недостатък на този метод е невъзможността за самозасенчване на обекта; необходимо е точно да изберете обекта, който хвърля сянка, и неговите части няма да хвърлят сянка една върху друга. Освен това, разбира се, този метод не предполага никакви обобщения за изчисляване на вторичното осветление, отраженията и пречупването на светлината.

И накрая, нека да разгледаме кой според мен е най-обещаващият метод за конструиране на сенки за използване в съвременните игри. Той е развитие на предишния проективен метод. Само вместо силуета на обекта, разстоянието от точките на обекта до източника на светлина се записва в текстурата на сянка. След това, когато се проектира текстура на сянка, тази информация се използва, за да се определи дали точката на потенциално засенчен обект се намира по-далеч или по-близо до източника на светлина, отколкото сянката. Предимството на този метод е правилното самозасенчване на обекта. И неговите недостатъци са подобни на предишния метод. Този метод за създаване на динамични сенки не е популярен сред разработчиците на игри. „Грешката“ на метода е, че изисква специфични възможности на видеокартата, които за първи път се появиха в GeForce3 – GeForce4, но бяха премахнати от Geforce4MX – съкратена версия на GeForce4. Методът не може да бъде приложен без хардуерна поддръжка, така че трябва да използвате метод, който е приложим за всички популярни видеокарти.

Предимството на всички горепосочени методи е добрата съвместимост със съществуващия хардуер. За тях всъщност не е необходимо нищо освен fillrate и прости операции. В резултат на това можем да заключим, че видеоускорителите все още са далеч от изчисляването на осветлението на сцената в реално време. И не се очаква нищо революционно. Появиха се сенки от някои динамични обекти, ограничена динамична светлина в новия Doom III, тези технологии ще бъдат усвоени за дълъг период от време.

Разработка на ускорители от гледна точка на проследяване на лъчи

Както вече споменах, съвременните ускорители стават все по-програмируеми и мощността им непрекъснато нараства. Производителите на графични карти дори използват термина "визуален процесор" за обозначаване на нови продукти. Наистина, по своите възможности ускорителите все повече напомнят на конвенционалните процесори за персонални компютри. Именно с увеличаване на степента на програмируемост на VPU се възлагат надежди на внедряването на интелигентни методи за изобразяване, като например метода за проследяване на лъчи. За да може ускорителя да се препрограмира по подходящ начин.

Нека да оценим перспективите за развитие на ускорителите в тази посока. Сега най-новите ускорители работят на честоти от около 500MHz, като процесорите от преди пет години и имат 4-8 паралелни работещи конвейера. В днешно време повечето векторни операции на шейдъра, добавяне, скаларно произведение, се изпълняват на тактов цикъл. Много спомагателни операции, като например интерполиране на стойности върху повърхността на триъгълник, също се извършват на тактов цикъл. Изчисляване тригонометрични функции, като sin и cos, въпреки че са приблизителни, също се изпълняват на такт. Това използва селекции от таблици с предварително изчислени стойности, но въпреки това производителността е невероятна. Освен това е странно, че съвременните процесори за персонални компютри не могат да направят нищо подобно. Напротив, тенденцията е да се отървете от сложните команди и да ги замените с няколко прости. Тези мерки са необходими, за да може да се увеличи честотата. Без да влизам технически подробности, можем да кажем, че цикълът на процесора, който намалява все повече и повече с увеличаване на честотата, изисква повече кратки команди. Сложните инструкции все още са разделени на микрооперации в съвременните процесори. Това разделяне също е отделен проблем; цели процесорни блокове се справят с него.

Какво ще кажете за видео ускорителите? Вероятно за увеличаване на честотата архитектурата на съвременните VPU ще трябва да бъде сериозно преработена. Но това не е толкова лошо. Истинската програмируемост изисква процесорът да изпълнява разклонения, тоест команди за контрол на изпълнението на програмата. И това винаги е най-големият проблем. Как съвременните процесори страдат от непредвидими условни разклонения в програмите? Тук вертексните шейдъри в GeForceFX получиха условни команди за разклоняване, можете да видите последните тестове, за да видите колко е спаднала производителността. И това е при относително ниска честота под 500MHz. И тъй като честотата се увеличава, загубите от условни преходи само ще се увеличат, а самото им изпълнение става по-трудно. Между другото, фантастичната производителност на ускорителите се постига при извършване на така наречените поточни операции, когато данните текат в непрекъсната лента и се обработват строго определена схема, без произволни условни скокове и т.н. Всички тези факти показват, че не можем да очакваме увеличение на честотата на видео ускорителите в близко бъдеще.

Важен параметър на видеокартата е броят на пикселните процесори. Те рисуват пиксели паралелно, така че колкото повече от тях, толкова по-добре. На най-новите Radeons вече има осем от тях. От новите ускорители се очакват все повече фрагментни процесори. Но не е толкова просто. Факт е, че когато размерът на триъгълника е сравним с броя на пикселните конвейери, те не могат да работят заедно. В малкия триъгълник няма достатъчно място за тях. Това е и причината, поради която производителите на видео ускорители толкова обичат режимите за анти-алиасинг, които изобразяват цялата сцена с двойна резолюция. Тогава малките триъгълници стават по-големи. Наистина, ако сцена от големи триъгълници се раздели на по-малки, без да се променя формата, тогава производителността на пикселните шейдъри значително ще намалее, въпреки че цялата зонатриъгълниците ще останат същите.

Разработването на модерни графични ускорители на игри вече е изпълнено с големи трудности и се постига почти изключително чрез подобрения технологичен процеспроизводство на видео чипове. Всички NVIDIA и ATI мислят как ефективно да правят прости динамични сенки. Няма добро решение - нямат време за трасиране на лъчи.

Специализиран ускорител за проследяване на лъчи

Ако модерните VPU за игри първоначално са били проектирани да ускорят стандартния алгоритъм за рисуване на триъгълник и не са много подходящи за прилагане на проследяване на лъчи, тогава може би има смисъл първоначално да се изгради ускорител за прилагане на проследяване на лъчи? Уви, ускоряването на трасирането на лъчи е неблагодарна задача.


Алгоритъмът за проследяване на лъчи е толкова сложен, че ускорителят за проследяване на лъчи е почти универсален процесор. Алгоритмите за поточно предаване без произволни разклонения се поддават добре на хардуерно ускорение, но проследяването на лъчи е напълно различно. Тоест, създаването на ускорител за проследяване на лъчи е същото като създаването на истински процесор.


Но трасирането на лъчи има още едно предимство - добре е паралелизирано. Всеки лъч може да бъде изчислен независимо, което позволява ефективно внедряване на алгоритъма на многопроцесорни системи. Като евтин ускорител за проследяване на лъчи можете да обмислите познайте какво? Система с четири Celerons с честота от 3 гигахерца или повече или четири AthlonXP с намален кеш. Алгоритъмът за проследяване на лъчи, ако е правилно оптимизиран, не изисква голям размер на кеша, така че ще бъде евтин и многофункционален. Комбинираната изчислителна мощност далеч ще надхвърли настоящата настолни компютри. Но това няма да се случи, тъй като многопроцесорните системи са предназначени за друг пазар, а не за домашни системи.

Заключение

Въз основа на всичко казано по-горе можем да заключим, че реалистичната визуализация на сцени в реално време на персонални компютри е много трудна и много проблеми са от фундаментално естество. Трябва да мине достатъчно време компютърната графика на игрите да достигне качествено ново ниво. И какви методи ще се използват за визуализация в бъдещите графични приложения сега е много трудно да се каже.

Връзки


http://www.art-render.com/

Уебсайт за производители на "ускорители за проследяване на лъчи" за оптимизиране на изобразяването в 3DMax и други графични редактори. Ускорителят е набор от няколко, от 8 процесора, оптимизирани за проследяване на лъчи. Те могат да извършат типична операция за проследяване - намиране на пресечната точка на лъч с триъгълник - за един часовников цикъл. Но, очевидно, те работят на не много висока честота. Ускорението се постига чрез паралелна работа. Сега е трудно да намеря цени в сайта, но съм ги виждал и преди и не са никак малки.


http://www.acm.org/tog/resources/RTNews/html

Обширен списък с различни ресурси по темата за проследяване на лъчи.


http://www.realstorm.com/

Двигател, базиран на проследяване на лъчи. Позволява ви да рисувате в реално време голям брой типични ефекти за проследяване, отражение и пречупване на светлина, например. Но работи в малки разделителни способности и използва приближение. На двигателя е изградена игра симулатор на боулинг.


http://www.kge.msu.ru/workgroups/compcenter/dmitri/projects/sphericworld/index.htm

http://www.kge.msu.ru/workgroups/compcenter/dmitri/projects/polyworld/index.htm

Друг проект, посветен на метода за проследяване на лъчи. Внедрено е сферично и многоъгълно проследяване на лъчи, което изгражда много висококачествени реалистични изображения, но бавно във високи резолюции.


http://www.virtualray.ru/

Това всъщност е сайт, посветен на темата на статията - VirtualRay engine и играта AntiPlanet - първият 3D шутър, базиран на ray trace engine.

Метод за обратно проследяване

Метод обратно проследяване лъчи ви позволява значително да намалите прекомерното убиване на светлинните лъчи. Методът е разработен през 80-те години, разглеждат се фундаменталните трудове WhittedИ Кая.Според този метод лъчите се проследяват не от източници на светлина, а в обратната посока - точката на наблюдение. По този начин се вземат предвид само онези лъчи, които допринасят за формирането на изображението.

Нека да разгледаме как можете да получите растерно изображение на някаква триизмерна сцена, като използвате метода за обратно проследяване. Да приемем, че проекционната равнина е разделена на много квадрати - пиксели. Нека изберем централна проекция с изчезващ център на определено разстояние от проекционната равнина. Нека начертаем права линия от изчезващия център през средата на квадрата (пиксела) на проекционната равнина. Това ще бъде основният лъч за обратно проследяване. Ако правата линия на този лъч удари един или повече обекти в сцената, изберете най-близката пресечна точка. За да определите цвета на пиксела на изображението, трябва да вземете предвид свойствата на обекта, както и какво светлинно лъчение пада върху съответната точка на обекта.

Ако обектът е огледален (поне частично), тогава конструираме вторичен лъч - падащия лъч, като считаме предишния, първичен проследен лъч за отражателен лъч. По-горе разгледахме огледалното отражение и получихме формули за вектора на отразения лъч въз основа на дадените вектори на нормален и падащ лъч. Но тук знаем вектора на отразения лъч, но как можем да намерим вектора на падащия лъч? Можете да използвате същата формула за това огледално отражение, но определяне на търсения вектор на падащия лъч като отразен лъч. Тоест обратното отражение i.

За идеално огледало тогава е достатъчно да се проследи само следващата точка на пресичане на вторичния лъч с някакъв обект. Несъвършеното огледало значително усложнява проследяването - трябва да проследите не един, а много падащи лъчи и да вземете предвид приноса на радиация от други обекти, видими от дадена точка.

Ако обектът е прозрачен, тогава е необходимо да се конструира нов лъч, който при пречупване да произведе предишния проследен лъч. Тук можете да се възползвате и от обратимостта, което важи и за рефракцията.

Ако даден обект има свойствата на дифузно отражение и пречупване, тогава в общия случай, както при неидеалното огледало, е необходимо да се проследят лъчите, идващи от всички съществуващи обекти. За дифузно отражение е известно, че интензитетът на отразената светлина е пропорционален на косинуса на ъгъла между вектора на лъча от източника на светлина и нормалата. Тук източникът на светлина може да бъде всеки обект, видим от дадена точка, който може да предава светлинна енергия.

Когато се окаже; че текущият лъч за обратно проследяване не пресича нито един обект, а влиза в свободно пространство, тогава трасирането за този лъч приключва.

Ориз. 14.1 Пример за обратно проследяване на лъчи.

Обратното проследяване на лъчи във формата, в която го разгледахме тук, въпреки че намалява търсенето, не ни позволява да се отървем от безкрайността на броя на анализираните лъчи. Наистина, този методви позволява незабавно да получите един първичен лъч за обратно проследяване за всяка точка на изображението. Въпреки това вече може да има безкраен брой вторични отразяващи лъчи. Така например, ако даден обект може да отразява светлина от всеки друг обект и дали тези други обекти имат достатъчно големи размери, тогава кои точно точки на излъчващи обекти трябва да се вземат предвид, за да се конструират съответните лъчи, например с дифузно отражение? Очевидно всички точки.

Как работи методът за проследяване на лъчи:

1. Въображаем лъч се излъчва от окото на наблюдателя през определен пиксел на екрана и неговият път се проследява, докато пресече обекта.

2. От първата пресечна точка на лъча със сферата се излъчва отразен лъч. Нека повърхността е непрозрачна. Тогава не рисуваме пречупени лъчи. Означаваме лъча на сянката от пресечната точка до източника на светлина. Тъй като този лъч не пресича друга непрозрачна повърхност, източникът на светлина пряко влияе върху интензитета на осветеност в дадена точка.

3. Оставете отразения лъч да пресече друг обект, този път полупрозрачна сфера, която отразява и пропуска светлина. Отразените и пречупените лъчи се излъчват заедно с лъч на сянка, който отива към източника на светлина. Пропуснатият лъч променя посоката си преди и след навлизане в сферата в съответствие с ефекта на пречупване.

4. Нека точката, в която лъчът пресича сферата, не е пряко осветена от източника, тъй като пътят на сенчестия лъч е блокиран от непрозрачна повърхност. Ако сцената съдържа множество източници на светлина, тогава лъчите на сенките трябва да бъдат изстреляни към всеки от тях.

5. Влиянието на всички лъчи, генерирани явно или косвено от първоначалния лъч, се сумира и резултатът определя RGB стойността на тази точка.

Техниките за проследяване на лъчи се считат за най-мощните методи за създаване на реалистични изображения днес. Универсалността на методите за проследяване до голяма степен се дължи на факта, че те се основават на прости и ясни концепции, които отразяват нашия опит за възприемане на света около нас.

Нека да разгледаме как се формира изображение. Изображението се създава от светлина, влизаща в камерата. Нека пуснем много лъчи от източниците на светлина. Нека ги наречем първични лъчи. Някои от тези лъчи ще отлетят в свободното пространство, а други ще ударят предмети. Лъчите могат да се пречупват и отразяват върху тях. В този случай част от енергията на лъча ще бъде погълната. Пречупените и отразените лъчи образуват множество вторични лъчи. Тогава тези лъчи отново ще бъдат пречупени и отразени и ще образуват ново поколение лъчи. В крайна сметка някои от лъчите ще ударят камерата и ще образуват изображение.

Има алгоритми, които работят по този алгоритъм. Но те са изключително неефективни, тъй като повечето от лъчите, излъчвани от източника, не достигат до камерата. Но приемлива картина се получава, ако проследите голям брой лъчи, което ще отнеме много време. Този алгоритъм се нарича директно проследяване на лъчи.

Методът за обратно проследяване на лъчи може значително да намали търсенето на светлинни лъчи. Този метод е разработен през 80-те години от Whitted и Kaye. При този метод лъчите се проследяват не от източници, а от камерата. Така се трасират определен брой лъчи, равен на резолюцията на изображението.

Да приемем, че имаме камера и екран, разположен на разстояние h от нея. Нека разделим екрана на квадрати. След това ще се редуваме да рисуваме лъчи от камерата към центъра на всеки квадрат (първични лъчи). Нека намерим пресечната точка на всеки такъв лъч с обекти на сцената и изберем тази, която е най-близо до камерата сред всички пресечни точки. След това, използвайки желания моделосветление, можете да получите изображение на сцената. Това е най-простият метод за проследяване на лъчи. Позволява ви само да отрежете невидимите ръбове.

Но можем да отидем и по-далеч. Ако искаме да симулираме явления като отражение и пречупване, трябва да пуснем вторични лъчи от най-близкото пресичане. Например, ако повърхността отразява светлината и е идеално плоска, тогава е необходимо да отразите първичния лъч от повърхността и да изпратите вторичен лъч в тази посока. Ако повърхността е неравна, тогава е необходимо да се изстрелят много вторични лъчи. Това не се прави в програмата, тъй като ще забави значително проследяването.

Ако обектът е прозрачен, тогава е необходимо да се конструира вторичен лъч, така че при пречупване да произвежда оригиналния лъч. Някои тела могат да имат свойството на дифузно пречупване. В този случай се образува не един, а много пречупени лъчи. Както при размисъла, пренебрегвам това.

Така първичният лъч, след като е намерил пресечна точка с обекта, обикновено се разделя на два лъча (отразен и пречупен). След това тези два лъча се разделят на още два и т.н.

Основната процедура за обратно проследяване на лъчи в моята програма е процедурата Ray. Има следната структура:

Ако генерирането на лъч е равно на максималната дълбочина на рекурсия, тогава връщаме средната яркост за всички компоненти. Ако не, тогава продължете

Определяме най-близкия триъгълник, с който се пресича лъчът.

Ако няма такъв триъгълник, върнете цвета на фона, ако има, продължете напред.

Ако повърхността, с която е намерено пресичането, е отразяваща, тогава ние образуваме отразен лъч и извикваме процедурата Ray рекурсивно с генерирането на лъч, увеличено с 1.

Ако повърхността, с която е намерено пресичане, се пречупва, тогава ние образуваме пречупен лъч и извикваме процедурата Ray рекурсивно с генерирането на лъч, увеличено с 1.

Ние определяме крайната осветеност на пиксела, като вземаме предвид местоположението на източниците, свойствата на материала, както и интензитета на отразения и пречупен лъч.

Вече обсъдих редица ограничения на метода за проследяване, когато говорихме за дифузно пречупване и неравни огледала. Нека да разгледаме някои други.

Само специални обекти - източници на светлина - могат да осветяват сцената. Те са точковидни и не могат да абсорбират, пречупват или отразяват светлината.

Свойствата на отразяващата повърхност се състоят от два компонента - дифузен и огледален.

При дифузно отражение се вземат предвид само лъчите от източници на светлина. Ако източникът осветява точка през огледало (със зайче), тогава се счита, че точката не е осветена.

Огледалността също се разделя на два компонента.

отражение - взема предвид отражението от други обекти (не източници на светлина)

specular - отчита отблясъците от източници на светлина

Проследяването не отчита зависимостите от дължината на вълната на светлината:

индекс на пречупване

коефициент на поглъщане

коефициент на отражение

Тъй като не моделирам дифузно отражение и пречупване, няма да мога да получа задно осветяване. Затова въвеждаме минимално фоново осветление. Често това просто ви позволява значително да подобрите качеството на изображението.

Алгоритъмът за проследяване ви позволява да рисувате сенки с много високо качество. Това няма да изисква голяма промяна на алгоритъма. Ще трябва да добавите нещо към него. При изчисляване на осветеността на точките е необходимо да се постави "сенчест фронт" във всеки от източниците на светлина. „Фронтът на сянката“ е лъч, който проверява дали има нещо между точката и източника. Ако между тях има непрозрачен обект, тогава точката е в сянка. Това означава, че този източник не допринася за окончателното осветяване на точката. Ако прозрачен обект лежи, тогава интензивността на източника намалява. Рисуването на сенки отнема много време. Така че в някои ситуации те са деактивирани.

Моята програма има способността да активира изглаждане на изображението. Antialiasing е това, което прави, за да определи цвета на пиксела. Пуска се не един лъч, а четири и се определя средната стойност на цвета на тези лъчи. Ако е необходимо да се намери цвета на пиксел (i,j), тогава 4 лъча се изпращат до точки от равнината на екрана с координати (i-0.25,j-0.25), (i-0.25,j+0.25), (i+0.25,j-0.25) , (i+0.25,j+0.25).

Методи за проследяване на лъчи (Рей Проследяване) Днес те се считат за най-мощните и универсални методи за създаване на реалистични изображения. Има много примери за внедряване на алгоритми за проследяване за висококачествено показване на най-сложните триизмерни сцени. Може да се отбележи, че универсалността на методите за проследяване до голяма степен се дължи на факта, че те се основават на прости и ясни концепции, които отразяват нашия опит за възприемане на света около нас.

Ориз. 8.12. Модели на отражение: a – идеално огледало, b – несъвършено огледало, c – дифузно, d – сума от дифузно и огледално, d – обратно, f – сбор от дифузно, огледално и обратно

Как виждаме заобикалящата ни действителност? Първо, трябва да решим какво изобщо можем да видим. Това се изучава в специални дисциплини и до известна степен това е философски въпрос. Но тук ще приемем, че околните обекти имат следните свойства по отношение на светлината:

    излъчвам;

    отразяват и абсорбират;

    преминават през себе си.

Ориз. 8.13. Излъчване – а – равномерно във всички посоки, б – насочено

Всяко от тези свойства може да бъде описано с определен набор от характеристики. Например, радиацията може да се характеризира с интензитет, посока, спектър. Радиацията може да идва от относително точков източник (далечна звезда) или от източник на дифузна светлина (да речем от разтопена лава, изригваща от вулканичен кратер). Радиацията може да се разпространява по сравнително тесен лъч (фокусиран лазерен лъч) или в конус (прожектор), или равномерно във всички посоки (Слънце), или нещо друго. Свойството на отражение (абсорбция) може да се опише чрез характеристиките на дифузно разсейване и огледално отражение. Прозрачността може да се опише чрез отслабване на интензитета и пречупване.

Разпределението на светлинната енергия по възможните посоки на светлинните лъчи може да се покаже с помощта на векторни диаграми, в които дължината на векторите съответства на интензитета (фиг. 8.12 - 8.14).

В предишните параграфи вече се запознахме с видовете отражение, които се споменават най-често - огледално и дифузно. По-рядко се споменава в литературата обратното огледало или анти-огледало отпоражение,при което максималният интензитет на отражение съответства на посоката към източника. Някои видове растителност на повърхността на Земята, наблюдавани от височината на оризовите полета, имат обратно огледално отражение.

Два екстремни, идеализирани случая на пречупване са показани на фиг. 8.13.

Някои реални обекти пречупват лъчите по много по-сложни начини, като например покритото с лед стъкло.

Един и същ обект от реалността може да се възприема като източник на светлина или може, когато се разглежда по различен начин, да се счита за обект, който само отразява и предава светлина. Например, купол от облачно небе в някаква триизмерна сцена може да бъде моделиран като разширен (разпределен) източник на светлина, докато в други модели същото небе действа като полупрозрачна среда, осветена от посоката на Слънцето.

Ориз. 8.14. Рефракция a – идеална, b – дифузна

Като цяло всеки обект се описва чрез някаква комбинация от горните три свойства. Като упражнение се опитайте да дадете пример за обект, който едновременно има три от тези свойства - излъчва светлина и в същото време отразява и пропуска светлина от други източници. Въображението ви вероятно ще измисли други примери, освен, да речем, нажежено стъкло.

Сега нека да разгледаме как се формира изображение на сцена, която съдържа няколко пространствени обекта. Ще приемем, че светлинните лъчи излизат от точки на повърхността (обема) на излъчваните обекти. Такива лъчи можем да наречем първични – те осветяват всичко останало.

Важен момент е предположението, че светлинен лъч в свободното пространство се разпространява по права линия (въпреки че в специални раздели на физиката се изучават и причините за възможна кривина). Но в геометрична оптикаПриема се, че светлинният лъч се разпространява по права линия, докато не срещне отразяваща повърхност или границата на пречупваща среда. Така ще повярваме.

Безброй първични лъчи излизат от източници на радиация в различни посоки (дори лазерен лъч не може да бъде идеално фокусиран - така или иначе светлината ще се разпространи не в една идеално тънка линия, а в конус, лъч от лъчи). Някои лъчи отиват в свободното пространство, а някои (има и безброй) удрят други обекти. Ако лъч удари прозрачен обект, той се пречупва и пътува по-нататък, докато част от светлинната енергия се абсорбира. По същия начин, ако на пътя на лъча се срещне огледално отразяваща повърхност, тогава тя също променя посоката и част от светлинната енергия се абсорбира. Ако обектът е огледален и в същото време прозрачен (например обикновено стъкло), тогава вече ще има два лъча - в този случай казват, че лъчът е разделен.

Можем да кажем, че в резултат на въздействието на първичните лъчи върху обектите възникват вторични лъчи. Безброй вторични лъчи отиват в свободното пространство, но някои от тях удрят други обекти. Така, отразявайки се и пречупвайки се многократно, отделните светлинни лъчи достигат до точката на наблюдение - човешкото око или оптичната система на камера. Очевидно е, че някои от първичните лъчи директно от източниците на радиация също могат да достигнат до точката на наблюдение. Така изображението на сцената се формира от определен брой светлинни лъчи.

Цветът на отделните точки на изображението се определя от спектъра и интензитета на първичните лъчи на източниците на радиация, както и от поглъщането на светлинна енергия в обекти, срещани по пътя на съответните лъчи.

Ориз. 8.15. Схема за обратно проследяване на лъчи

Директното прилагане на този модел за лъчево изображение изглежда трудно. Можете да опитате да разработите алгоритъм за конструиране на изображение, като използвате посочения метод. В такъв алгоритъм е необходимо да се осигури изброяване на всички първични лъчи и да се определи кои от тях попадат в обектите и камерата. След това итерирайте всички вторични лъчи и вземете предвид само тези, които удрят обекти и камерата. И така нататък. Този метод може да се нарече правпроследяване на лъчи. Практическата стойност на такъв метод ще бъде под въпрос. Наистина, как да вземем предвид безкрайния брой лъчи, отиващи във всички посоки? Очевидно е, че пълното търсене на безкраен брой лъчи е принципно невъзможно. Дори ако по някакъв начин намалим това до краен брой операции (например, разделим цялата сфера от направления на ъглови сектори и работим не с безкрайно тънки линии, а със сектори), основният недостатък на метода все още остава - много ненужни операции свързани с изчисляването на лъчи, които след това не се използват. Така че във всеки случай се появява в момента.

Метод обратно проследяване лъчи ви позволява значително да намалите прекомерното убиване на светлинните лъчи. Методът е разработен през 80-те години; Witte-daИ Кей. Според този метод лъчите се проследяват не от източници на светлина, а в обратна посока - от точката на наблюдение. По този начин се вземат предвид само онези лъчи, които допринасят за формирането на изображението.

Нека да разгледаме как можете да получите растерно изображение на някаква 3D сцена с помощта на обратно проследяване. Да приемем, че проекционната равнина е разделена на много квадрати - пиксели. Нека изберем централна проекция с изчезващ център на определено разстояние от проекционната равнина. Нека начертаем права линия от изчезващия център през средата на квадрата (пиксела) на проекционната равнина (фиг. 8.15). Това ще бъде основният лъч за обратно проследяване. Ако правата линия на този лъч удари един или повече обекти в сцената, изберете най-близката пресечна точка. За да определите цвета на пиксела на изображението, трябва да вземете предвид свойствата на обекта, както и какво светлинно лъчение пада върху съответната точка на обекта.

Ориз. 8.16. Обратно проследяване за обекти, които имат огледални и пречупващи свойства

Ако обектът е огледален (поне частично), тогава конструираме вторичен лъч - падащия лъч, като считаме предишния, първичен, трасиран лъч за отражателен лъч. По-горе разгледахме огледалното отражение и получихме формули за вектора на отразения лъч при векторите на нормалния и падащия лъч. Но тук знаем вектора на отразения лъч, но как можем да намерим вектора на падащия лъч? За да направите това, можете да използвате същата формула за огледално отражение, но дефинирайки необходимия вектор на падащия лъч като отразения лъч. Тоест отражението е обратното.

За идеално огледало е достатъчно след това да се проследи само следващата точка на пресичане на вторичния лъч с някакъв обект. Какво означава терминът "перфектно огледало"? Ще приемем, че такова огледало има идеално равна полирана повърхност, така че един отразен лъч съответства само на един падащ лъч. Огледалото може да бъде затъмнено, тоест да поеме част от светлинната енергия, но все пак се спазва правилото: един лъч пада, един се отразява. Можете също така да помислите за „несъвършено огледало“. Това би означавало, че повърхността е неравна. Посоката на отразения лъч ще съответства на няколко падащи лъча (или обратното, един падащ лъч генерира няколко отразени лъча), които образуват определен конус, вероятно асиметричен, с ос по линията на падащия лъч на идеално огледало. Конусът съответства на определен закон за разпределение на интензитета, най-простият от които се описва от модела Фонг - косинусът на ъгъла, повдигнат до определена степен. Несъвършеното огледало значително усложнява проследяването - трябва да проследите не един, а много падащи лъчи и да вземете предвид приноса на радиация от други обекти, видими от дадена точка.

Ако обектът е прозрачен, тогава е необходимо да се конструира нов лъч, който при пречупване да произведе предишния проследен лъч. Тук можете да се възползвате и от обратимостта, което важи и за рефракцията. За да изчислите вектора на желания лъч, можете да приложите формулите, разгледани по-горе за вектора на пречупващия лъч, като приемем, че пречупването става в обратна посока (фиг. 8.16).

Ако даден обект има свойствата на дифузно отражение и пречупване, тогава в общия случай, както при неидеалното огледало, е необходимо да се проследят лъчите, които идват от всички съществуващи обекти. За дифузно отражение е известно, че интензитетът на отразената светлина е пропорционален на косинуса на ъгъла между вектора на лъча от източника на светлина и нормалата. Тук източникът на светлина може да бъде всеки обект, видим от дадена точка, който може да предава светлинна енергия.

Ако се окаже, че текущият обратен лъч не пресича нито един обект, а е насочен в свободно пространство, тогава трасирането за този лъч приключва.

Обратно проследяване на лъчи във формата, в която го разгледахме тук, въпреки че намалява търсенето, не ни позволява да се отървем от безкрайния брой анализирани лъчи, всъщност този метод ни позволява незабавно да получим един първичен обратен лъч за всяка точка в изображението. Възможно е обаче вече да има безкраен брой вторични отразяващи лъчи. Така например, ако един обект може да отразява светлина от всеки друг обект и ако тези други обекти са доста големи, тогава кои точки от излъчващите обекти трябва да бъдат взети под внимание, за да се конструират съответните лъчи, например при дифузно отражение ? Очевидно всички точки.

При практическото прилагане на метода за обратно проследяване се въвеждат ограничения. Някои от тях са необходими, за да може да се реши принципно проблема със синтеза на изображения, а някои ограничения могат значително да подобрят производителността на проследяването. Примери за такива ограничения.

1. Сред всички видове обекти се открояват някои, които ще наречем източници светлина.Източниците на светлина могат само да излъчват светлина, но не могат да я отразяват или пречупват (ще разгледаме само точкаизточници на светлина).

2. Свойствата на отразяващите повърхности се описват от сумата от два компонента - дифузен и огледален.

3. От своя страна огледалността също се описва от два компонента. Първо (отражение) взема предвид отраженията от други обекти, които не са източници на светлина. Изгражда се само един огледално отразен лъч r за по-нататъшно проследяване ( Огледален ) означава отблясъци от източници на светлина. За да направите това, лъчите се насочват към всички източници на светлина и се определят ъглите, образувани от тези лъчи с огледално отразения обратно проследяващ лъч (r). При огледалното отражение цветът на точка върху повърхност се определя от цвета на това, което се отразява. В най-простия случай огледалото няма собствен цвят на повърхността.

4. При дифузно отражение се вземат предвид само лъчите от източници на светлина. Лъчите от огледално отразяващи повърхности се игнорират. Ако лъчът, насочен към даден източник на светлина, е блокиран от друг обект, тогава тази точка от обекта е в сянка. При дифузно отражение цветът на осветена точка върху повърхност се определя от собствения цвят на повърхността и цвета на светлинните източници.

5. За прозрачни (1gap5rage()обекти, зависимостта на индекса на пречупване от дължината на вълната обикновено не се взема предвид. Понякога прозрачността обикновено се моделира без пречупване, тоест посоката на пречупения лъч аз съвпада с посоката на падащия лъч.

    За да се вземе предвид осветяването на обекти от светлина, която се разсейва от други обекти, се въвежда фонов компонент (прибиент).

7. За да завърши трасирането, се въвежда определена ограничаваща стойност на осветеността, която вече не трябва да допринася за резултантния цвят, или броят на повторенията е ограничен.

Според Whitted моделицветът на определена точка от даден обект се определя от общия интензитет

аз() = KaIa()° С() + KdId()° С() + KsIs() + KrIr() + KtIt()

където λ е дължината на вълната,

C (λ) - зададеният първоначален цвят на точката на обекта,

K a, K d, K s, K r ​​​​и K t - коефициенти, които отчитат свойствата на конкретен обект чрез параметрите на фоново осветление, дифузно разсейване, огледало, отражение и прозрачност,

аз а - интензитет на фоновото осветление,

аз д - интензитет, взет предвид за дифузно разсейване,

аз с - интензитет, взет предвид за огледалността,

аз r - интензитет на радиацията, идваща по отразения лъч,

аз T - интензитет на излъчване, идващо по протежение на пречупения лъч.

Интензитет на фоновото осветление (1 А ) за някакъв обект обикновено е константа. Нека напишем формули за други интензитети. За дифузно отражение

аз д =

Където аз аз (λ) - интензитет на радиация аз- ро източник на светлина, θ аз- ъгълът между нормалата към повърхността на обекта и посоката към аз- vi Източник на светлина.

За огледалност:

аз д =

Където Р- показател от една до няколкостотин (според модела на Фонг), α аз- ъгълът между отразения лъч (обратно проследяване) и посоката към r"-ия източник на светлина.

Интензитетът на радиацията, преминаваща по отразения лъч ( аз r), както и по протежение на пречупен лъч ( аз T ) , умножено по коефициент, който отчита затихването на интензитета в зависимост от разстоянието, изминато от лъча. Този коефициент се записва във формата д - дКъдето д- изминато разстояние, – параметър на затихване, който отчита свойствата на средата, в която се разпространява лъчът.

За основния лъч е необходимо да зададете посоката, която съответства на избраната проекция. Ако проекцията е централна, тогава първичните лъчи се разминават от обща точка за паралелна проекция, първичните лъчи са успоредни. Лъчът може да бъде определен, например, чрез координатите на началния и крайни точкисегмент, координатата на началната точка и посоката или нещо друго. Задаването на основния лъч еднозначно определя проекцията изобразена сцена . При инверсно проследяване на лъчи никакви координатни трансформации изобщо не са необходими. Проекцията се получава автоматично - включително не само плоска, но и, например, цилиндрична или сферична. Това е едно от проявленията на многофункционалността на трасиращия метод.

По време на проследяване на лъчи е необходимо да се определят точките на пресичане на права лъчева линия с обекти. Методът за определяне на пресечната точка зависи от това какъв обект е и как е представен в определена графична система. Така например за обекти, представени под формата на полиедри и многоъгълни мрежи, можете да използвате добре познати методи за определяне на пресечната точка на линия и равнина, разглеждани в аналитичната геометрия. Но ако задачата е да се определи пресечната точка на лъч с лице, тогава е необходимо също така намерената пресечна точка да лежи вътре в контура на лицето.

Има няколко начина да проверите дали произволна точка принадлежи на многоъгълник. Нека разгледаме две разновидности на по същество един и същ метод (фиг. 8.17).

Първи начин.Намират се всички точки, където контурът пресича хоризонталната линия, която съответства на координатата Y на дадената точка. Пресечните точки са сортирани във възходящ ред на стойностите на X координатите. Двойките пресечни точки образуват сегменти. Ако точката, която се проверява, принадлежи към един от сегментите (за това се сравняват координатите X на дадената точка и краищата на сегментите), тогава тя е вътрешна.

Ориз. 8.17. Една точка е вътрешна, ако: a - точката принадлежи на секуща отсечка, b - броят на пресичанията е нечетен

Втори начин.Определя се точка, която лежи на същата хоризонтална линия като изпитваната точка и се изисква тя да лежи извън контура на многоъгълника. Намерената външна точка и тестовата точка са краищата на хоризонталния сегмент. Определят се пресечните точки на този сегмент с контура на полигона. Ако броят на пресичанията е нечетен, това означава, че тестваната точка е вътрешна.

Ако един лъч пресича няколко обекта, тогава се избира най-близката точка в посоката на текущия лъч.

Нека направим общи изводи за метода за обратно проследяване на лъчи.

Положителни характеристики

1. Универсалността на метода, неговата приложимост за синтез на изображения на доста сложни пространствени схеми. Въплъщава много закони на геометричната оптика. Просто се изпълняват различни прогнози.

2. Дори съкратените версии на този метод ви позволяват да получите доста реалистични изображения. Например, ако се ограничите само до първичните лъчи (от проекционната точка), това води до премахване на невидимите точки. Проследяването на един или два вторични лъча дава сенки, огледало и прозрачност.

3. Всички координатни трансформации (ако има такива) са линейни, така че е доста лесно да се работи с текстури.

4. За един пиксел от растерно изображение можете да проследите няколко близко разположени лъча и след това да осредните цвета им, за да елиминирате ефекта на стълбището (антиалиасинг).

5. Тъй като изчисляването на една точка на изображението се извършва независимо от други точки, това може да се използва ефективно при прилагането на този метод в паралелни изчислителни системи, в които лъчите могат да се проследяват едновременно.

недостатъци

1. Проблеми при моделиране на дифузно отражение и пречупване

2. За всяка точка от изображението е необходимо да се извършат множество изчислителни операции. Ray tracing е един от най-бавните алгоритми за синтез на изображения.