用Houdini實現substance的warp節點


看同事在substance演示warp節點感覺比較牛逼,推了下方程:

 

SDF圖:

變形的圖:

結果:

 

 

Houdini里實現,第一步實現二維的gradient(sdf),形成二維的梯度場,因為一定要在uv空間操作,所以得在sop映射個uv.

把求出來的梯度放到N屬性上。為了方便的觀看向量.節點網絡:

 

 

<1>

grad節點是求二維的sdf的梯度

這里面的map 用的上面的sdf貼圖.

// sample sdf texture
float f_tex(string map;float u;float v){
    vector ret = texture(map,u,v);
    return (ret.x+ret.y+ret.z)/3;
}

float du,dv;
du = dv = 0.01;
string map = chs("map");


float u = @uv[0];
float v = @uv[1];


// cal df/du
float offul = clamp( u+du,0,1);
float offur = clamp( u-du,0,1);

float ul = f_tex(map,offul,v);
float ur = f_tex(map,offur,v);
float dfdu = (ur-ul)/ (2*du);

// cal df/dv
float offvl = clamp( v+du,0,1);
float offvr = clamp( v-du,0,1);
float vl = f_tex(map,u,offvl);
float vr = f_tex(map,u,offvr);
float dfdv = (vr-vl)/(2*du);


@N = set(dfdu,0,dfdv);

這一步可以得到grad向量:

 

 <2>

advect_warp節點 是對你的顏色貼圖 執行對流變形的過程:

這里面的map用的上面的棋盤格貼圖.

string map = chs("map");
float amp = -ch("amp")/100;  //這里的amp是變形強度,如果過大,會跟substance一樣得到uv紋理重復的效果,這個值比較敏感,畢竟uv->[0,1]區間

float u = @uv.x + @N[0]*amp;
float v = @uv.y + @N[2]*amp;


vector ret =  texture(map,u,v);
@Cd = ret;

 

結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM