Render.ru

Шутка от PIXAR

#1
Однако приколисты там работают....
Если в слиме спекулярный материал (blinn,plastic и.т.д) сделать полностью прозрачным то вся их спекулярность пропадет к щеееертовой бабушке.
Похоже ребята воткнули скобку не в то место и вместо
Ci = Os * Color+Spec у них Ci = Os * (Color+Spec)
Придется немного почистить shadingmodels.slim
Или я чегото недопонимаю (может сейчас спекуляр не в моде) ?
 
#2
Это конечно шутка....Но не доконца....... Это такой "стандарт" для шейдоров...

Идея такая в Maya,Max сделанно примерно так как ты говориш (ну покрайне мере я так думаю)....Но там преходится мучится с убиранием блика на полностью прозрачной частью поверхности.....

Slim предлагает альтернативное решение проблемы запихать в прозрачность то что ты хочеш а именно блик(Там есть такой апиренс под название Specular), убывание по прозрачности по углу к поверхности (FacingForward только изредка необходимо пользоваться ColorToGray и FloatToColor ну и иверт соответсвенно floaf и color, правда насчет последних пришлось написать самому) и все что тебе еше захочется.....Просто окрываеш параметр прозрачности и начинаеш мастерить его как тебе хочется....Там комбайн и вперед еше комбайн....И тд. и тп...
 
#3
Всетаки лучше переделать темплэйты (lgNaa.slim,shadingmodels.slim) поскольку :
Что если тебе нужна нестандартная спекулярность (Jewel,Brushed и.т.п)
городить сетку конектов сложнее и шейдер будет тормознутее.
А боротся со спекулярностью в местах где она ненужна можно проще.
Делаеш:
Create Appearance-Surface-Constant (Opacity=0)
Create Appearance-Surface-Mix
в InputA которого кладеш прозрачный материал с бликами
в InputB кладеш Constant
в mixpct кладеш флоатову маску.


А вот Вам еще один дикий прикол:
Пытался засетапить рефракшн с помощью связки:
Environment Light + AdditiveFX (Plastic+CollectRefraction)
Ставлю RIndex=1 - Все нормально (рефракта нет)
Ставлю 1.3 - есть но некорректный
Ставлю 1.6 - вообще никаких изменений
Лезу в reflections.slim и нахожу в collectRefractions следующую строку:

varying float eta = min(max(RI, 1e-6), 1-1e-6);

Получается что у них RI никогда не будет >= 1
Заменил этот бред на

varying float eta = max(RI, 1e-6);

и все стало на свой места.

Вобщем Слиму в его нынешнем виде (ошибки, идиотская дока,
очень бедный набор темплэйтов) далеко до ShadeTree и по возможностям
и по скорости.
 
#4
Про удаление блика согласен полность....Красиво и все такое....Опыта просто у меня маловато будет...

А вот во fresnel я не разобрать не смог ....
И поэтому говорить что он правильно будет работать при eta больше 1 .....Незнаю ...Они повидиму посчитали что нет ...Причем во всем файле закоцывать придется по полной програмее...

Про дукоментацию,ошибки и теплыйты согласен полность....
Но про доку у нас бы она была полней если был бы SGI ну и вообше аскетичность это их стиль....Типа думают что кому нужно и так все уже знают .... Не правы по моему причем серьезно....

Да ShadeTree ему не далеко а по моему очень близко.....А уж по архитектуре намного более продвинуто....(И самое главное интегрированость с процессом RibStream и с Mtor ..Правда тут ясно что она есть но как сделать темплейт с RibBox ом внути и с какиенибудь переключалками я не понял...Rib box там вообше очень странная весчь...Сколько не пыталься не чего путного не получалось...Если не получится то попытаюсь сделать хотябы Slim файл ) Единственый не достаток не документированость даной архитектуры ну тоесть описанией всех скриптов и поряда парсера в Rib и т.д....

Про скорость шейд три не понял что там такого скоростного....В смысле скорость разработки??? Ну и хорошей документацией и шейд три не страдает...
 
#5
Ну и задачки ты перед собой ставиш!!!
Это всереьез пахнет програмированием,
а я к сожалению в нем слаб
(так... бабушка в детстве сказки на бэйсике читала...)
Просто совет:
Не страдай "глобальной универсализацией".
Времени уходит много а результат сомнителен.
Я раньше тоже пытался городить "универсальные вэсчи",
а потом выяснялось, что "вэсчь универсальна" толко для
того случая, для которого она городилась.
То что ты хочеш сделать можно сделать
и вручную причем за 1 мин. 18 сек.
Камера не видет объект с 135 по 616 кадр
- так просто заанимируй visibility и в rib он не войдет.
Нужен rib архив - сгенери, обдери. Уйдет не более 18.45 сек.
Нужно передать параметры в архив - выреж из него ту часть
где параметры объявляются, вставь ее в RibBox и используй Tcl/Tk экспрэшн
для передачи параметров из майки, а в конце пропиши ReadArchive. Поидее
в ribе они встанут встык. Содержимое бокса может выглядеть примерно так:

AttributeBegin
Surface "FalseGrass" "Kd" \[[mattr "Control.Ambience" $f]\]
ReadArchive "MyGrass.rib"

А сам архив содержит в себе:

ShadingInterpolation "smooth"
NuPatch 4 4 [0 0 0 0 1 1 1 1] 0 1 4 4 [0 0 0 0 1 1 1 1] 0 1 "Pw" [-6 -3.67382e-016 6 1
-6 -1.22461e-016 2 1 -6 1.22461e-016 -2 1 -6 3.67382e-016 -6 1
-2 -3.67382e-016 6 1 -2 -1.22461e-016 2 1 -2 1.22461e-016 -2 1
-2 3.67382e-016 -6 1 2 -3.67382e-016 6 1 2 -1.22461e-016 2 1
2 1.22461e-016 -2 1 2 3.67382e-016 -6 1 6 -3.67382e-016 6 1
6 -1.22461e-016 2 1 6 1.22461e-016 -2 1 6 3.67382e-016 -6 1]
AttributeEnd

Хотя это только предположение, я не проверял, нужды пока небыло.
А вот чего сейчас действительно нехватает MTOR так это метаболов....
Хотя это можно было бы реализовать давольно таки просто:
Написать MetaMaker.mel который сканил бы сцену на предмет наличия NURBS сфер с
префиксом "meta_" в имени и генерил из них риб архив Blobby.rib
с RiBlobby примитивами, учитывая при этом радиусы сфер, цвет и "сосисочность"
основанную на скейле.
Далее сделать риббокс в котором прописать:

[clientcmd "source MetaMaker.mel"]
ReadArchive "Blobby.rib"

Но на все это моих знаний пока нехватает.
Может кто займется?

По поводу ShadeTree:

Вот те "грязный" рецепт перезаточки (ибо я слаб в програмировании и Perl
ассоциируется у меня впервую очередь с кашей)

У меня Shadetree & Renderman стоят на D:\

1. В d:\shadetree\bin\ сделай PRMan.cfg в котором пропиши:
unsetenv STREE_LIB
setenv STREE_LIB D:\SHADETREE\prman
2. Запусти Config.exe и выбери PRMan после чего сделай теплый рестарт.
3. Продупли содержимое d:\shadetree\bmrt в диру d:\shadetree\prman
4. Откомпили testcheckered.sl (d:\shadetree\prman\lib\src\) и
слей результат в d:\pixar\PhotoRealistic RenderMan\lib\shaders\
5. Далее лезь в D:\shadetree\prman\bin\ и внеси изменения
В os.pl замени slc на slo
В stree.pl замени slc на shader
и вот те полностью мой измененный rendrit :





#!/usr/sbin/perl

# renderit - render a test image
#
# $1 - the temporary shader's name
# $2 - render count
#
# Assumes main program left us two files:
#
# $STREE_WORKDIR/$1 - shader source
# $STREE_RENOPT - render options file containing env variables
#
# Take the source file the main program left for us in $1, push it into the
# tmp directory ($STREE_RENDERDIR) along with the other stuff we need,
# compile and render, then remove the tmp directory when done.
#
# VERS DATE AUTHOR COMMENTS
# ---- -------- ----------------- ----------------------------------
# 1.00 06/01/98 erco@cinegrfx.com perl(1) 4.0 implementation
#

$| = 1;
$G_{PROGNAME} = "renderit";
require "$ENV{STREE_LIB}/bin/stree.pl";
require "$ENV{STREE_LIB}/bin/makerib.pl";

# # # # # #
## ## # # # ## #
# # # # # # # # #
# # ##### # # ##
# # # # # # #

# MAIN
{
# INITIALIZE $STREE_{} VARIABLES
# Load in render options, etc.
#
&InitVars($ARGV[0], $ARGV[1]);

# HANDLE SPECIAL CASE: STREE_INTERLACE
local($interlacearg) =
( $STREE_{INTERLACE} eq "off" ) ? "" : "-d $STREE_{INTERLACE}";

print STDERR "*** INTERLACEARG=$interlacearg INTERLACE=$STREE_{INTERLACE}\n";

# HANDLE SIGNALS TO REMOVE TEST DIR WE CREATE
$SIG{'INT'} = 'CleanupTrap';
$SIG{'TERM'} = 'CleanupTrap';
$SIG{'BREAK'} = 'CleanupTrap'; # NT

# MAKE TEST DIRECTORY
# Move the shader in there, and enter the directory.
#
mkdir($STREE_{RENDERDIR}, 0777);
chdir($STREE_{RENDERDIR});

# RENAME SHADER -> SL FILE
{
local($from) = "../$STREE_{SHADER}";
local($to) = "./$STREE_{SHADERSRC}";
unless ( &Move($from, $to) )
{ &Fail("Move($from, $to): $!", 1); }
}

# IS THIS A CUSTOM RENDER?
if ( $STREE_{CUSTOMREN_FLAG} == 1 )
{
&CustomRender($STREE_{SHADER}, $STREE_{RENDER_COUNT});
&MyExit(0);
}

print <<"EOF";

RENDER ----------------------------------------------------------
RENDER Shader Filename: $STREE_{SHADERSRC}
RENDER Shading Rate: $STREE_{SHADERATE}
RENDER Resolution: $STREE_{RES}
RENDER Object Rot: $STREE_{OBJ_ROTX},$STREE_{OBJ_ROTY},$STREE_{OBJ_ROTZ}
RENDER Light Rot: $STREE_{LIGHT_ROTX},$STREE_{LIGHT_ROTY},$STREE_{LIGHT_ROTZ}
RENDER Samples: $STREE_{SAMPLES}
RENDER Zoom: $STREE_{ZOOM}
RENDER ----------------------------------------------------------

EOF

# COMPILE SHADER
# Current directory must be where shader lives
#
&Compile($STREE_{SHADER}, $STREE_{SHADERSRC}, $STREE_{SHADEROBJ});

# RENDER TEST FRAME
# If a range of frames is specified, do them all.
#
if ( $STREE_{SFRM} == $STREE_{EFRM} )
{
# MAKE A RIB FILE FOR FRAME #1
$STREE_{FRAME} = 1;
&MakeRib("./test.rib", $STREE_{OUTFILE});

# RENDER IMAGE
# Either to screen or file.
#
print STDERR "--- RENDER ---\n";
&Banner("test.rib");
&Copy("test.rib", "$STREE_{TMPDIR}");
if ( $G_os eq "irix" )
{
local ($cmd) = "/bin/nice -19 timex " .
"prman " .
"test.rib";
print STDERR "Executing: $cmd\n";
local ($err) = (system($cmd) >> 8);
}
else
{
local ($cmd) = "prman " .
"test.rib";
print STDERR "Executing: $cmd\n";
local ($err) = (system($cmd) >> 8);
}

# NOTE: Ignore EXIT 2 since killing the dspyserver
# will generate that errorcode (a common thing to do)
#
print STDERR "EXIT=$err\n";
&MyExit(0);
}
else
{
local ($pathname);
local ($ext);

if ( $STREE_{OUTFILE} eq "screen" )
{
local($msg) =
"UNSUPPORTED:\n".
"\tRender animated sequence to 'screen' currently unsupported.".
"\tPlease specify a filename in Render Options Editor ".
"-> Output Image Type\n";

&Fail($msg, 1);
}

# PARSE OUT FILENAME EXTENSION
if ( $STREE_{OUTFILE} =~ /^(.*)\.(\S+)$/ )
{ $pathname = $1; $ext = $2; }
else
{ $pathname = $1; $ext = ".sgi"; }

# FRAME LOOP
for ($STREE_{FRAME} = $STREE_{SFRM};
$STREE_{FRAME} <= $STREE_{EFRM};
$STREE_{FRAME}++ )
{
local($outfilename) =
sprintf("%s.%04d.%s", $pathname, $STREE_{FRAME}, $ext);
local($date) = &GetDate();

print <<"EOF";

------------------------------------------------------------------------------
Working on frame $STREE_{FRAME} of $STREE_{EFRM} - $date
Writing to $outfilename

EOF
&Banner(sprintf("%04d", $STREE_{FRAME}));

# MAKE CUSTOM RIB FILE
# Sticks in render options and test shader
#
&MakeRib("./test.rib", $outfilename);

# RENDER IMAGE
# Either to screen or file.
#
print STDERR "--- RENDER ---\n";

local ($cmd);
if ( $G_os eq "irix" )
{
$cmd = "/bin/nice -19 timex prman " .
"test.rib";
}
else
{
print STDERR "*** INTERLACEARG2=$interlacearg\n";
$cmd = "prman " .
"test.rib";
}

print STDERR "Executing: $cmd\n";
local ($err) = (system($cmd) >> 8);

# NOTE: Ignore EXIT 2 since killing the dspyserver
# will generate that errorcode (a common thing to do)
#
}
&Banner("done");

# GO 'DING' WHEN DONE RENDERING RANGE OF FRAMES
&Success();
}

#NOTREACHED#
&MyExit(0);
}

# CUSTOM RENDER SCRIPT
sub CustomRender
{
local($args) = join(" ", @_);

# PREFIX WITH STREE_LIB IF NO LEADING '/'
if ( $STREE_{CUSTOMREN} !~ m%^[/.]% )
{ $STREE_{CUSTOMREN} = "$STREE_{LIB}/$STREE_{CUSTOMREN}"; }

# INVOKE USER'S RENDER SCRIPT, AND EXIT
# Let the user do all the error handling/messages
#
print <<"EOF";

-------------- C U S T O M R E N D E R --------------
Executing: $STREE_{CUSTOMREN} $args
cwd: $STREE_{RENDERDIR}
---------------------------------------------------------
EOF

&Run("$STREE_{CUSTOMREN} $args", "Custom Render Failed.", 1);
}

# CLEANUP TMP FILES
sub MyExit
{
local($exit) = @_;

# CHDIR SOMEWHERE SAFE, THEN BLOW THE TMP FILES
chdir("$STREE_{WORKDIR}/..");
&RemoveDir($STREE_{RENDERDIR});

print STDERR
"\nrenderit: " . (($exit==0)?"DONE":"FAIL") . " - [EXIT $exit]\n";
exit($exit);
}

# INTERRUPT HANDLER: CLEANUP JUNK
# $1 is signal name
#
sub CleanupTrap
{
local($sig) = @_;
print STDERR "\nrenderit: caught signal $sig. Cleaning up.\n";
&MyExit(1);
}
----------------------------------------------------------

6. В stree.def найди строку ext.compiledshader .slc и замени на .slo

Обычно я просто делаю File-Export-Compiled Shader туда куда мне надо.

Те Surface экзамплы которые используют прикомпеленный дисплэйс
рендерятся без дисплэйса пока ты не перекомпилиш их и не продублиш
результат в стандартных шейдэрах кажется. Я точно непомню давно это
было но я как то заставил их работать вместе c PRMan.

И вообще если поковырять его основательно (особенно stree.def и makerib.pl)
то можно заточить его как угодно и под что угодно.
Например добавить кучу своих объектов для рендера.
Будут проблемы свисти но у меня все работает как часы.
(навсякий случай все скрипты кинул)
 
#7
Я имел ввиду что они этои проверкой сразу же коцают твой IOR
(тот который у стекла = 1.3 а у воздуха 1) до 1-1e-6
Стандартный блок обычно выглядит примерно так:
if (eta != 0)
{
float f = max(eta, 1e-4);
fresnel (IN, Nf, (I.N < 0) ? 1.0/f : eta,
kr, kt, Rfldir, Rfrdir);
}
И подобная конструкция везде кроме как в CollectRefraction.
Пойщи какие нибудь левые рефрактовы
шейдеры (MaxMan,SoftMan) и убедись.
Так что лопатить ничего не придется.
Когда я внес те изменения он просто ЗАРАБОТАЛ.

Что до интеграции слима ты прав - в этом его плюсяра.

Про Shadetree - да мастерить конекты в нем быстрее
а главное легче найти ошибку так как все визуально
и напоминает блоксхему.
Его набор боксов после перезаточки некоторых из них под
SL Extention (4D Noise например) и разрэмливанья боксов
(удаления сивола подчеркивания перед именем диры или бокса)
доставшихся ему понаследству от SGIшной версии
(правда там присутствыют и недописаные))
покрывает абсолютно все мои нужды.
Хотя конечно все его возможности могут быть запросто
перенесены в слимовские тэмплэйты но на это нужно время
которого всегда нехватает.

"Какие проблемы с RibBox док?"
Я не спец а только учусь...
В качестве эксперемента с ним делал следующее:

Делал сцену с модным сейчас Freeze Motion.
Сначала просто грохнул анимацию у замерзших объектов и задвигал камеру.
Но пропажа интенсивного Motion Blur-а из за отсутствия ключей
у внезапно замерзших объектов смотрелась отвратительно.
А поскольку у рендэрмэна MBlur (при его включении) прописывается в rib
блоком для каждого объекта, то я сделал следующее:
1. Спрятал все лампочки и все статичные объекты
2. Просто сгенерил Rib (выключил рэндэр и удаление Rib) в кадре где FM начиналось
3. Удалил в нем все оставив только описалово объектов т.е. серию
AtributeBegin
.....
.....
.....
AtributeEnd
4. Обозвал его FM.rib
5. В сцене теперь вернул все ранее спрятанное и спрятал все замерзшие объекты.
6. В слиме сделал Rib Box в котором прописал
ReadArchive "e:/projectsm/golf/riarchive/FM.rib"
7. Обозвал этот риббох зарезервированным именем world тем самым обеспечив его
вставку акурат после объявы лампочек.
8. Продолжил рендер с этого кадра и балдел от облета статичных объектов с MBlurом
---------------------------------------------------

Нужно было засеять травой давольно большую площадь.
Сперва пробывал mtorUltraFur но он генерил курвы так долго и их было так много
что rib получался неприлично огромен.
Выход почти тот же:
1. Сделал NURBS Plane размером 10х10 и засетапил для него Fur
Fur должен быть достаточно бордашный иначе потом могут просматриваться стыки
2. Фризанул трансформ у NURBS Plane (все = 0 скейл = 1)
3. Приатачил к нему mtorUltraFur, засетапил и опять сгенерил rib
4. Опять же ободрал его выкинув и NURBS Plane. Получился файл размером около 1Mb
5. В новой сцене сделал матрицу 100х100 таких же NURBS Plane-ов (стык встык)
толко теперь не фризя их трансформы.
6. Приатачил к ним шейдер типа земли и RibBox в котором сначала тоже прописал
ReadArchive "e:/projectsm/golf/riarchive/U60xV60x10unit.rib"
При таком раскладе rib весил копейки но при рендере рендермэн попытался
сожрать все архивы зараз и естественно подавился и сдох.
7. Копнул глубже в доку нашел выход.
8. В RibBox прописал
Procedural "DelayedReadArchive" \["e:/projectsm/golf/riarchive/u60xv60x10unit.rib" \] \[-6.2 6.2 -6.2 6.2 0.0 0.2\]
Теперь рендермэн стал подгружать архив только по мере его появления
в текущей зоне рендэра.

Правда я непойму одного:
При описании BoundingBox я сначала ставил \[-6.2 6.2 0.0 0.2 -6.2 6.2\]
но тогда появлялись дыры. Когда поменял на \[-6.2 6.2 -6.2 6.2 0.0 0.2\]
- полный порядок. Такое впечатление что майский Y для MTOR является Z.
----------------------------------------------------------------------

Недавно разбирался с Level of Detail (смотри тему чуть ниже)
и опять же с RibBox.
 
#8
Про IOR понял ...Проверил....Сенкс...

Лирическое отступление - Слушай ты ShadeTree естевсвенно переделовал под Prman...У меня это как то немно криво получилось шейдер компиляется Shader'om но расширение у него в серовно как у bmrt... И как прописать дифолтную директорию под компиляцию шейдеров...(лучше если если сможеш запакуй и пошли плиз мылом свои скрипты от ShadeTree буду очень признателен)...

А про риб бокс там засада имеено с созданием темплейта а не самого апиренса RibBox... Тоесть хотелось создать такой итерактивный темплейт для такого эпиранса который бы содержал гдето в себе RibBox и имелл некоторые переключалки...Типа свичей , просто параметров и тд.д И все эти параметры парсирись бы в Rib плюс еше читались параметры из сцены....Но это не происходит потомо что ...раждается огромное количество всеких ошибык....
Типа не находит Вижуалайзера , генирит какойто материал и упорно пытается его вставить в Rib и тд.....

А про твои навороты с RibBox это просто круто.....Но жаль что это все руками ..Бы ло бы круто сделать такую пипку жмеш на нее и все что ты делал само получается....Ну предположим появился вы в маи атриут у обекта что он типа читать его из архива....И сделать кнопку что если нужно экспортилось все в виде архива (Что то подобное сделано в MAXman и SoftMan)....Но это мечта незбыточна от нехватки информации и времени для ее исполнения....

И кстаи было бы круто предположим сделать еше такую кнопку жмеш и при экспорте в rib те обьекты которые не попадают своими охватываюшими боксами в пирамиду видимости камеры туда бы не парсирись...Ну т д.

Про Maya UI и рендерман Zи Y... Стабилизец что да!!! (Ну сетинги по дефолту в Maya можно правда переделать )А вот когда парсится вроде все должно быть OK! Вроде объекты то правильно ставятся вRib....
 
Сверху