Многие определенные ресурсы о трассировке лучей рассказывают о:
«стреляй лучиками, найди первое препятствие, чтобы его срезать»
"стрелять вторичными лучами ..."
"или сделать это наоборот и приблизить / интерполировать"
Я не видел ни одного алгоритма, использующего алгоритм распространения. Предположим, что точечный свет - это точка, которая имеет большую плотность, чем другие ячейки (все пространство разделено на ячейки), каждый шаг / итерация освещения / трассировки заставляет эту исходную точку распространяться на соседей, используя поле скорости, а затем их соседей и продолжается так. После некоторых удовлетворительных итераций (например, 30-40 итераций) информация о плотности каждой ячейки используется для освещения объектов в этой ячейке.
Точечный свет и поле скорости:
Но он должен быть размером примерно 1000x1000x1000, и это потребует слишком много времени и памяти для вычислений. Может быть, просто вычислив 10x10x10 и при нахождении препятствия разделение этой области на 100x100x100 (в стиле динамического дерева kd) может помочь сгенерировать освещение / тени для приемлемого разрешения? Особенно для освещения на основе вершин, а не треугольников.
Кто-нибудь пробовал такой подход?
Примечание: поле Velocity предназначено для того, чтобы свет в основном рассеивался наружу (не% 100, а% 99, чтобы иметь некоторое глобальное освещение). Метод конечных элементов может сделать это досадно параллельным.
Изменить: любой объект, на который попадает положительная плотность, будет препятствием для создания нового поля скорости вокруг его поверхности. Таким образом, свет не может проходить через этот объект, но может отражаться в другом направлении. (Если это объект линзы, чем свет рассеивается через него сильнее). Таким образом, отражение света может влиять на другие объекты с более высоким пределом итераций.
Такое же kd-дерево можно использовать в алгоритмах столкновения объектов :)
Просто возьмем скепсис: нейронную сеть можно обучить для адвекции и диффузии в сетке 30x30x30, и это можно использовать в «gpu (opencl / cuda) -> нейронная сеть ---> метод конечных элементов - -> путь теней.