14.10. Добавление теней для большей реалистичности Морочит нас летучая звезда И страсти бес.

Но для заблудших душ всегда Был свет с небес.

Роберт Берне (Robert Bums)

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

Введение в трассировку лучей

незначительных программистских усилий. (К сожалению, рисование теней чрезвычайно замедляет процесс трассировки.) На рис. 14.43 приведена сцена, визуализированная с тенями и без них.

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

На рис. 14.44 изображены различные ситуации затенения. Между точкой Р и источником света I, нет никаких объектов, поэтому точка Р не находится в тени по отношению к источнику I,. Однако эта же точка Р находится в тени куба от источника 12. Далее, источник 13 расположен так, что от точки Р его закрывает сам объект соударения; это носит название «самозатенения» («self-shadowing»). Таким образом, в изображенной на рисунке конфигурации единственным светом, ничем.не заслоненным от точки Р, является свет от источника I,.

Испускание дополнительных лучей. «Щупы теней» Для правильного вычисления теней нам необходимо знать, когда точка соударения находится в тени относительно источника света. Итак, нам нужна подпрограмма slnShadowO, которая возвращает true, если хоть какая-нибудь часть какого-нибудь объекта лежит между точкой соударения и данным источником света; в противном случае возвращается fal se. Для разработки такой подпрограммы мы «испустим» новый луч, часто называемый щупом теней (shadow feeler), который выходит из точки соударения Ph в момент времени t - 0 и достигает источника L при г - 1. Тогда параметрическое представление щупа теней будет иметь вид Ph + (I - Ph)t. Для того чтобы проверить, соударяется ли этот луч с чем-нибудь, просматривается весь список объектов, и каждый объект из этого списка тестируется на пересечение со щупом теней. Если в интервале времени от t = О до t - 1 обнаружено хотя бы одно пересечение, то isInShadowO возвращает true.


⇐ Предыдущая| |Следующая ⇒