Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование в широком смысле слова > Алгоритмика

Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения

Ответ
 
Опции темы
Старый 02.08.2015, 16:47   #1
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений
(для 357 пользователей)
Light Propagation

Есть такой алгоритм вычисления 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
Миниатюры
Нажмите на изображение для увеличения
Название: screenshot 1.png
Просмотров: 886
Размер:	17.1 Кб
ID:	21818  Нажмите на изображение для увеличения
Название: screenshot 2.png
Просмотров: 1070
Размер:	38.8 Кб
ID:	21819  
(Offline)
 
Ответить с цитированием
Старый 03.08.2015, 00:04   #2
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Light Propagation

каждая итерация должна распространять свет с прошлой, тогда такой фигни не будет.
расширил один раз квадратик - стало 8 новых квадратиков. теперь каждый из этих 8 расширяешь во все стороны, получается аля блюр.
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Старый 03.08.2015, 01:08   #3
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений
(для 357 пользователей)
Ответ: Light Propagation

Сообщение от Mr_F_ Посмотреть сообщение
каждая итерация должна распространять свет с прошлой, тогда такой фигни не будет..
Ну так сейчас так и есть. Измененная ячейка помечается как dirty. Свет излучается только из dirty ячеек.

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

теперь каждый из этих 8 расширяешь во все стороны, получается аля блюр.
Так получится, что новые ячейки будут освещать старые. Т.е. свет вернется в ту ячейку, из которой пришел.
(Offline)
 
Ответить с цитированием
Старый 03.08.2015, 11:32   #4
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Light Propagation

Так получится, что новые ячейки будут освещать старые. Т.е. свет вернется в ту ячейку, из которой пришел.
по идее не особо он вернётся. т.к. в каждую соседнюю ячейку ты не просто фракцию значения из текущей передаёшь, а ту часть света из неё, которая в сторону соседней смотрит (+ затухание).
т.е. если у тебя лучи смотрят в основном направо, то при "блюре" налево, dot(налево, любой луч) будет < 0, ничего не перейдёт.
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Старый 10.08.2015, 17:26   #5
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений
(для 357 пользователей)
Ответ: Light Propagation

Продолжаю экспериментировать.
Теперь растягиваю потоки света до 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
Миниатюры
Нажмите на изображение для увеличения
Название: Normal.png
Просмотров: 1483
Размер:	13.7 Кб
ID:	21830  Нажмите на изображение для увеличения
Название: abnormally.png
Просмотров: 1542
Размер:	98.6 Кб
ID:	21831  
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com