specularcolor * Ks * specular(Nf,V,roughness) );
}
Как видно из заголовка шейдера, никакие переменные из него вывести в виде отдельного слоя не получится; для этого придется заниматься модификацией кода. Чтобы получить diffuse в виде отдельного слоя, шейдер нужно изменить, например, вот таким образом:
surface plastic( float Ks=.5, Kd=.5, Ka=1,
roughness=.1; color specularcolor=1; output color diffuseC = 0; )
{
normal Nf; vector V;
Nf = faceforward( normalize(N), I );
V = -normalize(l);
diffuseC = Kd*diffuse(Nf);
Oi = Os;
Ci = Os * ( Cs * (Ka*ambient() + diffuseC) +
specularcolor * Ks * specular(Nf,V,roughness) );
}
Как видите, для решения даже простой задачи, которую поставили перед нами требования реального продакшна, потребовалось пусть небольшое, но изменение стандартного шейдера. Отсюда и последует наш совет.
Ничто не дает большего чуства контроля над ситуацией, как собственноручно сделанный, отобранный и настроенный инструментарий. В особенности это касается шейдеров, и в еще большей особенности - тех самых шейдеров, которые идут в стандартной поставке любого Renderman-совместимого рендерера.
Эти шейдеры хороши, подробно описаны, по ним хорошо учиться - но потом наступает момент, когда вы хотите чего-то нового, существующие возможности вас не устраивают: это означает, что пора начинать писать свое.
Так вот, совет наш будет таким: не используйте стандартные шейдеры. С ними сложно рендерить по слоям, с ними сложно настраивать освещение, экпериментировать с многослойными текстурами. Напишите свои шейдеры, хорошенько их проверьте в бою, прооптимизируйте и настройте под себя - и всегда и везде пользуйтесь ними.
Для любознательных - пример из жизни Вы думаете, что все, выше написанное - трудно, тяжело и малоприменимо? Вот вам реальный пример из реального проекта со слов человека, его делавшего, и пересказаный моими собственными словами.
Итак, в наличии имеется сцена с внутренностями огромного здания. Изначальная диспозиция такова: здание смоделировано полигонами в количестве сколько-то там миллионов штук, при этом постоянно обновляется и достраивается. Генерация RIB'a занимает порядка десяти минут. Здание буквально купается в ярком солнечном свете, а решетчатая облицовка, колонны и перекрытия галерей отбрасывают четкие тени на пол и стены. Все остальное освещение в сцене
- отраженный и рассеянный свет от стен и предметов. Посреди холла установлена огромная, отполированная статуя робота.
Налицо патовая ситуация: .явное проявление болезни под названием “nht,etncz глобальное освещение” с осложнениями в виде невозможно детализированной модели.
Первым делом в таких случаях в руки берется топор и из сцены к такой-то бабушке удаляется все, что не будет видно камере в конкретном кадре. Имена всех удаленных объектов аккуратно записываются в отдельный файлик; таким образом нам будет легче убирать их в следующий раз, когда гигантскую модель здания в очередной раз обновят.
Далее сцена анализируется и разбивается на части. В качестве критерия разбивки используется материал, из которого изготовлен предмет - пластик, бетон, стекло, металл, мрамор и так далее. Каждая часть экспортируется в RIB, удаляется из сцены и заново подключается в сцену с использованием RIBbox’oB - которые вешаются на простые кубики и шарики. На этом этапе к сцене вернулась возможность поворачиваться во вьюпорте без натужного скрипа жестким диском.