aiRaySwitch节点是arnold渲染器中的一个非常重要的性能优化工具,通过aiRaySwitch可以避免掉不必要的渲染计算量/对画面效果影响不大的渲染计算量。通过实际项目使用发现该shader很强的实用性。下面两张图为未使用ray switch(图1)与使用ray switch优化后的蕾丝裙渲染图(图2)对比(右边的球只作为参考物体):


可以看到虽然蕾丝裙的渲染效果有些许差别,但在实际生产中可以接受,而更大的差别则在于渲染时间上的差别,渲染时间减少了三分之二。
Ray switch的工作原理
Ai Ray Switch材质球能够允许你在计算某像素着色信息的时候,分别使用不同的shader(材质球)去计算camera rays(相机射线)、shadow rays(阴影射线)、reflection rays(反射射线)、refraction rays(折射射线)、diffuse rays(间接照明射线)、glossy rays(二次高光射线)。例如:
1、半透明物体的间接照明计算比较费时间,可以将其间接照明射线“所看到的”模型改为不包含半透明贴图的实体模型便能够简化大量的渲染计算量;
2、将specular(光滑反射)在glossy rays中变得更加模糊;
3、改变shadow rays的透明度与颜色去模拟光线透过薄纸巾的散射效果;
4、仅仅在diffuse rays中提升树叶的backlighting参数以实现更多的色溢;
5、仅在在camera rays中添加第二套高光。
一、一套范例直观的演示ray switch的效果(图3):

右边是实体球,中间有一面偏蓝色的镜子,左边是反射的球。
1、单独更改camera rays的范例:


注意实体球变成了红色而其他部分完全没有改变。
2、单独更改shadow rays的范例:


注意阴影部分完全变成了我自定义的颜色。
3、单独更改reflection rays的范例:


此时reflection rays就只能“看”见我自定义的一个简单的绿色lambert球了。
4、单独更改refraction rays的范例:


不再赘述
5、单独更改diffuse rays的范例(请牢牢记住diffuse rays就是用来计算间接照明的,是一种secondary rays):


6、单独更改glossy rays的范例(请牢牢记住glossy rays算的是indirect specular分量,是一种secondary rays):


请注意本范例中的镜子已经从使用reflection来做镜面反射改为了使用specular来做模糊反射。
通过以上若干小范例演示的结果,我们可以看出AiRaySwitch实际上就是针对画面渲染所使用的不同射线采用不同的shader去进行着色。其中camera rays专门用于计算你直接所观察到的物体的形状、颜色与光照,shadow rays用于计算物体被灯光打出来的阴影,reflection rays计算的是物体在别的地方反射出来的效果是怎么样的,refraction rays计算的是一个物体经过折射之后看到的是个什么样子,diffuse rays专门用来计算二次照明(间接照明),glossy rays专门用来计算specular分量产生的高光反射效果。
因此aiRaySwitch可以帮我们做两件事:
1、实现戏剧化的渲染效果;
2、优化渲染计算,人工避免不必要的光线计算,减少渲染时间。第一点已做展示,第二点我会继续深入蕾丝裙案例,揭示ray switch渲染优化的综合利弊
二、蕾丝裙案例分解
最终效果在本文开头已经给出,见图1和图2的比较。
原始效果(未使用ray switch)使用的shader连接如下图16:

红色框代表贴图的各个通道,黄色原框则是原始的材质球,这样连接的渲染时间是3m20s。
使用aiRaySwitch后的shader连接图,如图17:

也就是说,我使用aiRaySwitch节点,让蕾丝裙在渲染的时候,只有camera rays和shadow rays“看到了”之前原始的材质(见红色线框部分),采用了原始的计算量,而另外四个rays通道“看到了”纯色(见蓝色线框部分),所以计算reflection、refraction、diffuse、glossy所采用的shader仅仅是单一纯色而已,其实也就可以理解为这四个rays通道计算的都是蕾丝裙模型给了一个简单的surfaceshader的效果,因此这四个rays通道的计算量是非常小的。
回到本文开头的两张蕾丝裙对比图,可以看到,减少了reflection、refraction、diffuse、glossy四个通道的计算,但是最终效果差别并不大?这是为什么?因为这个蕾丝裙范例场景中完全不存在反射与折射计算(见上文中原始材质球的连接图),间接高光(indirect specular)非常少(蕾丝裙对蕾丝裙的高光,小球对蕾丝裙的高光,都属于间接高光),蕾丝裙的间接照明效果也很微弱。基于以上原因,所以这四个通道可以成为被优化的对象。
那如果蕾丝裙场景中存在大量的反射折射间接照明和高光呢?这种情况下问题就暴露出来了,且看下图18:

我把aiRaySwitch调整成图19、20的样子,看的更明白一点:


绿色是refraction rays所“看”到的蕾丝裙颜色的折射效果
黄色是间接照明所“看”到的蕾丝裙颜色所产生的间接照明
右边小球表面的蓝色是glossy rays所“看”到的蕾丝裙产生的间接高光(indirect specular)效果
紫色部分是混合了间接高光(蓝色)与反射(红色)所组合出来的颜色
这些绿色蓝色紫色蓝色的奇奇怪怪的颜色部分,就是被简化掉的计算量
如果你一定要在有明显肉眼可见的反射、折射、高光的情况下使用aiRaySwitch去强行进行简化计算,那最终渲染结果肯定是能看出瑕疵的,但由于我们所做的蕾丝场景其实并没有太明显的反射、折射、高光,因此我们的优化就变得十分的有实际意义。

