forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Light Propagation (http://forum.boolean.name/showthread.php?t=19928)

WISHMASTER35 02.08.2015 16:47

Light Propagation
 
Вложений: 2
Есть такой алгоритм вычисления Global Illumination: Light Propagation Volumes.
Хочу понять как он работает. Для этого делаю 2д версию алгоритма. Вместо сферических гармоник использую просто массив лучей света во все 360 направлений.
Возможно было бы лучше вместо этого массива лучей использовать список таких объектов: {startAngle, startLight, endAngle, endLight}. По крайней мере растягивать такой световой поток было бы очень просто

Текущий алгоритм https://bitbucket.org/dddenisss/lp/s...r.cs?at=master
Функция RadiateLight распространяет свет по осевым направлениям. Причем при переносе света в каждое направление, свет разделяется 3 потока света.
Центральный световой поток идет прямо по оси, на соседнюю клетку. А 1й и 3й световой поток идет по диагонали. В общем на картинке все показано.

Но получается что свет идет просто в 8 направлениях и не рассеивается. А вот как его правильно рассеивать я что-то не пойму.

Есть люди понимающие в этом алгоритме?
Репозиторий: https://bitbucket.org/dddenisss/lp/overview

Mr_F_ 03.08.2015 00:04

Ответ: Light Propagation
 
каждая итерация должна распространять свет с прошлой, тогда такой фигни не будет.
расширил один раз квадратик - стало 8 новых квадратиков. теперь каждый из этих 8 расширяешь во все стороны, получается аля блюр.

WISHMASTER35 03.08.2015 01:08

Ответ: Light Propagation
 
Цитата:

Сообщение от Mr_F_ (Сообщение 298158)
каждая итерация должна распространять свет с прошлой, тогда такой фигни не будет..

Ну так сейчас так и есть. Измененная ячейка помечается как dirty. Свет излучается только из dirty ячеек.

Цитата:

получается аля блюр
Да, есть что-то общее с блюром. Но блюр намного проще.

Цитата:

теперь каждый из этих 8 расширяешь во все стороны, получается аля блюр.
Так получится, что новые ячейки будут освещать старые. Т.е. свет вернется в ту ячейку, из которой пришел.

Mr_F_ 03.08.2015 11:32

Ответ: Light Propagation
 
Цитата:

Так получится, что новые ячейки будут освещать старые. Т.е. свет вернется в ту ячейку, из которой пришел.
по идее не особо он вернётся. т.к. в каждую соседнюю ячейку ты не просто фракцию значения из текущей передаёшь, а ту часть света из неё, которая в сторону соседней смотрит (+ затухание).
т.е. если у тебя лучи смотрят в основном направо, то при "блюре" налево, dot(налево, любой луч) будет < 0, ничего не перейдёт.

WISHMASTER35 10.08.2015 17:26

Ответ: Light Propagation
 
Вложений: 2
Продолжаю экспериментировать.
Теперь растягиваю потоки света до 90 градусов.

При переносе потока света в соседнюю клетку, поток растягивается из 50 градусов до 90.
Если соседняя клетка прозрачная, то потом переносим свет на две соседних по диагонали света.


При переносе потока на соседние по диагонали ячейки. 20° растягивается до 90°. Типа как http://www.gamedev.ru/files/images/l...sible_adge.png


Тут разрисовал что к чему. Только напутал с градусами, не 45, а 90. На картинке 20 градусов выглядит почти как 50, но в коде 20 это 20, а 50 это 50.




В итоге, при сильном затухании света получается что-то похожее на правду.


Но если уменьшить затухание света, то получается полный бред.


Может при переносе света, поток надо не равномерно растягивать, а с помощью dot уменьшать по краям.
Алгоритм: https://bitbucket.org/dddenisss/lp/s...r.cs?at=master


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

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