用表达式制作点阵Shader【第一季】

用表达式制作点阵Shader【第一季】
众所周知,MAYA的材质系统三头六臂,功能非常灵活和强大。
这里我配合place2dTexture节点,使用表达式创建一个圆点阵列的Shader。
如图1 在Hypershade中创建一个Lambert材质节点(或其他类型如Blinn),一个place2dTexture节点。

如图2 按住Ctrl,双击节点,为节点重命名。把place2dTexture1节点命名为pl2d,lambert2名称可以不变,如果你想重命名 lambert2,则记得把表达式中使用lambert2的地方替换为你自己的名称。同时注意名称的大小写,因为后面的表达式中要使用名称,而不论MEL 还是表达式(Expression),对字母的大小写都很敏感。

如图3,执行Window | Animation Editor | Expression Editor(窗口 | 动画编辑器 | 表达式编辑器)。

如图4,在Expression Editor(表达式编辑器)中输入表达式(表达式的代码将在后面给出),单击Create即可。

如图5,加入表达式后,材质球已经发生了变化。

如图6,展开材质的上下游节点,可以看到,表达式节点把lambert2和place2dTexture节点连接了起来,

如图7,此时我们可以编辑lambert2,改变它的颜色(Color),并给一定的辉光(Glow Intensity)

如图8,将lambert2赋予场景中的物体,渲染,可以看到圆点阵列效果了。

//表达式代码
float $v= pl2d.outV*150;
float $u= pl2d.outU*150;
int $weight;
float $circle = ($v%5 – 2.5)*($v%5 – 2.5) + ($u%5 – 2.5)*($u%5 – 2.5);
if($circle < 2){ $weight = 1; } else{ $weight = 0; } if($weight == 0 ){ //$u = 0; //$v = 0; lambert2.transparencyR = 1; lambert2.transparencyG = 1; lambert2.transparencyB = 1; } else{ lambert2.transparencyR = 0; lambert2.transparencyG = 0; lambert2.transparencyB = 0; } 这里主要使用了place2dTexture节点的outU和outV属性,使用下面的公式来定义了圆形区域: (U-U0)*(U-U0) + (V-V0)*( V-V0) < R*R 并定义了一个整型的$weight权重变量,圆形内部设$weight为1,圆形外部设$weight为0。最后根据$weight来决定lambert2的透明度(transparency)。 明白了以上表达式的工作原理,我们表达式稍加改进,即可得到圆洞镂空效果。方法很简单,把原来透明的地方变为不透明,原来不透明的地方变为透明。代码如下: float $v= pl2d.outV*150; float $u= pl2d.outU*150; int $weight; float $circle = ($v%5 - 2.5)*($v%5 - 2.5) + ($u%5 - 2.5)*($u%5 - 2.5); if($circle < 2){ $weight = 1; } else{ $weight = 0; } // if($weight == 0 ){ 为圆点阵列Shader if($weight == 1 ){ //$u = 0; //$v = 0; lambert2.transparencyR = 1; lambert2.transparencyG = 1; lambert2.transparencyB = 1; } else{ lambert2.transparencyR = 0; lambert2.transparencyG = 0; lambert2.transparencyB = 0; } 结果如图9.
当然这里例子有些简单,你可以说 使用PS搞一张圆饼的贴图 + RepeatUV 一样可以实现,
更简单的,使用Ramp的Circular Ramp + RepeatUV也可以实现。
不过可以肯定的是,有了place 2DTexture的outU和outV,你几乎可以定义任意自己喜欢的程序纹理,写个五角星, 砖块,大理石,木纹什么的,都不在话下,我上面是把输出连到Transparency上了,你也可以连接到Color,Bump等。方法就这样,能写出什么样的纹理就看个人的图形学积累了。
在【用表达式写Shader第二季】里,笔者会介绍更多的表达式Shader。
http://www.cg-discovery.com/article.asp?id=8

作者: hmaya

developer!

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

发表评论

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