本篇将讨论三个着色器,分别是Ray switch shader,AO(Ambient Occlusion) shader以及Wireframe shader。
Ray switch shader 光线开关着色器
- Ray switch是一个独特而又强大的着色器,它允许给不同光线指定不同着色器,或者关闭某一光线着色器,例如把指定对象的镜面反射颜色改为红色。这可以减少着色的复杂度,从而节省渲染时间,也可以增加着色的艺术控制。也可以用来移除不必要的次要光线(Specular/SSS)以及控制阴影透明度的颜色、仿真光散射穿过皮肤组织、或只给摄像机增加次要镜面反射;
- 类似还有Ray Switch RGBA,用来调整色彩;
- 新版Arnold不需要在材质栏中单独创建一个Ray swith着色器,而是通过Standard_surface的Network editor,添加ray_switch_shader节点的方法将其调出。
举个栗子:
示例场景中用了非常简单的几个对象:一个小人模型,一面镜子,灯光使用Arnold Sky。
① 选择你所需要添加ray_switch_shader的着色器(示例中我选的是小人的皮肤);
② 在选中的皮肤着色器的Network Editor中新建ray_switch_shader,将其连接到Arnold Beauty端口;
③ 此时,在IPR Window中可以看到小人及镜子里的反射变成了黑色,因为还未给Ray switch定义任何属性;
④ 将之前的皮肤着色器节点(standard_surface)连接到Ray switch的Camera以及Specular reflection,即可看到恢复到最初的效果,也就是说,把皮肤着色器的属性赋予给了Camera和Specular reflection,利用皮肤着色器来控制Ray switch的Camera和Specular reflection;
④ 另外新建一个standard_shader,将Base颜色改为红色,并重命名为“red”,将“red”连接到Ray switch的Specular reflection,现在可以看到小人镜子里的影子变成了红色,也就是说,现在Ray switch的Specular reflection属性由“red”控制;
⑤ 新建一个state_vector节点,连接到Ray switch的Diffuse reflection,此时Ray switch的Diffuse reflection便会根据state_vector来计算;
Ray switch参数详解:
【Camera】计算Camera光线时,插入你想要使用的着色器的输出。比如前面用皮肤着色器来控制。
【Shadow】 对物体上的透明阴影进行着色器控制。 此参数可以将Ray Switch着色器连接到标准表面着色器的Opacity参数。 这样你就可以得到一个不同于对象实际透明度的阴影。 例如,要减少对象投射的阴影量,或使用一个镂空的不透明图案。必须要使用Arnold标签关闭透明度(Opaque)才可以看到效果。
再次强调,所有涉及透明度的对象,都要关闭Opaque。
例如,将场景中阴影颜色改为红色:
新建standard_shader→重命名为red→提高red节点Transmission权重,并将Transmission颜色改为红色→连接到Ray switch的Shadow
注意:是改变节点中Transmission的属性,对象关闭Opaque:
【Diffuse reflection】计算Diffuse reflection光线时,插入你想要使用的着色器的输出。
【Diffuse transimission】计算Diffuse transimission光线时,插入你想要使用的着色器的输出。
【Specular reflection】计算Specular reflection光线时,插入你想要使用的着色器的输出。
【Specular transimission】计算Specular transimission光线时,插入你想要使用的着色器的输出。
【Volume】计算Volume光线时,插入你想要使用的着色器的输出。
具体效果我就不多做演示了,大家多试一下,如果遇到了什么问题,可以在评论区留言。
Ambient occlusion 环境吸收着色器
- Ambient occlusion常用来模拟全局照明(GI, global illumination),可以说是全局照明的“近似”模式,它可以仿真场景中对象漫反射之间的复杂交互。
- 以前使用GI非常耗时(现在也不怎么节能啊),所以设计师们经常使用AO来大致模拟GI。Ambient occlusion虽然不是完全符合物理真实(相对于完全使用GI),但是渲染速度非常快,并且可以产生逼真的效果。
- 现在大多用AO来增加细节,比如给对象边角增加一些破损、污渍等。
- AO本质上是在上半球中发射一些光线,这些光线由阴影点切面定义。AO发出光线的击中率除以光线总数的比率作为颜色返回。当光线命中率 / 总光线=0时,输出被视为完全未遮挡或“明亮”(默认情况下为白色);当光线命中率 / 总光线=1时,输出被视为完全遮挡或“黑暗”(默认情况下为黑色);在两者之间,有这两个值的线性插值。
Ambient occlusion调出方法:
同Ray switch,新版Arnold中也是利用在Network Editor中添加节点的方式调出Ambient occlusion。
Ambient occlusion参数详解:
【Samples】控制发射的光线数量,以计算发射光线数/总比例。 增加样本数量可以减少噪点得到更好的渲染质量。
【Spread】法线向量N周围的角度扩展,范围[0,1],其中1映射到90度(完整的半球)。 1.0是最常见的值。 其他值可能会产生无用的结果。
【White】光线击中率/总光线=0时(完全未遮挡)的输出颜色。
可以将白色属性更改为白色以外的颜色以实现特定外观:
【Black】光线击中率/总光线=1时(完全遮挡)的输出颜色。 对于特定的外观,可以将黑色属性更改为黑色以外的颜色。 例如,可以用于着色地板阴影的颜色:
【Falloff】沿光线距离的遮挡的指数衰减率。 它与遮挡光线击中的半透明表面不兼容。
【Near clip】Sample的最小遮挡范围。
【Far clip】Sample的最大遮挡范围。
【Normal】输出一个法向量可以连接到ambocc,lambert和standard_surface的常规参数中。
【Invert nomals】该属性改变被跟踪光线的方向。 当它关闭时,光线被追踪在表面之外;当它开启时,光线追踪在表面之内。
最常见的用途是模拟污垢或侵蚀。允许连接贴图控制“污垢”。
举个栗子:
下图砖块路的例子中,使用Ambient Occlusion正片叠底到原始渲染画面之上,用来增加砖块之间的“污垢”:
【Trace set】字符串标签定义光线要追踪或避免的对象。 作用对象使用Arnold参数标签属性进行标记。
举个栗子:
下图中可看到:Plane之上有三个模型——Sphere.1/Sphere/Tours。为Plane材质添加AO,光线追踪作用于定义为the_sphere的Sphere模型和未定义的Sphere.1模型(未定义对象,默认追踪),排除追踪 定义为the_tours的Tours模型(the_tours是在Tours模型中利用Arnold标签的Trace sets属性定义的——将Value1定义为the_tours)。在IPR Window中可以看到Tours模型在Plane上没有阴影,就是因为Tours在Plane上的所有光线追踪都被Plane的AO排除了。
【Inclusive】若开启,则仅对选定对象(及未定义对象)作追踪;若关闭,则仅不追踪选定对象。
敲黑板:未定义对象默认使用追踪。
【Self only】只采集针对同一物体的遮挡。
Wireframe shader 线框着色器
- Wireframe仅渲染模型的边线。
- 利用Wireframe可以输出线框风格的效果图。
- 允许与其他着色器进行合成或输出通道(可以利用lay_raba进行混合,Wireframe以正片叠底的方式进行混合。此处先不展开详细讲解。)
调出方法同上:
Wireframe参数详解:
【Edge type】决定如何表示网格。 有三种模式:triangles/polygons/patches。 如果选择triangles,多边形将被分解为三角形镶嵌;polygons呈现为多边形面;patches目前暂时不支持。
【Fill color】填充多边形面的颜色。
【Line color】多边形边线的颜色。
【Line width】多边形边线的厚度,默认为1。
【Raster space】开启时边线厚度使用屏幕像素,关闭时使用真实物理世界尺寸。
END.
下次见。
禁止私自转载。
转载请私信。