Во-первых, я сожалею об этом грубом вопросе, но я не хочу представлять слишком много детали, таким образом, я просто прошу связанный ресурс как статьи, библиотеки или подсказки.
Моя потребность программы сделать интенсивное вычисление треугольного лучом пересечения (существуют миллионы лучей и треугольников), и моя цель состоит в том, чтобы сделать его с такой скоростью, как я могу.
То, что я сделал:
Используйте самый быстрый треугольный лучом алгоритм, который я знаю.
Используйте дерево октантов. (От игрового драгоценного камня программирования 1, 4.10. 4.11)
Используйте Эффективный и Устойчивый Перекрестный Алгоритм Поля Луча, который используется в алгоритме дерева октантов.
Это быстрее, чем, прежде чем я применил те лучшие алгоритмы, но я полагаю, что это могло быть быстрее, Вы могли пролить свет на какие-либо возможные места, которые могли сделать его быстрее?
Спасибо.
]Место, чтобы задать эти вопросы - []ompf2.com[]. Форум с темами о трассировке лучей в реальном времени (хотя и не в реальном времени)[
].Форум OMPF - подходящее место для этого вопроса, но так как я здесь сегодня...
Не используйте пересечение лучей/боксов для обхода октябрьского дерева. Вы можете использовать его для корневого узла дерева, но это все. Как только вы узнаете расстояние до входа и выхода из корневого ящика, вы можете вычислить расстояния до x,y и z плоскостей раздела - плоскостей, которые подразделяют ящик. Если расстояния до передней и задней плоскостей равны f и b соответственно, то можно определить, в какие дочерние узлы бокса попадают расстояния f,b,x,y,z. Можно также определить порядок пересечения дочерних узлов и полностью отвергнуть многие из них.
В большинстве случаев 4 дочерних узла могут быть поражены, так как луч начинается с одного октанта и изменяет октанты только при пересечении одной из 3 плоскостей раздела.
Кроме того, так как он становится рекурсивным, вам понадобятся расстояния входа и выхода для дочерних узлов. Эти расстояния выбираются из множества (f,b,x,y,z), которое вы уже вычислили.
Я оптимизировал это очень долгое время, и могу с уверенностью сказать, что для деревьев глубиной в несколько уровней у вас еще на порядковом уровне. Я начал с того места, где вы сейчас находитесь.
] Есть несколько оптимизаций, которые вы можете сделать, но все они зависят от точного домена вашей проблемы. Что касается общих алгоритмов, то вы на правильном пути. В зависимости от области, вы можете:[
] [Полезный ресурс, который я видел, - это журнал графических инструментов . В зависимости от ваших сцен другой BVH может быть более подходящим, чем октодерево.
Кроме того, если вы не проверяли свою производительность с помощью профилировщика, вам следует это сделать. Shark отлично работает на OSX, и я получил хорошие результаты с Very Sleepy на Windows.
Вы уже хорошо начали использовать пространственную сортировку в сочетании с алгоритмами быстрого пересечения. Для отслеживания одиночных лучей за один раз одна из лучших структур (для статических сцен) - это дерево K-d, построенное с использованием эвристики площади поверхности.
Однако для действительно высокоскоростной трассировки лучей необходимо воспользоваться следующими преимуществами:
Я бы посоветовал вам начать с « Анимированные сцены с трассировкой лучей с использованием когерентного обхода сетки ». Это простой пример такого современного подхода. Вы также можете следить за ссылками, чтобы увидеть, как эти идеи применяются к деревьям K-d и BVH.
На той же странице также ознакомьтесь с разделом «Современное состояние в анимированных сценах с трассировкой лучей».
Еще один отличный набор ресурсов - это все публикации SIGGRAPH за эти годы. Это очень конкурентная конференция, поэтому эти доклады, как правило, будут первоклассными.
Наконец, если вы хотите использовать существующий код, посетите страницу проекта OpenRT .