2009-12-09 2 views
3

У меня проблема с тенями в моем raytracer.Задача Raytraced Shadows

Пожалуйста, обратите внимание на следующие две картины

3D Smax:

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

Мои Raytracer:

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

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

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

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

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

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

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

спасибо!

+1

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

+0

Что значит? как я сказал, я интерполирую нормаль через треугольник! проблема НЕ является затенением! проблема - это лучшая тень! Если я отключу тени с тенями, все будет выглядеть отлично (за исключением, конечно, без теней!) – Mat

+0

Мат, можете ли вы прикрепить еще два изображения: только RT-тень без затенения и только RT-shading без тени? – avp

ответ

0

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

Не так ли, когда вам нужно, чтобы угроза пересекалась с тенерием с треугольником, на котором The Red Point ;-) лежит как частный случай. Вы не пересекаете геометрию, как с любым другим треугольником, , а только проверку направления между интерполированным нормальным и теневым.

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

+0

Привет! Я считаю сглаженный результат 3dsmax правильным и хотел бы получить то же самое. К сожалению, я не могу просто рассматривать текущий треугольник как особый случай. если текущий треугольник обращен в сторону от источника света, тогда теневик будет застрелен в мой объект, и, поскольку он идет, он должен снова выйти, так что он ударит по другому треугольнику при выходе из объекта. – Mat

+0

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

+0

Если я не учитываю облицовочные полигоны при бросании своих теней, то, например, плоская плоскость не могла отбрасывать тени на другую плоскость – Mat

0

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

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

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

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

+0

Вышеупомянутое предполагает, что вы не выполняете обратную обработку объекта по направлению к источнику света. Если бы вы это сделали, пересечения не было бы. Которая, по моему мнению, является Томеком. –

3

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

+0

+1 для просто tesselate до требуемой точности :-) Я однажды прочитал, что Pixar тесселирует до субпиксельных треугольников, что должно полностью исключить необходимость интерполирования нормалей. Это непросто, но это тоже не хак. – phkahler

+0

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

+0

@sapanoia: для этого конкретного случая да, но бы вы сделали ставку на более скрученный? Во всяком случае, я согласен с вами в том, что для простых случаев может быть использовано более простое решение. (BTW, «изгиб поверхности» вы имели в виду интерполяцию нормалей или что-то более сложное?) – avp

0

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

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

0

Нормально перемещать пересечение на небольшое количество в направлении источника света при стрельбе лучами теней.

I.e. shadowRay.dir = shadowRay.dir * 0.0001

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

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