2012-05-16 2 views
2

Я пытаюсь выполнить некоторые вычисления, связанные с трассировкой лучей, но немного запутался. Допустим, у меня было n-на-n изображение с N геометрическими примитивами, l источниками света и k x k суперсэмплинг. Сколько лучей пересечений я буду вычислять в худшем случае? Что, если я добавлю отражение/рефракцию с глубиной d?Расчет трассировки лучей

ответ

7

Вам нужно будет запустить k x k лучей для каждого из n x n пикселей изображения. Для каждого из этих лучей вы должны выполнить тестирование на столкновение, которое в очень упрощенном и неэффективном виде переводится на N сравнений (каждый в зависимости от сложности примитива). Теперь, если какое-либо из этих лучей попадает на зеркальную или полупрозрачную поверхность, вам нужно разделить лучи и вызвать рекурсивно. Однако на этот раз вы не делаете суперсэмплинг, поэтому вы просто отправляете один луч в направлении отражения/преломления. Для глубины d вы отправите это количество дополнительных лучей, по одному для каждого рекурсивного вызова.

Итак, всего: k^2 x n^2 x d.

Это без учета вычислений пересечений, которые не добавляют больше лучей, но приносят большую сложность.

Существует, однако, много упрощений.

  • Адаптивная мультисэмплинга, уменьшающая коэффициент k^2.
  • Пиксельные интерполяции, уменьшающие коэффициент n^2.
  • Используйте некоторую пространственную структуру разделов, такую ​​как BSP и/или OctTree для тестирования на столкновение.
  • Используйте некоторую эвристику, чтобы вырезать рекурсию.
+0

Некоторые примеры, возможно, были приятными, но вы все равно получили мой голос ... – Jay

+0

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

+0

Без сомнения ....... – Jay

2

Не то, что это полный ответ, однако .... Смотрите эту статью: http://blogs.msdn.com/b/lukeh/archive/2007/10/01/taking-linq-to-objects-to-extremes-a-fully-linqified-raytracer.aspx Вы могли бы использовать это модифицированный с некоторым счетным кодом, чтобы иметь эти статистические данные автоматически, когда вы делаете трассировку: P

+1

Хотя это не совсем ответ, это дает очень интересный пример, в какой-то странный и забавный способ. Я сам нашел это использование LINQ очень впечатляющим. –

+0

Если вы считаете, что это впечатляет, посмотрите мою версию JavaScript. Если серьезно; Благодарю вас за добрые слова, сэр, почему-то я чувствую, что не заслуживаю их, но я буду принимать их с великой послушностью. Большое спасибо – Jay