2009年12月9日 星期三

SSS parameters from Renderman Manual

refraction for twelve materials from [Jensen01]:
                 albedo              dmfp                ior
apple 0.846 0.841 0.528 6.96 6.40 1.90 1.3
chicken1 0.314 0.156 0.126 11.61 3.88 1.75 1.3
chicken2 0.321 0.160 0.108 9.44 3.35 1.79 1.3
cream 0.976 0.900 0.725 15.03 4.66 2.54 1.3
ketchup 0.164 0.006 0.002 4.76 0.58 0.39 1.3
marble 0.830 0.791 0.753 8.51 5.57 3.95 1.5
potato 0.764 0.613 0.213 14.27 7.23 2.04 1.3
skimmilk 0.815 0.813 0.682 18.42 10.44 3.50 1.3
skin1 0.436 0.227 0.131 3.67 1.37 0.68 1.3
skin2 0.623 0.433 0.343 4.82 1.69 1.09 1.3
spectralon 1.000 1.000 1.000 inf inf inf 1.3
wholemilk 0.908 0.881 0.759 10.90 6.58 2.51 1.3

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