Ну и последнее уточнение, без которого описанная выше схема рендеринга не имеет никакого практического значения: алгоритм REYES потребует колоссального количества памяти, если попытаться реализовать его, начиная с тесселляции поверхностей, для всей картинки сразу. К счастью, он прекрасно работает и с ее частями (помните, я рассказывал про бакеты?), по умолчанию, размером 16x16 пикселей, из которых потом, как из мозаики, собирается все изображение.
Ффух! Отдышались? Поехали дальше.
По умолчанию величина PixelSamples в prman установлена как:
PixelSamples 2 2
Это означает, что на каждый пиксель приходится 4 точечных сэмпла . Если мы изменим эту величину (файл на диске pixelsamplesl 1 .rib):
Display “RenderMan” “framebuffer” “rgb”
Format 256 192 1 ShadingRate 64 PixelSamples 1 1 Translate 0 0 2.7650300856 WorldBegin TransformBegin LightSource “ambientlight” 500
“lightcolor” [0.051 0.051 0.051]
LightSource “distantlight” 501 “from” [1 1.5-1] "to” [0 0 0]
LightSource “distantlight” 502 “lightcolor” [0.2 0.2 0.2]
“from” [-1.3 -1.2 -1.0] “to” [0 0 0]
TransformEnd Surface “plastic”
Sphere 1 -1 1 360 WorldEnd то получим картинку без антиалиасинга и с видимыми проблемами с шейдингом - но получим ее очень быстро:
Управляя двумя переменными - ShadingRate (для любых участков вашей сцены) и PixelSamples (для всей сцены) - можно очень гибко настраивать рендеринг, добиваясь максимального качества за минимальное время.
Для продвинутых. Покажем, как управлять этими параметрами при помощи утилиты срр
- как мы отмечали раньше, такая утилита есть в поставке почти всех рендереров, совместимых с Renderman. Для этого внесем изменения в RIB (вы можете просто открыть cpptest.rib с диска):
Display “RenderMan” “framebuffer” “rgb”
Format 256 192 -1 ShadingRate SR PixelSamples SX SY Translate 0 0 2.7650300856 WorldBegin TransformBegin LightSource “ambientlight" 500
“Ughtcolor” [0.051 0.051 0.051]
LightSource “distantlight” 501 “from” [1 1.5 -1] “to” [0 0 0]
LightSource “distantlight” 502 “Ughtcolor” [0.2 0.2 0.2]
“from” [-1.3 -1.2 -1.0] "to” [00 0]
TransformEnd Surface “plastic"
Sphere 1 -1 1 360 WorldEnd
Мы определили внутри файла три символьные константы - SR, SX и SY. Теперь вызовем в командной строке препроцессор: срр -DSX=2 -DSY=2 -DSR=0.25 cpptest.rib | prman и получим в результате картинку с необходимыми установками: константы внутри файла будут заменены на значения, объявленные при вызове срр.
Несколько неожиданный ход - использовать препроцессор языка C++, которым обычно обрабатываются файлы SL, для работы с файлами RIB. В этом вся соль расширяемости Renderman
- поскольку и те, и другие файлы являются текстовыми, для их обработки годятся одни и те же утилиты.
LOD
Еще один трюк из арсенала «читинга» в Renderman - это Level of Details, или сокращенно LOD. Смысл данной настройки состоит в том, что в RIB файле можно указывать не одну геометрическую модель, а несколько, и при этом указать, начиная с какого расстояния до камеры использовать ту или иную модель в данном месте сцены. Представьте себе битву с участием сотен сражающихся. Без LOD все, что вы могли бы сделать - это использовать одну и ту же высококачественную модель как для бойцов первого плана, так и для статистов на заднем плане и что совсем печально - для огромной массы бойцов на горизонте, каждый из которых отрендерится максимум в десяток пикселей. Применяя LOD, вы можете автоматически подставлять для переднего плана - максимально детальную и проработанную модель; для среднего плана - что-то немного упрощенное; для массовки на заднем плане - палку-палку-огуречик или вообще один полигон с наложенной текстурой - и тем самым сильно уменьшить запросы по памяти и времени расчета. А разницу никто не заметит.