forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты C++ (http://forum.boolean.name/forumdisplay.php?f=56)
-   -   Статья: RayTrace(Part 1) (http://forum.boolean.name/showthread.php?t=9225)

Genius 23.09.2009 00:00

Статья: RayTrace(Part 1)
 


Рей трейсинг,один из методов получения физически правельной картинки,вот представте себе сцену - полоскость и три сферы рандомно раставленые над ней все эти объекты имеют свойство отражать в себе окружающий мир,как вы это сделаете? Чтобы всё было физически правельно веть надо будет отражать не только на плейне все сферы но и чтобы в сферах были отражения других сфер и плейна! Без рей трейсинга здесь однозначно не обойтись! Кстате скоро выйдет RayTrace движок от инвидии который будет ускарятся на их видео карточках.

Я не раскажу вам к сожелению об отражениях в этой статье,но в дальнейших частях думаю реч пойдёт и об отражениях.

И так перва статья об RayTrace будет вводная:

Представте себе такую сцену:


Она разбита не триугольники( но как правело если юзать триугольники то нужно кажый триугольник разбить ещё на 3-4 триугольника а то и больше чтобы достич качества):

И так стрельба лучами от источника к вершине каждого триугольника:



Мы просто берём луч Origin = light position , Dir = vertex position - Origin
И шотим и так с кажой вершиной каждого объекта.

Как же получить тени спросите вы?? Легко при шоте лучём мы проверяем если луч пересёк что либо то значит затеням вершину так как между источником и вершиной стоит какаято преграда!



У себя я это делаю так:

Код:

void CMesh::rayTrace()
{
        for(int i=0;i<num_surfaces;i++){
                CSurface* s = surfaces[i];
                for(int j=0;j<s->lightmaps.size();j++){
                        LightMap* m = &s->lightmaps[j];

                        for(int y=0;y<m->size;y++){
                                for(int x=0;x<m->size;x++){
                                        vec3 crd = m->getLumel(x,y)->coord;

                                        for(int k=0;k<CSceneManager::num_lights;k++){
                                                CLight* l = CSceneManager::lights[k];
                                                //if(!l->getMaterial())
                                                //        continue;

                                                float dist = 100000;
                                                vec3 p,n;

                                                vec3 start = l->getWorldPosition();
                                                vec3 end = crd;//(l->getWorldPosition() - m->getLumel(x,y)->coord).normalized() * crd.distance(l->getWorldPosition());
                                                IEntity* e = CEngine::scene->rayTrace(start,(end - start).normalized() * 1000 ,p,n);
                                               
                                                //glMatrixMode(GL_MODELVIEW);
                                                //glLoadIdentity();

                                                CEngine::scene->begin(CEngine::scene->camera);
                                                glColor3f(1,0,0);
                                       
                                                glBegin(GL_LINES);
                                                glVertex3f(start.x,start.y,start.z);
                                                glVertex3f(end.x,end.y,end.z);
                                                glEnd();



                                                if(e && p.distance(end) <= 2.0f ){

                                                        float dist = (l->getWorldPosition() - crd).length();
                                                        float attenuation = 1 - sqrt(dist) / sqrt(l->getRadius());
                             
                                                        float d = dot(m->getLumel(x,y)->normal,(start - end).normalized());
                                                        m->getLumel(x,y)->color += l->getMaterial()->getColor() * d * attenuation;
                                               
                                                        glColor3f(0,1,0);
                                                    glBegin(GL_LINES);
                                                    glVertex3f(start.x,start.y,start.z);
                                                    glVertex3f(p.x,p.y,p.z);
                                                    glEnd();
                                                }

                                                CEngine::scene->end();

                                                getEngine()->flip();
                                        }

                                }
                        }
                }
                s->updateLightmap();
        }
}

Первая часть закончена,воторая будет как только я разберусь с отражениями)).



Mr_F_ 23.09.2009 00:34

Ответ: Статья: RayTrace(Part 1)
 
твоё использование рейтрейса беспонтово!) между прочим YAL также генерил тени, только это жуть как медленно а просчитать тоже самое шадовмапом быстрее и лучше.

Genius 23.09.2009 00:39

Ответ: Статья: RayTrace(Part 1)
 
Цитата:

Сообщение от Mr_F_ (Сообщение 119477)
твоё использование рейтрейса беспонтово!) между прочим YAL также генерил тени, только это жуть как медленно а просчитать тоже самое шадовмапом быстрее и лучше.

Я юзаю лайтмепы,для статики это очень даже понтово и попантовее шедоу мапа будет по скорости ) так как расчитывается это всё в оффлайне.

Mr_F_ 23.09.2009 00:49

Ответ: Статья: RayTrace(Part 1)
 
я тоже юзаю лайтмапы, а запекаю их юзая шадовмап, в оффлайне :)
мне и в оффлайне ждать долго не хочется)
http://i023.radikal.ru/0909/63/32cb4b961775.jpg
http://s19.radikal.ru/i192/0909/a1/c888bbc91633.jpg
http://i016.radikal.ru/0909/e6/6bd1fd4a641b.jpg
на скринах уже лайтмапы - рендерились по 3-6 сек

Genius 23.09.2009 01:00

Ответ: Статья: RayTrace(Part 1)
 
Вложений: 1
Цитата:

Сообщение от Mr_F_ (Сообщение 119480)
я тоже юзаю лайтмапы, а запекаю их юзая шадовмап, в оффлайне :)
мне и в оффлайне ждать долго не хочется)
http://i023.radikal.ru/0909/63/32cb4b961775.jpg
http://s19.radikal.ru/i192/0909/a1/c888bbc91633.jpg
http://i016.radikal.ru/0909/e6/6bd1fd4a641b.jpg
на скринах уже лайтмапы - рендерились по 3-6 сек

Если строить Kd-Tree то рейтрейсинг будет шустрый,и спомощью него можно всёравно добится красивее результата нежели с помощью шедоумап.

У меня например рейтрейс быстрый,результат тоже не плохой:

Mr_F_ 23.09.2009 01:11

Ответ: Статья: RayTrace(Part 1)
 
а у тебя
а у тебя
у тебя зато нету фишки что блюрность тени зависит от дистанции, пройденной от кастера)

да и по скрину ничего не поймёшь, будто 6 черных пикселей размазано

Genius 23.09.2009 01:18

Ответ: Статья: RayTrace(Part 1)
 
Цитата:

Сообщение от Mr_F_ (Сообщение 119485)
а у тебя
а у тебя
у тебя зато нету фишки что блюрность тени зависит от дистанции, пройденной от кастера)

да и по скрину ничего не поймёшь, будто 6 черных пикселей размазано

Зато ты от направленого источника без PSSM который тоже не всегда точный не получиш красивой тени хотя ты её переблюрь всю =)
А с помощью рейтрейса всё будет гуд.

Mr_F_ 23.09.2009 01:20

Ответ: Статья: RayTrace(Part 1)
 
Цитата:

без PSSM
кто сказал что без?)
Цитата:

не получиш красивой тени хотя ты её переблюрь всю =)
почему? тень она и в шадовмапе тень)

Genius 23.09.2009 01:23

Ответ: Статья: RayTrace(Part 1)
 
Цитата:

Сообщение от Mr_F_ (Сообщение 119493)
кто сказал что без?)

почему? тень она и в шадовмапе тень)

Ну хотябы потомучто она будет не точная,а это к твоему сведению уже не красиво если так думать то почему бы тогда вообще под каждой моделью просто тупо круглый чёрный спрайт проецировать,а чё тень она и в африке тень...

ЗЫ Под направленым источником я имел ввиду солнце.

Mr_F_ 23.09.2009 01:37

Ответ: Статья: RayTrace(Part 1)
 
для направленного источника я рендерю довольно с недалекого расстояния, по частям, точность устраивает.
если реально издалека за раз то да, говно было


Часовой пояс GMT +4, время: 02:59.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot