Render.ru

Local bounce in surface shader - ILM

#1
Вот, нашел время немного покопаться с сабжем. Если кто не в курсе - на последнем Сигграфе в Stupid Renderman Tricks была такая презентация.

Ну, поскольку на Сигграфе я не был ;-) то всё, что у меня есть по этому поводу - PowerPoint slides с renderman.org (http://www.renderman.org/RMR/Examples/srt2001/). Скачать мувики самой презентации с китайского сайта я не смог.

В общем, там нет ничего военного. Взял я его исходники и подкорячил:

surface bouncing(float Kbounce = 0.1; float Fbounce = 1; float Kd = 1.5;)
{
if (Kbounce > 0.0) {
// проблемное место
point Psample = Ps;
normal Nsample = Ng;
color Csample = Cs;
// конец проблемного места
vector Lsample = Psample - P;
float distsample = length(Lsample);
color CKDsample = 0;
if (distsample < Fbounce) {
illuminance(Psample, Nsample, PI/2) {
CKDsample += Cl * Nsample.normalize(L);
}
CKDsample *= Kd * Csample;
if (distsample != 0.0) Lsample /= distsample;
float NdotLsample = N.Lsample;
if (NdotLsample > 0.0) {
CKDsample += Kbounce * CKDsample * NdotLsample * (1.0 - smoothstep(0.0, Fbounce, distsample));
}
}
Ci = CKDsample;
}

}

Проблемное место в оригинале выглядит вот так:

Psample = transform ("world", "current", Psample);
Nsample = ntransform ("world", "current", Nsample);

причем определяются эти самые переменные как:

Psample = position of the bounce
pointOnSurface -p -u $uPos -v $vPos $surfaceName

Nsample = normal at Psample
pointOnSurface -n -u $uPos -v $vPos $surfaceName

Csample = average color around Psample

Ну то есть как экспортируемые из Maya через Mel в шейдер кастомные переменные. Вот тут мне и пришел полярный зверек - не могу никак эти переменные привязать, хоть ты тресни. Может, день сегодня такой...

Willing to experiment, anyone?
 
#2
Я так думаю динамическими темплейтами через мтор. Что-то типа:
.........
parameter string arrString {
default "{1, 2, 3, 4}"
detail uniform
}
parameter float arrNumber {
detail uniform
default 4
}
.......
RSLMain {
generate
output "point Psample\[[getval arrNumber] \] = [getval arrString] ;"
.........
}
....
ну а наполнять arrString и arrNumber через атрибуты обьекта.
Или я не о том?
 
#3
Попробовал поэксперементировать - в принципе получилось, но как-то через Ж... Приходится ручками выгружать параметры точек и вставлять их в шейдер в виде строки. То есть, конечно это все можно сделать скриптом, но по любому получается один шейдер на один обьект.

ЗЫ Картинки получаюстя вполне :))
 
#5
Гуд, хотите картинки - их будет :))

http://briefcase.yahoo.com/bc/govnuk2000 в папочке friends, лежат анимашка LocBounceTst.avi и одни шот из нее.

Считал с 64 семплами на обьект. Три лайта: красный, синий и (вот неожиданность;-) зеленый, два из них находятся за обьектом . Так как семплы брал через равные промежутки по UV то получилось немного не правильно: на сильно выступающий кусок не попал семпл и он выглядит темным. На каждый кадр 1 минута на 1 ггц
 
Сверху