2009年11月27日 星期五

把ptc拿來當color_bleeding


如果有bake好的ptc檔,可以利用color slbox讀取,當作是現成的color在用,以下例子是用在incandescence的color,串一個color slbox,目的是給shader一個bake好的color_bleeding效果,免去render時候bake ptc的時間

v1=ptc source file位置 (string)
v2= max distance value (float)
v3= indirectdiffuse (float)


string ptc_file = v1;

normal Nf = faceforward(normalize(N),I);
color IndDif = indirectdiffuse(P,Nf, 0,"filename",ptc_file,"pointbased",1, "maxdist", v2, "falloffmode", 1, "falloff", 1);

result = indDif *v3;

------------------------------------------------
更正寫法: 以下正確寫法,直接貼v1的顏色,不需要再做一次indirectdiffuse (IndDif)

string filename = v1;

normal Nf = faceforward(normalize(N),I);
color cbcolor=0;
texture3d(filename,P,normalize(N),"_indirectdiffuse",cbcolor);
result=cbcolor;

2009年11月25日 星期三

不被displacement影響的rimlight

rimlight + displacement常常會遇到很奇怪的現象,那就是整個有displace起來的邊都會有rimlight,但是如果只希望在物件邊緣有rim light效果的話請在rim node的shading normal上串個ribbox,寫法如下

SLBox (vector):

normal nn;
displacement("__Norig",nn);
result = normalize(nn);

以上script要配合寫好的displacement,前提是displacement本身已有產生shading normal

Set bakeLevel

常常用到sss的人會發現render時很慢,我們可以單獨的把有sss的shader在bake point cloud時shading rate 調小一點
直接在有sss的ensemble上面在Rib Box欄開個RIBBOX,寫法如下

[
set bakeLevel 5;

set oriShadingRate [mel "mtor control getvalue -rg shadingRate"]
if { $oriShadingRate <>
set oriShadingRate 1.0
}
set newShadingRate [expr $oriShadingRate * $bakeLevel ]
if (\$CONTEXT=="BAKECONTEXT") {
return "ShadingRate $newShadingRate"
}
]

Melscript for Renderman bake camera

這是一個自動產生一個camera給特定的renderman shader,並且自動把指定的sss traceset 都做好

if (`objExists sss_horse`)
{
select sss_horse;
mtor control attach mapgen "1400_D3VBi4i1000";
}
else
{
string $camera[] = eval("camera -centerOfInterest 5 -focalLength 35 -lensSqueezeRatio 1 -cameraScale 1 -horizontalFilmAperture 1.78 -horizontalFilmOffset 0 -verticalFilmAperture 1 -verticalFilmOffset 0 -filmFit Fill -overscan 1 -motionBlur 0 -shutterAngle 144 -nearClipPlane 0.01 -farClipPlane 1000 -orthographic 0 -orthographicWidth 30");
parent $camera[0] ju_c_horse_rig_h:root_ctl;
setAttr ($camera[0] + ".translateX") 41.524;
setAttr ($camera[0] + ".translateY") 33.507;
setAttr ($camera[0] + ".translateZ") 66.260;
setAttr ($camera[0] + ".rotateX") -12.938;
setAttr ($camera[0] + ".rotateY") 30.200;
setAttr ($camera[0] + ".rotateZ") 0.000;
setAttr -lock true ($camera[0] + ".tx");
setAttr -lock true ($camera[0] + ".ty");
setAttr -lock true ($camera[0] + ".tz");
setAttr -lock true ($camera[0] + ".rx");
setAttr -lock true ($camera[0] + ".ry");
setAttr -lock true ($camera[0] + ".rz");
setAttr -lock true ($camera[0] + ".sx");
setAttr -lock true ($camera[0] + ".sy");
setAttr -lock true ($camera[0] + ".sz");

select -r -ne $camera[0];
mtor control attach mapgen "1400_D3VBi4i1000";
rename $camera[0] "sss_horse";
}
if (`objExists horseSSSSet`==0)
{
select -cl;
select -tgl ju_c_horse_rig_h:hi_res;
MTORCreateTraceSet horseSSSSet;
}

melscript for different set of shader parameters

這是同事在公司寫的melscript,主要是給lighter設定不同組的shader參數,上面有三組分別為huge,normal跟tiny的shader參數可以選擇,三組個別有不同的specular跟bump的shader參數

global proc jingubang_selector(string $phase)
{
string $a = `slimcmd slim GetAppearances -name "Spec_jingubang"`;
string $b = `slimcmd slim GetAppearances -name "disp_jingubang"`;
string $c;
$a = `slimcmd $a GetProperties -name "Intensity"`;
$c = `slimcmd $b GetProperties -name "displacementbound"`;
$b = `slimcmd $b GetProperties -name "Kb"`;
if ($phase == "huge")
{
slimcmd $a SetValue 1.000;
slimcmd $b SetValue 0.0008;
slimcmd $c SetValue 0.0015;
}
if ($phase == "normal")
{
slimcmd $a SetValue 5.000;
slimcmd $b SetValue 0.015;
slimcmd $c SetValue 0.030;
}
if ($phase == "tiny")
{
slimcmd $a SetValue 1.000;
slimcmd $b SetValue 0.0015;
slimcmd $c SetValue 0.0030;
}

deleteUI -window ABCWin;
}

global proc surface_jingubang_selector()
{
if (`window -ex ABCWin`==true)
deleteUI -window ABCWin;

window -title "Selct Jingubang Size" ABCWin;
columnLayout -adjustableColumn 1;
button -label "Huge" -c "jingubang_selector(\"huge\")";
separator -h 10;
button -label "Normal" -c "jingubang_selector(\"normal\")";
separator -h 10;
button -label "Tiny" -c "jingubang_selector(\"tiny\")";
setParent ..;
showWindow ABCWin;
}

surface_jingubang_selector();

slim command under melscript

針對不同場景,shader參數常常需要有一組特定的參數,通常整組參數可用melscript記下來並且需要時來執行,避免每個場景都需要準備不同組palette.
slim command可以在melscript下執行,例如在slim cmd下輸入
slim GetAppearances -selected 1
melscript 前面必須再加一個指令slimcmd來執行
slimcmd GetAppearances -selected 1

2009年11月24日 星期二

如何用slim cmd改shader參數


常用的基本指令

選取想要的shader node在slim cmd下執行,來找出它的slim代號
slim GetAppearances -selected 1

或是可以直接用shader node的名字(Diffuse_2)來找出它的slim代號
slim GetAppearances -name "Diffuse_2"
通常它會output代號會類似 funcXXX等等 (XXX代表數字)

利用找出來的node代號在輸入並找出它的properties名字(Intensity)的代號
func9 GetProperties -name "Intensity"

再利用properties的代號來找出它的值
parm81 GetValue

我們可以利用SetValue來更改Diffuse_2的Intensity的值(0.5)
parm81 SetValue 0.5

或是一個command line 的話,如下
[[slim GetAppearances -name "Diffuse_2"] GetProperties -name "Intensity"] SetValue 0.5