Layer shader 的筆記!

各位可在這裡交流有關RenderMan的問題和分享制作經驗

Layer shader 的筆記!

文章ChildPark » 21日 8月 2003年, 09:30

透明值的計算
surface road2(
float Ka = 1,
Kd = 0.5,
frezz = 0.05;
color backcol = color(1,0,0),
sidecol = color(1,1,1)
)
{
normal Nf = faceforward(normalize(N), I);
vector V = normalize(I);

float side = (step(0, t) - step(0.1, t)) + (step(0.9, t) - step(1, t));
if(side <= 0.01){
side = 0;
}else{
side = 1;
}
Oi = side;
color final = mix(backcol, sidecol, side);
Ci = Oi * final * (Ka * ambient() + Kd * diffuse(Nf));
}
附加檔案
opac.jpg
opac.jpg (10.74 KiB) 被瀏覽 9033 次
最後由 ChildPark 於 4日 9月 2005年, 23:22 編輯,總共編輯了 2 次。
ChildPark
CGV討論區會員
CGV討論區會員
 
文章: 315
註冊時間: 2日 6月 2002年, 12:03
來自: Hong Kong

Layer Texture

文章ChildPark » 4日 9月 2003年, 09:02

一齊
附加檔案
opaccol.jpg
opaccol.jpg (7.13 KiB) 被瀏覽 9033 次
ChildPark
CGV討論區會員
CGV討論區會員
 
文章: 315
註冊時間: 2日 6月 2002年, 12:03
來自: Hong Kong

文章ChildPark » 4日 9月 2005年, 23:24

float rside指定在 t 方向的位置,用step產生兩個在0-0.1和0.9-1的范圍內的1(真)區域,它們定立1的數值(真區域,詳細說明在c/c++的書籍內),以上數值范圍區域以外的定立為0的數值(假區域,詳細說明在c/c++的書籍內) ,然後可用表達式附加條件給它,將它的表達范圍值改變,if-else可幫助改變表達區范圍的值。
補充︰在step function內0和1是一個代號,作為往後的color或透明的詳細表達區。

if(side <= 0.01){
side = 0;
}else{
side = 1;
}
這表達式是詳細說明if(side范圍內的值小過或相等於0.01){side便相等於0;}else{side便相等於1},用if-else這方法可改變side的區域,例如將if(side范圍內的值大過或相等於0.01){side便相等於0;}else{side便相等於1},往後color或透明的詳細表達區,將不同了。

Oi = side;
Oi會將side內0區域的范圍取走。

color final = mix(backcol, sidecol, side);
mix function會將side范圍內0和1區域分發顏色給它,backcol為0區域,sidecol為1區域,,因為Oi會將side內0區域的范圍取走,所以只看見1區域的顏色sidecol。

如果有很多的layer層便可詳盡分發0和1值給它們,顏色也同樣理論。

如果基礎不好很難再往前進步,以上的例子在很多復雜的Procedure shader中常預見,資深的編寫者會將它們分層來表達存在的顏色,令變化更加多姿多彩。
ChildPark
CGV討論區會員
CGV討論區會員
 
文章: 315
註冊時間: 2日 6月 2002年, 12:03
來自: Hong Kong

文章ChildPark » 4日 9月 2005年, 23:25

surface runway(
float Ka = 1,
Kd = 0.5,
frezz = 0.05,
numb = 4;
color backcol = color(0.5,0.5,0.5),
tracecol = color(0,0,0),
sidecol = color(1,1,1)
)
{
normal Nf = faceforward(normalize(N), I);
vector In = normalize(I);

/* layer1 sideway white */
float side = (step(0, t) - step(0.08, t)) +( step(0.92, t) - step(1, t));

if(side < 0.1){
side = 0;
}else{
side = 1;
}
Oi = side;
color sideway = mix(tracecol, sidecol, side);

//layer2 midway
float mid = mod(t * numb,1);
float ss = (step(0.25,mid) - step(0.3,mid)) + (step(0.7,mid) - step(0.75,mid));

point SurP = transform("object", P);
float FP = noise(SurP)* 0.5;
float PP = FP * ss;
color midway = mix(backcol,tracecol,PP);

color final = midway + sideway ;

Oi = Os;
Ci = Oi * final* (Ka * ambient() + Kd * diffuse(Nf));
}
附加檔案
runway.jpg
runway.jpg (8.16 KiB) 被瀏覽 9031 次
ChildPark
CGV討論區會員
CGV討論區會員
 
文章: 315
註冊時間: 2日 6月 2002年, 12:03
來自: Hong Kong

文章ChildPark » 4日 9月 2005年, 23:26

surface textmap(
float Ka = 1,
Kd = 0.4;
color backcol = color(0.2,0.2,0.2),
sidecol = color(1,1,1);
string textmap = "";
)
{
normal Nf = faceforward(normalize(N), I);
vector In = -normalize(I);

/* layer1 sideway white color */
float side = (step(0, t) - step(0.03, t)) +( step(0.97, t) - step(1, t));

if(side <= 0.01){
side = 0;
}else{
side = 1;
}

Oi = side;
//color sideway = mix(backcol, sidecol, side);

/* layer 2 TextureMap*/
if(textmap != "");
float opac = float texture(textmap[3], s, t) - side ;
color Ct = color texture(textmap, s, t) + (1 opac) * Cs;

Ci = Ct * (Ka * ambient() + Kd * diffuse(Nf));
}
附加檔案
finalT.jpg
finalT.jpg (27.61 KiB) 被瀏覽 9030 次
ChildPark
CGV討論區會員
CGV討論區會員
 
文章: 315
註冊時間: 2日 6月 2002年, 12:03
來自: Hong Kong

文章ChildPark » 4日 9月 2005年, 23:26

surface texmap(
float Ka = 1,
Kd = 0.4;
color backcol = color(0.2,0.2,0.2),
sidecol = color(1,1,1);
string textmap = "";
)
{
normal Nf = faceforward(normalize(N), I);
vector In = -normalize(I);

/* layer1 sideway white */
float side = (step(0, t) - step(0.03, t)) +( step(0.97, t) - step(1, t));

if(side <= 0.01){
side = 0;
}else{
side = 1;
}

Oi = side;
color sideway = mix(backcol, sidecol, side);

Ci = Oi * sideway * (Ka * ambient() + Kd * diffuse(Nf));
}
附加檔案
finalS.jpg
finalS.jpg (18.69 KiB) 被瀏覽 9027 次
ChildPark
CGV討論區會員
CGV討論區會員
 
文章: 315
註冊時間: 2日 6月 2002年, 12:03
來自: Hong Kong

文章ChildPark » 4日 9月 2005年, 23:27

surface texmap(
float Ka = 1,
Kd = 0.4;
color backcol = color(0.2,0.2,0.2),
sidecol = color(1,1,1);
string textmap = "";
)
{
normal Nf = faceforward(normalize(N), I);
vector In = -normalize(I);

/* layer1 sideway white */
float side = (step(0, t) - step(0.03, t)) +( step(0.97, t) - step(1, t));

if(side <= 0.01){
side = 0;
}else{
side = 1;
}

Oi = side;
color sideway = mix(backcol, sidecol, side);

/* layer 2 TextureMap*/
if(textmap != "");
float opac = float texture(textmap, s, t) - side;
color Ct = color texture(textmap, s, t) + (1 - opac) * sideway;

Ci = Ct * (Ka * ambient() + Kd * diffuse(Nf));
}
color和texture合成的方法︰
color的區域在前面的貼內已經詳盡解釋了,現下只解釋合成texture的方法,先表達texture文件if(textmap != "");,然後用texture的區域減去side的區域,這樣便會將texture的1(真區域) 代入side的0區域,另外side的1區域便會和texture的1值雙減掉,便會產生相反的區域代入結果。
然後便做顏色合成的方法,先用texture作上層的表現,再用float opac區域作mask的用途,但請注意因為先前做了區域逆反的工作,所以要將它的0和1區域做回原有位置,所以是這樣做(1 - opac) ,因為它是mask所有我將它加入,然後雙乘顏色便成。
shader的構建很多時需注意0和1的區域分布,如果不懂這思考區分0和1的區域,可用繪畫圖案區分它們的區域,然後作分析,也是很好的幫助方法
附加檔案
finalT&S.jpg
finalT&S.jpg (32.59 KiB) 被瀏覽 9025 次
ChildPark
CGV討論區會員
CGV討論區會員
 
文章: 315
註冊時間: 2日 6月 2002年, 12:03
來自: Hong Kong

文章ChildPark » 4日 9月 2005年, 23:27

surface muiltlayer(
float Ka = 1,
Kd = 0.5;
color col = color(1,1,1);
color col1 = color(1,0,0);
color col2 = color(0,1,0);
color col3 = color(0,0,1);
color bg = color(0,0,0);
)
{
float fuzz = 0.005;
normal Nf = faceforward(normalize(N), I);

/* Layer 1 color */
float ss1 = smoothstep(0-fuzz, 0+fuzz, s) - smoothstep(0.2, 0.2+fuzz, s);
float tt1 = smoothstep(0-fuzz, 0+fuzz, t) - smoothstep(0.2, 0.2+fuzz, t);
float comp1 = ss1* tt1;
color layer1 = mix(bg, col, comp1);

/* Layer 2 color */
float ss2 = smoothstep(0.2-fuzz, 0.2+fuzz, s) - smoothstep(0.4, 0.4+fuzz, s);
float tt2 = smoothstep(0.2-fuzz, 0.2+fuzz, t) - smoothstep(0.4, 0.4+fuzz, t);
float comp2 = ss2 + tt2;
color layer2 = mix(layer1, col1, comp2);

/* Layer 3 color */
float ss3 = smoothstep(0.4-fuzz, 0.4+fuzz, s) - smoothstep(0.6, 0.6+fuzz, s);
float tt3 = smoothstep(0.4-fuzz, 0.4+fuzz, t) - smoothstep(0.6, 0.6+fuzz, t);
float comp3 = ss3 + tt3;
color layer3 = mix(layer2, col2, comp3);

/* Layer 4 color */
float ss4 = smoothstep(0.6-fuzz, 0.6+fuzz, s) - smoothstep(0.8, 0.8+fuzz, s);
float tt4 = smoothstep(0.6-fuzz, 0.6+fuzz, t) - smoothstep(0.8, 0.8+fuzz, t);
float comp4 = ss4 + tt4;
color final = mix(layer3, col3, comp4);

Oi = Os;
Ci = Oi * final * (Ka * ambient() + Kd * diffuse(Nf));
}
附加檔案
muiltlayer.jpg
muiltlayer.jpg (24.75 KiB) 被瀏覽 9023 次
ChildPark
CGV討論區會員
CGV討論區會員
 
文章: 315
註冊時間: 2日 6月 2002年, 12:03
來自: Hong Kong

文章ChildPark » 4日 9月 2005年, 23:32

這pattern是運用smoothstep() function和mix() function,然後作合成,這兩個功能很常用,所以順便詳細解釋它的設置模式,其實在以前寫的shader筆記下已經有step線行,分區的圖像了,現下只解釋我寫Pattern 的區域分發想法,其實在數學上還有很多方法做到這效果,大家可動腦筋想其它的方法。

RenderMan常用作texture的方向名稱 s和t,物體表面的網線方向名稱是u和v,如果mapping的時候便需注意它們的一致性,當texture是逆反的情況發生,便需修改shader的方向或在mapping的時候調節它。
附加檔案
textureFunction.jpg
textureFunction.jpg (45.33 KiB) 被瀏覽 9018 次
ChildPark
CGV討論區會員
CGV討論區會員
 
文章: 315
註冊時間: 2日 6月 2002年, 12:03
來自: Hong Kong

文章ChildPark » 4日 9月 2005年, 23:35

先解釋smoothstep(float min 0, float max 1, value)
它主要將s或t方向內設置為0或1的區域,以下的區域code是這樣寫的︰

float sdir = smoothstep(0, 0+0.005, s) smoothstep(0.2, 0.2+0.005, s);
附加檔案
step1Function.jpg
step1Function.jpg (41.16 KiB) 被瀏覽 8996 次
最後由 ChildPark 於 4日 9月 2005年, 23:46 編輯,總共編輯了 2 次。
ChildPark
CGV討論區會員
CGV討論區會員
 
文章: 315
註冊時間: 2日 6月 2002年, 12:03
來自: Hong Kong

文章ChildPark » 4日 9月 2005年, 23:35

/* Layer 1 color */
float ss1 = smoothstep(0-fuzz, 0+fuzz, s) - smoothstep(0.2, 0.2+fuzz, s);
float tt1 = smoothstep(0-fuzz, 0+fuzz, t) - smoothstep(0.2, 0.2+fuzz, t);
float comp1 = ss1+tt1;
color layer1 = mix(bg, col, comp1);

解釋︰由s方向的0開始至0.2的區域內會作為1區域,0.2數值外全部為0。
mix() function的配合︰
mix(float min 0, float max 1, value) ,它也用數值0和1分別界定,我只要將2種不同的顏色放置在0或1的區域,它們便有分別了,主要詳細分發區域的重要資料要放在value內。
mix(red, green, sdir) 這樣便能將紅色放在0區域,綠色放在1區域了,同樣模式做t方向的smoothstep,便得出以下區域了。
附加檔案
stepSTFunction.jpg
stepSTFunction.jpg (40.83 KiB) 被瀏覽 8992 次
最後由 ChildPark 於 4日 9月 2005年, 23:47 編輯,總共編輯了 1 次。
ChildPark
CGV討論區會員
CGV討論區會員
 
文章: 315
註冊時間: 2日 6月 2002年, 12:03
來自: Hong Kong

文章ChildPark » 4日 9月 2005年, 23:36

如果將ss1和tt1,2個區域雙乘結果是這樣︰
附加檔案
muiltlayer1.jpg
muiltlayer1.jpg (10.03 KiB) 被瀏覽 9011 次
ChildPark
CGV討論區會員
CGV討論區會員
 
文章: 315
註冊時間: 2日 6月 2002年, 12:03
來自: Hong Kong

文章ChildPark » 4日 9月 2005年, 23:38

1*0或者0*1的結果都是0,1*1的結果便是1,結果是只有左上方的0-0.2區域是1數值了。
ChildPark
CGV討論區會員
CGV討論區會員
 
文章: 315
註冊時間: 2日 6月 2002年, 12:03
來自: Hong Kong

文章Wolf » 4日 9月 2005年, 23:40

老弟你最近見點?仲玩緊呢味野丫?好耐冇見,事變人遷,舊時果度成個廢墟咁滯,真冇眼睇。不過你的確精神可嘉,繼續努力!
Wolf
討論區主持
討論區主持
 
文章: 260
註冊時間: 26日 2月 2002年, 08:00

文章ChildPark » 4日 9月 2005年, 23:44

從以上的模式便可做第Layer2的smoothstep了︰
/* Layer 2 color */
float ss2 = smoothstep(0.2-fuzz, 0.2+fuzz, s) - smoothstep(0.4, 0.4+fuzz, s);
float tt2 = smoothstep(0.2-fuzz, 0.2+fuzz, t) - smoothstep(0.4, 0.4+fuzz, t);
float comp2 = ss2+tt2;
color layer2 = mix(layer1, col1, comp2);
附加檔案
stepST2Function.jpg
stepST2Function.jpg (40.83 KiB) 被瀏覽 9001 次
ChildPark
CGV討論區會員
CGV討論區會員
 
文章: 315
註冊時間: 2日 6月 2002年, 12:03
來自: Hong Kong

下一頁

回到 Pixar's RenderMan

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客

cron