Я пытаюсь выполнить некоторые вычисления, связанные с трассировкой лучей, но немного запутался. Допустим, у меня было n-на-n изображение с N геометрическими примитивами, l источниками света и k x k суперсэмплинг. Сколько лучей пересечений я буду вычислять в худшем случае? Что, если я добавлю отражение/рефракцию с глубиной d?Расчет трассировки лучей
ответ
Вам нужно будет запустить k x k лучей для каждого из n x n пикселей изображения. Для каждого из этих лучей вы должны выполнить тестирование на столкновение, которое в очень упрощенном и неэффективном виде переводится на N сравнений (каждый в зависимости от сложности примитива). Теперь, если какое-либо из этих лучей попадает на зеркальную или полупрозрачную поверхность, вам нужно разделить лучи и вызвать рекурсивно. Однако на этот раз вы не делаете суперсэмплинг, поэтому вы просто отправляете один луч в направлении отражения/преломления. Для глубины d вы отправите это количество дополнительных лучей, по одному для каждого рекурсивного вызова.
Итак, всего: k^2 x n^2 x d.
Это без учета вычислений пересечений, которые не добавляют больше лучей, но приносят большую сложность.
Существует, однако, много упрощений.
- Адаптивная мультисэмплинга, уменьшающая коэффициент k^2.
- Пиксельные интерполяции, уменьшающие коэффициент n^2.
- Используйте некоторую пространственную структуру разделов, такую как BSP и/или OctTree для тестирования на столкновение.
- Используйте некоторую эвристику, чтобы вырезать рекурсию.
Не то, что это полный ответ, однако .... Смотрите эту статью: http://blogs.msdn.com/b/lukeh/archive/2007/10/01/taking-linq-to-objects-to-extremes-a-fully-linqified-raytracer.aspx Вы могли бы использовать это модифицированный с некоторым счетным кодом, чтобы иметь эти статистические данные автоматически, когда вы делаете трассировку: P
Хотя это не совсем ответ, это дает очень интересный пример, в какой-то странный и забавный способ. Я сам нашел это использование LINQ очень впечатляющим. –
Если вы считаете, что это впечатляет, посмотрите мою версию JavaScript. Если серьезно; Благодарю вас за добрые слова, сэр, почему-то я чувствую, что не заслуживаю их, но я буду принимать их с великой послушностью. Большое спасибо – Jay
Некоторые примеры, возможно, были приятными, но вы все равно получили мой голос ... – Jay
Прошу прощения за это, но какие примеры вы хотели бы? В вопросе ничего не говорится о реализации, поэтому я не знаю, какие примеры предоставить. Если речь идет о оптимизациях, о которых я говорил, это может быть тема для другого вопроса. Во всяком случае, большое спасибо за голосование. –
Без сомнения ....... – Jay