Nano Hash - криптовалюты, майнинг, программирование

Проблема с трассировкой теней

У меня проблема с теневыми лучами в моем трассировщике лучей.

Пожалуйста, взгляните на следующие две картинки

3D sMax:

http://neo.cycovery.com/shadow_problem.gif

Мой Raytracer:

http://neo.cycovery.com/shadow_problem2.jpg

Сцена освещена очень ярким светом, падающим сзади. Он настолько яркий, что в штриховке нет градиента, только белый или темный (из-за передержки).

оба изображения были визуализированы с использованием 3DStudioMax, и оба используют одну и ту же геометрию, только в одном случае нормали интерполируются по треугольникам.

Теперь рассмотрим красную точку на поверхности. В случае несглаженной версии он находится в темной области. это означает, что источник света не виден из этого треугольника, поскольку он направлен от него. Однако в сглаженной версии он находится в освещенной области, потому что интерполированная нормаль предполагает, что свет будет виден в этой точке (хотя фактическая геометрия треугольника направлена ​​в сторону от источника света).

Моя проблема теперь в том, когда появляются тени с трассировкой лучей. Если теневой луч попадает в сцену из красной точки, чтобы проверить, виден ли источник света или нет (для определения затенения), теневой луч вернет пересечение, независимо от интерполированы ли нормали или нет (поскольку пересечения зависят только от геометрии). Поэтому пиксель будет темным.

3dsamx обрабатывает этот случай правильно - визуализированное изображение было сгенерировано с включенными тенями с трассировкой лучей. Однако мой собственный Raytracer сталкивается именно с этой проблемой, когда я включаю тени с трассировкой лучей (в моем трассировщике лучей точка темная в обоих случаях, потому что тени с трассировкой лучей определяют точку, лежащую в тени), и я не знаю, как решить Это.

Надеюсь, кто-то знает эту проблему и как с ней бороться ..

Благодарность!

09.12.2009

  • Вы делаете нормальное сглаживание. Положение в пространстве основано на геометрии, но статус тени зависит от угла к источнику света, от нормали к поверхности, поэтому, если вы не сглаживаете нормали, у вас будет такая же нормаль по треугольнику. 09.12.2009
  • что ты имеешь в виду? как я уже сказал, я интерполирую нормаль по треугольнику! проблема НЕ в штриховке! проблема в тени с трассировкой лучей! Если я отключу тени с трассировкой лучей, все будет выглядеть нормально (за исключением, конечно, теней!) 09.12.2009
  • Мат, не могли бы вы прикрепить еще два изображения: только RT-тень без затенения и только RT-затенение без тени? 24.12.2009

Ответы:


1

«Правильные» решения - это либо мозаика треугольников, либо решение уравнения поверхности, которой принадлежит треугольник. Я видел только мозаику. Тесселяция дает вам управляемую точность и так далее ...
В противном случае вам следует проверить нормаль в точке (что, я считаю, делает '3DStudio'), а в случае, если нормаль не направлена ​​на свет, просто установите точку как не горит. Это не имеет ничего общего с «самозатенением». Легко эту проблему можно решить только с помощью тесселяции. Удачи!

15.12.2009
  • +1 для просто тесселяции с требуемой точностью :-) Однажды я прочитал, что Pixar тесселяет до субпиксельных треугольников, что должно полностью исключить необходимость интерполировать нормали. Это непросто, но и не взлом. 11.08.2010
  • Для такой маленькой задачи тесселяция звучит очень дорого. Если вы изогнете поверхность в соответствии с нормалями и снимете теневой луч с этой точки, вы получите идеальный результат. Прибегайте к тесселяции для решения сложных задач, таких как отображение смещения. 22.04.2016
  • @sapanoia: в этом конкретном случае да, но вы бы сделали ставку на более скрученную? В любом случае, я согласен с вами, что для простых случаев можно использовать более простое решение. (Кстати, под изгибом поверхности вы имели в виду интерполяцию нормалей или что-то более сложное?) 26.04.2016
  • @avp: Думаю, то, что я придумал, в конце концов потребовало бы решения уравнения поверхности. Однако это может быть слишком дорого, что может быть причиной широкого применения тесселяции. 27.04.2016

  • 2

    Не уверен, правильно ли я понял вашу проблему. Трудно понять, какая версия / результат каким методом и какой результат вы считаете правильным.

    Разве это не тот случай, когда нужно угрожать пересечением теневого луча с треугольником, на котором находится Красная точка ;-) как частный случай. Вы не делаете пересечения геометрии, как с любым другим треугольником, а только проверяете направление между интерполированной нормалью и теневым лучом.

    Или, в более общем смысле, вы говорите, что теневой луч останавливается в треугольнике, любом треугольнике, когда: а) они пересекаются и б) интерполированная нормаль треугольника в точке пересечения имеет направление, противоположное теневому лучу.

    09.12.2009
  • Привет! Я считаю сглаженный результат 3dsmax правильным и хотел бы получить то же самое. к сожалению, я не могу рассматривать текущий треугольник как частный случай. если текущий треугольник обращен в сторону от источника света, тогда луч тени будет попадать в мой объект, и, поскольку он входит, он должен снова погаснуть, поэтому он ударит другой треугольник при выходе из объекта 10.12.2009
  • Зачем вообще учитывать пересечения с треугольниками внутри объекта? Во всяком случае, я обновил свой ответ, используя несколько более общий подход. Прости. Прошло много времени с тех пор, как я это программировал. 10.12.2009
  • Если я не принимаю во внимание обратную сторону полигонов при отбрасывании теневых лучей, то, например, плоская плоскость не может отбрасывать тени на другую плоскую плоскость. 10.12.2009
  • Но со сглаженными объектами, как видите, все сложнее ... А плоская плоскость может иметь какой-то особый двусторонний флажок или может быть просто сделана из двух плоскостей, обращенных в противоположные стороны. 10.12.2009
  • это звучит как взлом ... должен быть какой-то общепринятый метод решения этой проблемы 10.12.2009
  • Так что пойдите и прочтите книгу об общепринятых методах трассировки лучей. То, что я вам сказал, указывает на то, что нет разницы в геометрии между сглаженным и несглаженным объектом. Просто разные нормали для каждой точки. Их нужно как-то использовать. Считать. 10.12.2009
  • Интерполяция нормальных векторов - это хитрость, и из-за нее возникает проблема с тенями. Плоскости нулевой толщины также являются хакерскими, потому что их на самом деле не существует, поэтому не расстраивайтесь, если им нужен дополнительный флаг. Томек здесь на высоте. 11.08.2010

  • 3

    Как это сделать: если интерполированная нормаль в точке обращена к свету, значит, поверхность потенциально обращена к свету. Если смотреть в сторону, вы в тени.

    В первом случае две вещи, которые могут вызвать тень, - это другие объекты и вы, если вы вогнутый объект. В другом объекте это легко.

    Теперь в случае с вами, когда вы направляете свой луч на источник света, если вы действительно «выпуклая внутренняя точка», вы дважды ударите себя, когда войдете, а затем покинете объект, таким образом, в тени.

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

    10.12.2009
  • Вышеупомянутое предполагает, что вы не выполняете отсечение задней поверхности объекта по направлению к источнику света. Если бы вы это сделали, то перекрестка не было бы. Я думаю, это и есть точка зрения Томека. 10.12.2009

  • 4

    Мэт, я считаю, что ваша проблема может заключаться в том, что ваш теневой луч попадает в тот же треугольник, из которого он исходит, потому что он настолько близок к касательному (обратите внимание, что это происходит прямо на границе перехода свет-тень). Есть два способа решения этой проблемы: один подход - использовать «смещение», которое проверяет расстояние от начала луча, но я думаю, что лучшим решением будет сохранить ссылку на исходный треугольник с лучом. Если вы проводите тест против этого треугольника, просто игнорируйте его.

    Если вы используете пространственный индекс, такой как BVH, вы можете попробовать выйти из «коробки», содержащей треугольник, перед выполнением каких-либо тестов на пересечение, но это менее просто, чем вышеупомянутый подход, и к нему следует подходить с большей осторожностью. .

    21.12.2009

    5

    При испускании теневых лучей нормально сдвигать точку пересечения на небольшое расстояние в направлении источника света.

    Т.е. shadowRay.dir = shadowRay.dir * 0,0001

    Это позволяет избежать пересечения теневым лучом того же примитива, что и первичный / отражающий / преломляющий луч.

    Возможно, ваша проблема в том, что вы этого не сделали?

    13.08.2010
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..