Трассировка лучей с помощью алгоритма диффузии

Многие определенные ресурсы о трассировке лучей рассказывают о:

«стреляй лучиками, найди первое препятствие, чтобы его срезать»

"стрелять вторичными лучами ..."

"или сделать это наоборот и приблизить / интерполировать"

Я не видел ни одного алгоритма, использующего алгоритм распространения. Предположим, что точечный свет - это точка, которая имеет большую плотность, чем другие ячейки (все пространство разделено на ячейки), каждый шаг / итерация освещения / трассировки заставляет эту исходную точку распространяться на соседей, используя поле скорости, а затем их соседей и продолжается так. После некоторых удовлетворительных итераций (например, 30-40 итераций) информация о плотности каждой ячейки используется для освещения объектов в этой ячейке.

Точечный свет и поле скорости:

введите описание изображения здесь

Но он должен быть размером примерно 1000x1000x1000, и это потребует слишком много времени и памяти для вычислений. Может быть, просто вычислив 10x10x10 и при нахождении препятствия разделение этой области на 100x100x100 (в стиле динамического дерева kd) может помочь сгенерировать освещение / тени для приемлемого разрешения? Особенно для освещения на основе вершин, а не треугольников.

Кто-нибудь пробовал такой подход?

Примечание: поле Velocity предназначено для того, чтобы свет в основном рассеивался наружу (не% 100, а% 99, чтобы иметь некоторое глобальное освещение). Метод конечных элементов может сделать это досадно параллельным.

Изменить: любой объект, на который попадает положительная плотность, будет препятствием для создания нового поля скорости вокруг его поверхности. Таким образом, свет не может проходить через этот объект, но может отражаться в другом направлении. (Если это объект линзы, чем свет рассеивается через него сильнее). Таким образом, отражение света может влиять на другие объекты с более высоким пределом итераций.

Такое же kd-дерево можно использовать в алгоритмах столкновения объектов :)

Просто возьмем скепсис: нейронную сеть можно обучить для адвекции и диффузии в сетке 30x30x30, и это можно использовать в «gpu (opencl / cuda) -> нейронная сеть ---> метод конечных элементов - -> путь теней.


person huseyin tugrul buyukisik    schedule 28.08.2013    source источник
comment
похоже на классную головоломку; Я занимаюсь этим, но ничего об этом не знаю.   -  person Mulan    schedule 28.08.2013
comment
Ты прав. А как насчет этого вопроса? Тип применим?   -  person huseyin tugrul buyukisik    schedule 28.08.2013
comment
Он достигнет довольно узкой аудитории только из-за высокого уровня интеллекта, необходимого для этого предмета. Так что да, я бы сказал, применимо :)   -  person Mulan    schedule 28.08.2013
comment
Может быть, это уже известно, но никому не сообщается?   -  person huseyin tugrul buyukisik    schedule 29.08.2013


Ответы (1)


В нынешнем виде есть пара проблем.

Первая проблема заключается в том, что, по сути, фотон в ньютоновском смысле не реагирует и не изменяется в зависимости от плотности других фотонов вокруг. Таким образом, использование поля плотности и попытка освещения в соответствии с классическими решениями в стиле Навье-Стокса (что вы пытаетесь сделать, основываясь на приведенном вами объяснении поля плотности) приведет к неверным результатам. Это также, при достаточном количестве итераций, приведет к полной энтропии над сценой, что также не то, что происходит со светом.

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

Итак, отбросив проблемные части вашей идеи, у вас останется система частиц для фотонов: P

Честно говоря, системы sudo-частиц в настоящее время используются для решений глобального освещения. Этот тип вещей называется Photon Mapping, но с его помощью очень просто реализовать решение для прямого освещения: P

person CulDeVu    schedule 12.05.2014