forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты C++ (http://forum.boolean.name/forumdisplay.php?f=56)
-   -   Статья:Глобальное освещение(Radiosity) (http://forum.boolean.name/showthread.php?t=9182)

Genius 16.09.2009 14:01

Статья:Глобальное освещение(Radiosity)
 
И так,Radiosity - один из методов глобального освещения(Global Illumination,GI).

Радиосити даёт довольно реалистичное освещение нежели простые методы.



Есть open-source реализации Global Illumination рендеринга такие как Toxic(найти можно на SourceForge.net).

Единственный минус GI это довольно таки долгий расчёт из за моножества вычислений так что GI в наше время можно юзать как статическое(фоновое) освещение,заранее расчитаное.

Но со скорым выходом NVIDIA RayTrace Engine(Точное название не помню) возможно GI можно будет выбить в риал тайм,есть конечно уже реализация риал тайм GI от ATI на DirectX 10 где юзаются кубмапы,но и там оно не сильно риал тайм,да и у меня на NVIDIA GeForce 9600 GT почемуто не запускается их пример,найти его можно на developer.amd.com.

А ха да что то я уже в дебри полез :-D ,так Radiosity - не юзает рей трейсинг в то время как просто GI его во всю юзает.

И так реализация:

Я раскажу о повершином Radiosity,но правельнее же конечно юзать лайтмеп(но это отдельная тема).
У нас в сцене есть комнота,все её цвета вершин заполнены чёрным цветом(r=0,g=0,b=0) на потолке комнаты есть лампа - меш все её цвета вершины заполнены белым цветом(r=225,g=225,b=225),начинаем проход по всем мешам\сурфейсам мешей\вершинам сурфейсов,ах да в Radiosity юзается такая штука как Form Factors для определения интенсивности освещёности пикселя,генерируется Form Factor'ы так:

Код:


const int RQ = 32; // качество радиосити,чем больше тем круче

float formFactors[RQ][RQ]; // двумерный массив форм факторов RQ*RQ


for(int x=0;x<RQ;x++){
  for(int y=0;y<RQ;y++){
      formFactors[x][y] = sin( float(x)*PI/float(RQ) )*sin( float(y)*PI/float(RQ) );
  }
}

Форм факторы сгенерированы,представляют они из себя это:


тоесть будет токой цикл:


Код:

for(int i=0;i<num_meshes;i++)
{
        Mesh* mesh = meshes[i];

        for(int j=0;j<mesh->getNumSurfaces;j++){

            Surface* s = mesh->getSurface(j);
            Vertex* v = s->getVertex();

            for(int k=0;k<s->getNumVertex();k++){
                    бла бла бла...
            }
        }
}

Цикл генерации radiosity освещения:

1) Камера перемещается в позицию вершины k,её направление равно нормали вершины k(в блитце можно для этого заюзать AlignToVector),вьюпорт камеры - x=0;y=0;width=RQ;height=RQ;FOV=90 - обязательно 90.
2) Рисуется вся сцена из текущей позиции камеры(желально вырубить режим куллинга)
3) Считывается кусок backbuffer'а - x=0,y=0,w=RQ,h=RQ.

Далее ЦИКЛ:

Код:

unsigned char tmp[3];
for( int x = 0;x<RQ;x++ ){
  for(int y = 0;y<RQ;y++){
    unsigned char r = пиксель[x][y].r;
    unsigned char g = пиксель[x][y].g;
    unsigned char b = пиксель[x][y].b;
    tmp[0] += r * formFactors[x][y];
    tmp[1] += g * formFactors[x][y];
    tmp[2] += b * formFactors[x][y];
  }
}

после делим tmp на RQ*RQ

Код:

tmp[0] /= RQ*RQ;
tmp[1] /= RQ*RQ;
tmp[2] /= RQ*RQ;

и прибовляем tmp к цвету вершины k.

ну и так по все вершинам...

Вот как будет выглидеть полностью цикл:

Код:

camera->setViewport(0,0,RQ,RQ);
camera->setFov(90);
camera->setAspect(RQ/RQ);

for(int i=0;i<num_meshes;i++)
{
        Mesh* mesh = meshes[i];

        for(int j=0;j<mesh->getNumSurfaces;j++){

            Surface* s = mesh->getSurface(j);
            Vertex* v = s->getVertex();

            for(int k=0;k<s->getNumVertex();k++){
                    camera->setPosition(v[k].xyz);
                    camera->align(v[k].normal);
                   
                    рендерим мир.
 
                    лочим backbuffer.

                    получаем массив пикселей.


                    unsigned char tmp[3];
               
                    for( int x = 0;x<RQ;x++ ){
                        for(int y = 0;y<RQ;y++){
 
                            unsigned char r = пиксель[x][y].r;
                            unsigned char g = пиксель[x][y].g;
                            unsigned char b = пиксель[x][y].b;
                            tmp[0] += r * formFactors[x][y];
                            tmp[1] += g * formFactors[x][y];
                            tmp[2] += b * formFactors[x][y];
                        }
                    }

                    после делим tmp на RQ*RQ

                    tmp[0] /= RQ*RQ;
                    tmp[1] /= RQ*RQ;
                    tmp[2] /= RQ*RQ;
                    v[k].color.x += tmp[0];
                    v[k].color.y += tmp[1];
                    v[k].color.z += tmp[2];
            }
      }
}

повторяем этот цикл до достижения красивой картинки(обычно это 15-16 итераций)

4 пасса -

16 пассов -


Полезные ссылки:
-http://freespace.virgin.net/hugo.eli.../radiosity.htm
-http://democoder.ru/dcdn_article_view.php?dcid=22

Genius 16.09.2009 14:22

Ответ: Статья:Глобальное освещение(Radiosity)
 
Пример для B3D в процессе.

Mr_F_ 16.09.2009 14:39

Ответ: Статья:Глобальное освещение(Radiosity)
 
Цитата:

начинаем проход по всем мешам\сурфейсам мешей\вершинам сурфейсов,ах да в Radiosity юзается такая штука как Form Factors для определения интенсивности освещёности пикселя,генерируется Form Factor'ы так:
я нифига не понял
что такое форм факторс
и почему у меня должны получаться какие-то градиентные круги на каждый пиксель

тема чрезвычайно интересует, буду признателен за более понятное объяснение

хотя тут довольно рульно описано

Genius 16.09.2009 17:05

Ответ: Статья:Глобальное освещение(Radiosity)
 
Цитата:

Сообщение от Mr_F_ (Сообщение 118742)
я нифига не понял
что такое форм факторс
и почему у меня должны получаться какие-то градиентные круги на каждый пиксель

тема чрезвычайно интересует, буду признателен за более понятное объяснение


хотя тут довольно рульно описано

Так я же написал что форм фактор для определения интенсивности освещёности пикселя ;),покрайней мере я так понял...

jimon 16.09.2009 20:49

Ответ: Статья:Глобальное освещение(Radiosity)
 
Цитата:

покрайней мере я так понял...
значит твои старания по radiosity это просто допилить копипаст откуда-то чтобы он заработал ?

ps. статья чисто для копипаста, никакой теории

Genius 16.09.2009 21:08

Ответ: Статья:Глобальное освещение(Radiosity)
 
Цитата:

Сообщение от jimon (Сообщение 118766)
значит твои старания по radiosity это просто допилить копипаст откуда-то чтобы он заработал ?

ps. статья чисто для копипаста, никакой теории

Твоё личное мнение учтено ;)

p.s напиши лучше.

Dream 16.09.2009 21:32

Ответ: Статья:Глобальное освещение(Radiosity)
 
"какое ни какое но тоже чтото" всё равно спасибо за старания)

Genius 17.09.2009 14:13

Ответ: Статья:Глобальное освещение(Radiosity)
 
Блин вообще забыл как пользоватся B3D =(. Сеймпл отменяется...

Вобщем вот как выглидит Radiosity у меня:


На белые полоски на рёбрах боксов не обращайте внимания,у меня лайтмеп всё ещё страдает...

Dream 17.09.2009 14:50

Ответ: Статья:Глобальное освещение(Radiosity)
 
такое ощущения что на нижних грянях кубов есть лампочка) и освещает поверхность под ними

Genius 17.09.2009 15:58

Ответ: Статья:Глобальное освещение(Radiosity)
 
Цитата:

Сообщение от DimasSup (Сообщение 118831)
такое ощущения что на нижних грянях кубов есть лампочка) и освещает поверхность под ними

Цитата из моего сообщения c скрином:

На белые полоски на рёбрах боксов не обращайте внимания,у меня лайтмеп всё ещё страдает...

Это означает что и на нижних рёбрах есть полоски а в радиосить все светлые объекты автоматом становятся источниками,тоесть в радиосить сурфейсные источники юзаются(по крайней мере у меня),что на мой взгляд даёт много приимуществ например источники можно будет любых форм делать =). Щас работаю над Irradiance Volume.

Mr_F_ 17.09.2009 19:14

Ответ: Статья:Глобальное освещение(Radiosity)
 
Цитата:

Irradiance Volume
нету ссылок на какие-нибудь статьи?

jimon 17.09.2009 20:05

Ответ: Статья:Глобальное освещение(Radiosity)
 
Genius
Цитата:

p.s напиши лучше.
мне не нужно писать свою статью чтобы критиковать твою

IGR 17.09.2009 20:17

Ответ: Статья:Глобальное освещение(Radiosity)
 
Жаль для БЪЭ 3 Де нет примера !!
а так, статья so-so...

Genius 18.09.2009 02:10

Ответ: Статья:Глобальное освещение(Radiosity)
 
Цитата:

Сообщение от Mr_F_ (Сообщение 118865)
нету ссылок на какие-нибудь статьи?

В D3D SDK есть пример. и ещё у крайтека был пепер по нему. ссылки нету под рукой.

upd:

-http://www.cs.utah.edu/~shirley/papers/irradiance.pdf
-http://ati.amd.com/developer/gdc/Tat...ce_Volumes.pdf
-http://www.crytek.com/fileadmin/user...on_Volumes.pdf


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

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