Maya表达式写Shader【第二季】

更多基础操作见 Maya表达式写Shader【第一季】 : http://www.cg-discovery.com/article.asp?id=10
Step1.在Hypershade中创建一个Lambert材质节点(或其他类型如Blinn),一个place2dTexture节点。
Step2.按住Ctrl,双击节点,为节点重命名。把place2dTexture1节点命名为pl2d,lambert2名称可以不变,如果你想重命名lambert2,则记得把表达式中使用lambert2的地方替换为你自己的名称。同时注意名称的大小写,因为后面的表达式中要使用名称,而不论MEL还是表达式(Expression),对字母的大小写都很敏感。
Step3.执行Window | Animation Editor | Expression Editor(窗口 | 动画编辑器 | 表达式编辑器)。
Step4.在Expression Editor(表达式编辑器)中输入表达式(表达式的代码将在后面给出),单击Create即可。(代码如下)
Step5.此时我们可以编辑lambert2,改变它的颜色(Color),将lambert2赋予场景中的物体,渲染,可以看到表达式Shader效果了。
//expression
float $v= pl2d.outV*150;
float $u= pl2d.outU*150;
float $weight;
float $A_block = ($v%10)*($v%10) + ($u%10)*($u%10);
float $B_block = ($v%10)*($v%10) + ($u%10 – 10)*($u%10 – 10);
float $C_block = ($v%10 – 5)*($v%10 – 5) + ($u%10 – 5)*($u%10 – 5);
if($A_block > 25 && $B_block > 25 && $C_block < 25){ $weight = 0; } else{ $weight = 0.1; } lambert2.transparencyR = $weight; lambert2.transparencyG = $weight; lambert2.transparencyB = $weight; 原理图:
结果:

原理:

你可以设置$repeatUV,重复纹理次数
你可以设置$n_star,得到n角星
如果用到时,而你又不想在ps里画贴图或者有锯齿问题,那你可以选择我写的这个工具:)
/////////////////////n_star OK///////////////////////////////
//created by hmaya at 2007.8.27
//texture
/////////////////////n_star OK///////////////////////////////
int $repeatUV = 15;
int $n_star = 5;
float $V= pl2d.outV*10*$repeatUV;
float $U= pl2d.outU*10*$repeatUV;
float $u = $U%10;
float $v = $V%10;
float $R = 5;
float $r = 2;
float $alpha = deg_to_rad(180/$n_star);
float $beta = atan($r*sin($alpha)/($R-$r*cos($alpha)));
float $Rm = $r*sin($alpha)/sin($beta);
int $weight;
int $weights[];
int $sum = 0;
int $i;
for($i=0;$i<$n_star;$i++){ float $theta_Rc = deg_to_rad(45 + $i*360/$n_star); float $Rc_x = $R*cos($theta_Rc) + 5; float $Rc_y = $R*sin($theta_Rc) + 5; vector $RO = <<5-$Rc_x, 5-$Rc_y, 0>>;
vector $RP = <<$u-$Rc_x,$v-$Rc_y,0>>;
vector $P_v = <<$u-5,$v-5,0>>;
vector $R_v = <<$Rc_x-5,$Rc_y-5,0>>;
//if( mag($RP)< $Rm && angle($RO,$RP)<$beta || mag($P_v)< $r && angle($P_v,$R_v)<$alpha) if( mag($RP)< $Rm && angle($RO,$RP)<$beta || mag($P_v)< $r) {$weights[$i] = 1;} else {$weights[$i] = 0;} $sum += $weights[$i]; } if($sum >0){
$weight = 0;
}
else{
$weight = 1;
}
lambert2.transparencyR = $weight;
lambert2.transparencyG = $weight;
lambert2.transparencyB = $weight;

下面这个是真正的shader。你需要再创一个名之为lambert3的材质,你可以为lambert3添加贴图或者其他属性,反正我只用了lambert3的outColor,其他下游的东西你可以任意编辑。
//V = 0.3* RR + 0.59* GG + 0.11* BB
这个公式是从RGB中得到亮度
因为是自己写的纹理,所以纹理单元的半径是可以控制的,
使用从lambert3得来亮度信息控制纹理半径,对了,亮的地方半径小,暗的地方半径大,于是。。。
///////////////shader//////////////////
//created by hmaya at 2007.8.31
// shader
///////////////////////////////////////
int $n_star = 6;
float $Luminance = 0.3*lambert3.outColorR + 0.59*lambert3.outColorG + 0.11*lambert3.outColorB;
int $repeatUV = 80;
float $R = 4*( 1-$Luminance) + .2;
float $V= pl2d.outV*10*$repeatUV;
float $U= pl2d.outU*10*$repeatUV;
float $u = $U%10;
float $v = $V%10;
float $alpha = deg_to_rad(180/$n_star);
float $Rm = $R*cos($alpha);
int $weight;
int $weights[];
int $sum = 0;
int $i;
for($i=0;$i<$n_star;$i++){ float $theta_Rc = deg_to_rad(0 + $i*360/$n_star); float $Rc_x = 5 + $Rm*cos($theta_Rc); float $Rc_y = 5 + $Rm*sin($theta_Rc); vector $OP= <<$u-5,$v-5,0>>;
vector $OR = <<$Rc_x-5,$Rc_y-5,0>>;
if( mag($OP)*cos(angle($OP,$OR)) < $Rm && mag($OP)< $R && angle($OP,$OR)<$alpha) {$weights[$i] = 1;} else {$weights[$i] = 0;} $sum += $weights[$i]; } if($sum >0){
$weight = 0;
}
else{
$weight = 1;
}
lambert2.colorR = $weight;
lambert2.colorG = $weight;
lambert2.colorB = $weight;

作者: hmaya

developer!

看完不过瘾?点此向作者提问

《Maya表达式写Shader【第二季】》有4个想法

  1. 豪哥啊.真的有段时间没有和你联系了…我是清卯阿…上海这段时间恐怕去不了..回到家开始掂起笔画画…恩,别的也没什么说的..给你看我得最近的练习..
    一边绘画,一边学习研究制作digital double.毛发的问题解决了..目前卡在skin shader上了..关于maya节点能否有更多的讲解..给我在skin shader上有一些启发呢..谢谢了

发表评论

邮箱地址不会被公开。 必填项已用*标注