Возможности стандарта Renderman в области процедурной генерации геометрии дадут серьезную фору многим существующим рендерерам. А мы тем временем обратимся к экзотическим возможностям prman.
Разговаривающие и адаптивные шейдеры
Одной из новых возможностей, реализованных в Renderman Pro Server раньше, чем это появилось в стандарте, является возможность передавать сообщения между шейдерами (message passing). В рамках этой функциональности один шейдер может запросить значение переменной, определенной в другом шейдере, наложенном на эту же модель.
Классический пример использования message passing - получение surface-шейдером информации из displacement-шейдера о величине отклонения и соответствующая закраска поверхности - например, более выпуклые области модели закрашиваются более темным цветом. Связывать таким образом можно любые шейдера, относящиеся к одному объекту - например, поставив displacement в зависимость от освещенности. Сложная на первый взгляд, передача сообщений между шейдерами предоставляет еще один метод тонкой настройки отображения поверхностей, в том числе возможность реализовать адаптивные шейдеры - оптимизирующие свою функциональность непосредственно во время просчета.
Для продвинутых. Простой пример адаптивного шейдера. В процессе расчета ambient occlusion мы в каждом сэмпле выстреливаем некоторое количество лучиков в полусферу, причем для того, чтобы в картинке не было грязи и чтобы при анимации она не дрожала, это некоторое количество обычно является достаточно большим - как минимум, 256. Поскольку говорим мы о гау tracing, любая оптимизация этого процесса будет к месту. Способ адаптации шейдера к свойствам поверхности, на которой он вызван, состоит в том, чтобы смотреть на локальную кривизну поверхности в данной точке (например, спрашивая об этом displacement shader, или просто вычисляя ее по изменению текстурных координат и их производных) и если кривизна большая - то в этой точке стрелять лучиков меньше (все равно за мелкими деталями грязи видно не будет), а если небольшая - то побольше.
Еще один простой пример, чтобы немного взбударажить фонтазию нашего читателя. Попробуйте поуправлять величиной спекуляра или размером дисплейсмента в зависимости от расстояния до камеры. Или попробуйте наложить дисплейсмент только на края объекта, ограничившись в остальной части более примитивным и скоростным бампом.
Для продвинутых-2. MTOR поддерживает мощный механизм для связи майских атрибутов с шейдерами. Чтобы воспользоваться этим механизмом, достаточно добавить к любому майскому объекту новый атрибуте именем, например, rmanFmyS. Приставка rmanF (таких приставок несколько и они подробно описаны в документации) дает MTORy сигнал, что данный атрибут должен быть обработан специальным образом и его значение должно быть подготовлено к экспорту. Все, что остается сделать - это использовать полученное значение в шейдере, например, вот так:
surface test( varying float myS = 0; )
{
Ci = color(myS);
}
Ну вот, по внутренностям прошлись - а теперь настало время от оптимизации и ухищрений на микроуровне перейти к чистой воды читингу на макроуровне, а также просто полезным советам. Если предыдущие советы имели смысл по большей части только для Renderman-совместимых рендереров, то теперь мы постараемся быть полезными и для других движков, в том числе для mental ray и самой MAYA. Настало время для крупнокалиберной артиллерии и грязных трюков.