Render.ru

тени

Рейтинг
29
#1
зачем prman'у делать карты глубины перед тем как сделать тени?как все это работает?
 
#2
Вкратце и упрощенно: ставится камера в положение источника, и рендерится попиксельно "глубина" до ближайшей поверхности. Потом, при окончательном проходе эта "глубина" сравнивается с реальным расстоянием между точкой шейдинга и источником света. Если точка дальше, чем это следует, исходя из карты глубины, значит, она в тени: существует какая-то другая поверхность, которая ее "затенила". Что из этого вытекает:
1) карта глубины рендерится без антиалиасинга (один пискел карты - одно значение глубины), иначе вся эта затея теряет смысл
2) сравнение глубин по принципу ">" будет плохо: обязательно появится "грязь" от "самозатенения" тех поверхностей, которые не лежат строго перпендикулярно направлению на источник. Поэтому применяется что-то вроде a > b + shadowbias. Величина этого shadowbias меняется юзером в каждом конкретном случае.
3) ShadingRate очень сильно влияет на изображение теней
 
#3
Вообще говоря, вопрос достаточно книжный. Можно, например, ввести в prman'овском Help'е в поиске "shadow map". Ну я попробую объяснить как можно короче и понятнее. Поправьте меня, если что.

Дело в том, что prman до версии 11 (ещё не вышла) не является рейтрейсером, поэтому не может вот так вот просто рендерить тени. Для рендеринга теней prman пользуется технологией shadow maps. Для этого перед тем, как рендерить сцену вообще, сначала рендерятся её карты глубины, причём для каждого источника света в сцене камера ставится на место этого источника (для поинт лайта генерятся аж 6 карт глубины).

Затем всё очень просто. В процессе основного рендеринга проверяется Z координата каждого рендерённого сэмпла. Тут нужно помнить, что для каждой точки в нашей сцене мы имеем несколько таких координат - с точки зрения нормальной камеры и с точки зрения камеры, помещённой в источник света. Так вот если координаты совпадают - то сэмпл не в тени. Если не совпадают - то это тень.

Как говорят умные люди Alan Watt и Mark Watt в умной книжке Advanced Animation and Rendering Techniques, открытой у меня на коленях на странице 166 - это самый простой и быстрый метод расчёта теней в ситуации, когда у вас не рейтрейсер, однако метод страдает некоторыми проблемами, большинство из которых в prman уже вроде бы решены. Например, раньше shadow maps были алиасеными, теперь вроде бы нет. Опять же, в prman11 будут так называемые deep shadow maps, которые для каждой точки в сцене хранят не одну z координату, а некую функцию (грубо говоря), которая может генерить значение z в зависимости от внешних параметров.

Вкратце так.
 
#4
Неа, имхо антиалиасинг в шадоумапе не сделаешь никак :-( Другое дело, что можно в нем хранить не одно значение, а два, типа min/max и как-то их фильтровать с соседними пикселами... Ну, это конечно, моя бредовая идея, как обычно :) Наверно где-нибудь в сигграфовских трудах что-нибудь на эту тему есть..
 
#5
А что касается DSM (deep shadow maps), имхо эта технология для пиксаровских архитекторов была очевидна еще лет надцать назад. Либо у них все руки не доходили, либо яблоко на башку никому не падало :) В АрМане есть подробное описание того, как в REYES строится bucket при хайдинге - по каждому пикселу (читай - шейдинг сэмплу) составляется и сортируется список всего, что есть вдоль I, начиная с ближайшего... если не ошибаюсь (АрМана под рукой сейчас нет), до тех пор, пока сэмпл не окажется полностью перекрыт сплошным и непрозрачным. Что есть этот список? Та самая функция прозрачностей от Z или все тот же DSM. Остается только выкинуть его в файл и все дела...
 
Сверху