2009年4月30日 星期四

(8)簡單介紹RenderMan Shading Language

也該寫點有關RenderMan Shading Language的東西了,不過這篇只是單純介紹如何操作*.sl。如同C++的檔案副檔名為cpp,RenderMan Shading Language的副檔名為sl。以artist的觀點,這篇可以說跟slim沒很大的關係,跳過這篇,一樣可以在slim上拉shader;以 programmer的觀點,會覺得關係可大了,畢竟slim裡的node,其核心都是SL code。所以如果要玩SL code的人,好歹也要修過Data Structure或是Numerical Analysis等較進階的程式課程。(深深覺得....除非是天資過人,萬中選一的高手,不然如果光是K完一本初階的C語言之類的,就出去跟人家說會寫程式,還蠻牽強的 XD)SL code語法跟C語言很像,也是結構式語言,一樣用//和/*....*/來做註解,只是宣告的資料型態不盡相同,例如SL有float、color、point、normal等,但是沒有int和double。

這篇是對surface shader和displacement shader各舉一個例子來介紹。參考資料為:
㊣http://www.fundza.com/
㊣The RenderMan Companion (Steve Upstill)
使用工具為prman

◎可以先新增一個空的資料夾,把會用到的檔案集中到此處。這裡是在G槽下新增一個名為ooxx的folder。

















◎先小小介紹一下surface shader和displacement shader較常用到的內建變數(較詳細的介紹,還是要看這個比較好:http://www.fundza.com/rman_shaders/surface/sl_surface1.html 以及 http://www.fundza.com/rman_shaders/displacement/ds_displacement1.html)

###################################################################
Ciobject表面顯現的顏色 (output)
Oiobject表面顯現的透明度 (output)
Csobject原始的顏色 (input)
Osobject原始的透明度 (input)
Nobject表面的法向量(三維向量)
s, t:object表面的貼圖座標(可以想成國中學的(x,y)直角座標),其範圍皆為0到1,也就是說(0.5, 0.5)會落在座標的中間
P
object表面的point的值(三維向量)
###################################################################

◎開啟一個空的記事本,key入以下內容:
surface /*宣告surface shader function,所宣告的function名稱為noise_test1*/
noise_test1(float Kfb = 1,
amp = 0.8, /* amplitude of the noise */
freq = 9; /* frequency of the noise */
color top = (1,0,0) /* 方片上方的顏色 */,
lower = (1,1,0)/* 方片下方的顏色 */)
{
// Noise values range from 0 to 1.
float ns =noise(s * freq, t * freq);

// Offset the true value of 't'. The 'amp' parameter will allow
// the artist to strengthen or weaken the visual effect.
float tt = t + ns * amp;

/* 將上方的顏色和下方的顏色,沿著tt做混合(mix),並將其assign給一個type為color的變數surfcolor */
color surfcolor = mix(top, lower, tt);
Oi = Os;

/* object表現的顏色=透明度*object底色*混合後的顏色*Kfb (此處的Kfb是控制object顯示出來的亮度)*/
Ci = Oi * Cs * surfcolor * Kfb;
}

然後另存為SurfaceShaderTest.sl。開啟命令提示字元,在G:\ooxx底下輸入shader SurfaceShaderTest.sl (要記得設好prman的環境變數),按下Enter後可以看到這樣的訊息:noise_test1: compiled,表示已經在ooxx這個資料夾底下產生了一個noise_test1.slo檔。用prman的shader來編譯*.sl所產生的檔案,其副檔名為slo,也就是在使用在rib中的shader名稱,同時也是選告surface shader時的function名稱。







◎然後開啟一個空的記事本,貼上以下內容:
Hider "hidden"
LightSource "distantlight" 1
Projection "perspective"
Translate 0 0 1.5
Rotate 40 -1 1 0
FrameBegin 2
Display "test2.jpg" "framebuffer" "rgba"
WorldBegin
Rotate 10 0 0 1
Surface "G:/ooxx/noise_test1"
Polygon "P" [0.5 0.5 0.5 -0.5 0.5 0.5 -0.5 -0.5 0.5 0.5 -0.5 0.5 ]
Rotate 90 0 1 0
Polygon "P" [0.5 0.5 0.5 -0.5 0.5 0.5 -0.5 -0.5 0.5 0.5 -0.5 0.5 ]
Rotate 90 0 1 0
Polygon "P" [0.5 0.5 0.5 -0.5 0.5 0.5 -0.5 -0.5 0.5 0.5 -0.5 0.5 ]
Rotate 90 0 1 0
Polygon "P" [0.5 0.5 0.5 -0.5 0.5 0.5 -0.5 -0.5 0.5 0.5 -0.5 0.5 ]
Rotate 90 1 0 0
Polygon "P" [0.5 0.5 0.5 -0.5 0.5 0.5 -0.5 -0.5 0.5 0.5 -0.5 0.5 ]
Rotate 180 1 0 0
Polygon "P" [0.5 0.5 0.5 -0.5 0.5 0.5 -0.5 -0.5 0.5 0.5 -0.5 0.5 ]
WorldEnd
FrameEnd

紅色註記的部份,即為剛剛產生的*.slo的完整路徑。將其另存為Simple_Cube.rib(這個*.rib只是產生一個cube而已)。如果將Surface "G:/ooxx/noise_test1" 改成
Surface "G:/ooxx/noise_test1"
"top" [0.878 0.996 0.474] "lower" [0.580 0.690 0.988]
即可將top, lower原本的值,改成中括號內的數值,依此類推。slim的node上的參數也是由此而來。注意~只有宣告為引數的變數可以這樣使用~

◎然後在命令提示字元裡,key入prman Simple_Cube.rib。







即可看到下圖

















◎再開啟一個空的記事本,key入:
displacement ripple1/*宣告一個名稱為ripple1的displacement shader*/
(float Km = 0.004,
numripples = 8,
a = 0.3,
b = 0.25)
{
float sdist = s - a,
tdist = t - b,
//計算object表面每一點(s,t)到(a,b)的距離(dist)
dist = sqrt(sdist * sdist + tdist * tdist),

//將dist餵給sin,以在object表面做sin波。
hump = sin(dist * 2 * PI * numripples);

//將N做normalize,然後assign給一個type為normal(三維向量)的變數n。
normal n = normalize(N);

//將object表面的點,延n做位移(displacement)
P = P - n * hump * Km;
//P位移過後,再重新計算每個P的法向量,然後assign給N
N = calculatenormal(P);
}


將其另存為DisplacementShaderTest.sl。一樣用shader這個command來compile這個*.sl,可以得到一個ripple1.slo。








◎將上面那個*.rib,用紅色註記的部份,換成Displacement "G:/ooxx/ripple1",然後用prman去render即可看到如下結果

4 則留言:

  1. 可以把code貼到下面的網址
    http://formatmysourcecode.blogspot.com/

    有空可以試試喔!

    回覆刪除
  2. 棒啊!好少有Renderman中文網,要常更新啊求!!
    問個問題,公司是用RAT 6.5,maya select obj可以在slim找出現obj所用shader,家用Renderman studio 1.0.1,但Renderman studio 1.0.1好像沒有這功能.

    回覆刪除
  3. 對RMS還不熟 @@
    只知道RMS是將slim裡拉好的shader,add到maya裡成一個shading group,再assign給object。所以....可能是用maya對材質球的操作就可以知道object用的是什麼shader了

    ps:看來這位也是公司同事,但是我好像不認識的樣子 我在公司還很菜的說....@@"

    回覆刪除
  4. 不是你公司同事..我更菜...

    回覆刪除