Как когерентность лучей используется для повышения скорости трассировки лучей, сохраняя при этом реалистичность?

Я рассматриваю возможность использования когерентности лучей в своем программном попиксельном рейкастере в реальном времени.

AFAICT, используя однородную сетку, если я назначу когерентность лучей участкам, скажем, 4x4 пикселя (где в настоящее время у меня есть один raycast на пиксель), учитывая 16 параллельных лучей с разными начальными (и конечными) точками, как это работает для связная сцена? Что я предвижу:

  1. Существует расстояние, в пределах которого ход лучей будет точно таким же для соседних/подобных лучей. В пределах этого расстояния я экономлю на обработке. (Откуда я знаю, что это за расстояние?)
  2. В итоге я получу немного неправильное изображение из-за того, что некоторые лучи не расходятся в нужное время.

Учитывая, что мои лучи отбрасываются из одной точки, а не из плоскости, я думаю, мне понадобится какая-то функция разделения в соответствии с пройденным расстоянием, чтобы набор всех лучей образовывал дерево по мере его движения наружу. Меня беспокоит то, что более мелкие детали будут потеряны при приближении к зрителю.

Наверное, я просто не понимаю, как это должно использоваться.


person Engineer    schedule 09.11.2011    source источник


Ответы (1)


Если все сделано правильно, когерентность лучей не должна влиять на конечное изображение. Поскольку лучи расположены очень близко друг к другу, есть хорошее изменение, заключающееся в том, что все они будут двигаться по одинаковым путям при пересечении структуры ускорения (дерево kd, дерево aabb и т. д.). Вы должны пройти по каждой ветке, на которую может попасть любой из лучей, но, надеюсь, это не сильно увеличивает количество ветвей и экономит доступ к памяти.

Другое преимущество заключается в том, что вы можете использовать SIMD (например, SSE) для ускорения некоторых ваших тестов, как в структуре ускорения, так и против треугольников.

person celion    schedule 09.11.2011
comment
Является ли ветвление заданным в трассировке пакетов лучей, чтобы уменьшить отклонение лучей на больших расстояниях? Картинка нарисовала бы здесь тысячу слов. Хотел бы я найти его. - person Engineer; 09.11.2011
comment
Не могу найти картинку, но это докторская диссертация Инго Вальда (sci.utah.edu/~wald/Publications/2004///WaldPhD/download//) описывает это в 7.2.3 SIMD Packet Traversal для kd-деревьев. - person celion; 09.11.2011
comment
Да, статья Уолда немного помогла. Что я получаю, так это то, что вы отбрасываете когерентные лучи в пакеты, используя SIMD либо через SSE, либо через GPU. Чего я не понимаю, так это того, что происходит, когда попадает один из лучей. Что-то ветвится? Или остальные параллельные лучи просто продолжают двигаться, пока не остановятся, и в этот момент вся операция SIMD прекращается? И более того, если это так, то почему бы просто не использовать SIMD на расходящихся лучах — данные луча являются MD. - person Engineer; 10.11.2011
comment
В прошлом я делал это так, чтобы отслеживать активные лучи с помощью битового поля; если луч не пересекает ветвь дерева, очистить его бит. Вы можете остановить обход текущей ветки, когда ни один из лучей не активен. Когда вы доберетесь до листа, вы можете использовать все лучи или только активные, в зависимости от того, что вы считаете более быстрым (поскольку неактивные не должны попадать). Чем более когерентны ваши лучи, тем больше вероятность того, что все они пройдут через одни и те же узлы дерева и попадут в одни и те же треугольники, что позволит избежать дополнительной выборки данных. - person celion; 10.11.2011