Render.ru

Двухсторонний шейдер?

#1
Привет Народ! Есть вопрос, как создать в Rendermane двух сторонний шейдер приатаченный к одной поверхности? К примеру шоколадная обертка, с одной стороны имедж, а с другой блестящая фольга. Я знаю как сделать в Maye, но как ето сделать через slim? Заранее спасибо!
 
#2
Открой float.slim и в самом конце перед последними двумя скобами вставь
template float IdotN {
label "IdotN"
parameter float result {
access output
display hidden
default 1
}
RSLFunction {
void pxslIdotN (
output float result;
)
{ vector IN = normalize(I);
normal NN = normalize(N);
if (IN.NN >= 0) result = 1; else result = 0;
}
}
}
Потом перегрузи слим и во флотах появиться оператор IdotN
который можно использовать как миксер в Surface Mix.
 
#3
Привет Андрей! Я только две недели как поставил Renderman, поэтому очень плохо ориентируюсь в нем. Я не нашел где находится float.slim, подскажи где искать его. Спасибо!
 
#5
Коротко:

floats.slim находится в директории "D:\pixar\RenderMan Artist Tools 4.5\lib\slim\"
(у меня). Иногда FAR делает чудеса ;-)

Длинно:

Поскольку вы только 2 недели как к нам присоединились и скорее всего документацию до конца прочитать не успели, объясню вкратце смысл фокуса.

В Renderman в процессе шейдинга для каждой (грубо) точки определен ряд переменных, к которым можно иметь доступ из шейдера. В частности, таковыми переменными являются I и N, соответственно, вектор из камеры в точку и нормаль поверхности в этой точке.

Представим себе шарик. На внешней его поверхности эти вектор и нормаль будут направлены в разные стороны, соответственно скалярное их произведение I.N, вернее, произведение их после нормализации normalize(I).normalize(N) будет больше нуля. Напротив, если эти вектора будут направлены в одну сторону, то есть на внутренней поверхности, то произведение поменяет знак.

Данным свойством и воспользовался Andrew V.K., когда предложил вам свой готовый SLIM template. Алгоритм создания поверхности в слиме теперь прост: делаете SurfaceMix, к нему на входы цепляете 2 разных Shading model, например, Blinn и Cell, или одну, но с разными текстурами или цветами, а на mixPct - IdotN. В preview результатов видно не будет, там нет двусторонних объектов, а вот в реальной сцене всё будет отлично.

Единственное, что еще нужно помнить, та это то, что Renderman по умолчанию рендерит только одну сторону поверхности, поэтому ему нужно будет включить двусторонний рендеринг путем добавления в RIB код строки:

Sides 2

Это можно сделать через RAT RibBox. Смотрите документацию.

Anyone, я что-нибудь упустил?
 
#6
Вообщето в данном случае можно было обойтись и без normalize
а просто
if (I.N).....поскольку важен только знак. И две "лишние" операции+переменные
никчему.

P.S.
У меня мтор поумолчанию видит обе стороны.
 
#7
template float IdotN {
label "IdotN"
parameter float result {
access output
display hidden
default 1
}
RSLFunction {
void pxslIdotN (
output float result;
)
{
if (I.N >= 0) result = 1; else result = 0;
}
}
}
 
#8
Большое всем спасибо! Все получилось. Так подробно мне еще никто не объяснял :)))) !
 
#9
МТОР корректно отрабатывает галки в майкином RenderStats - Double Sided и даже Opposite :)
 
Сверху