我们可以用使用深度帖图阴影来模拟柔和的光线追踪(RayTracing)的效果.
衰减(ATTENUATED)这个词的含义是消减和柔化阴影.在以下的例子中,我们通过调整阴影的颜色来减弱阴影的亮度.我们这里所演示的技巧在某些场景中是十分有效的.他能极大的减少渲染时间.但是在某些场合你还是必须使用光线追踪.例如当光线通过使用了透明帖图的物体或有颜色的透明表面时,就要必须使用光线追踪.(但即使是后面两种情况有时也可以用深度帖图模拟光线追踪.可以参考我翻译的另一篇教程。
下面两图是左边用光线追踪右边是衰减深度帖图渲染.效果差不多但是光线追踪的渲染时间要多2.6倍.
Section1
打开场景attenuatedDmapShadow.mb 这个场景包含一个椅子模型和一个加上了attenuated dmap shadow效果的聚光灯,其名称为dmapSoftShadow.
Section2 . 在Hypershade窗口中的light选项卡下选择dmapSoftShadow,并点击Show Upstream Connections按钮.便可以看到这个聚光灯的网络节点.这个网络是为了从最近点到最远点淡化阴影而设置的.它包含3个Locators,一个灯光信息节点以及一些能驱使两个Ramp textures调整阴影的过滤尺寸和颜色属性的数学节点. Section3Locator的作用是在空间里标定位置.第一个Locator的位置就是聚光灯的位置,他和聚光灯之间有constrained的联系.另外两个Locator分别在阴影的开始和结束的位置.
Section4
这3个locators与2个Distance Between节点连接.Distance Between节点是用来计算聚光灯和另外两个locator的距离的.
Distance Between节点输出的是3D空间上两点间的距离.是通过下面的公式计算的.
(x1,y1,z1)和(x2,y2,z2) 分别是两个locator的坐标.
注意:必须用MEL命令来创建Distance Between节点,输入 createNode distanceBetween; 命令. 这个节点不会在Hypershade出现.你必须在Outliner 中用鼠标中键把它拖到Hypershade中去.
Section5
然后把聚光灯到两个locator的距离连接到plusMinusAverage Utility 节点上.并将此节点设为Subtract 方式.这是一个将聚光灯到两个locator的距离相减的工具.我们可以了解到两个距离之差(注意这里是遵循矢量加减法则)
这个距离上的差值将决定两个Ramp texture 节点如何影响dmap shadow的Filter Size和Shadow Color.
Section6
为了确定聚光灯到某个点的距离,必须使用Light Info Utility节点.和Sampler Info节点相似,Light Info节点与其他节点连接时能提供某个被渲染点的信息.
Light Info与Sampler Info不同之处在于需要将一个灯光信息连接到Light Info上.你会注意到在渲染网络中dmapSoftShadow聚光灯的worldMatrix[0]属性连接到了Light Info节点的worldMatrix属性上.它告诉了Light Info从场景中的什么地方计算输出属性Sample Distance.
Sample Distance是从聚光灯中心到某个被渲染点的距离.
注意:Light Info 节点在确定Sample Distance时十分有用.
Section7 和section5的方法类似,我们用另一个plusMinusAverage节点来确定Sample Distance和聚光灯到startShadow locator的距离差.为方便起见,这个差值命名为sample point difference.
Section8 上一步中得到的sample point difference是用来调整阴影的.如果这个值比较小,那么被渲染的点就离startShadow locator比较近.如果这个值比较大,那么被渲染的点就离startShadow locator比较远.
但是这个sample point difference地值可以是从0到一个很大的数.这个无限的范围不太适合用于Ramp节点.Ramp节点适合于0-1的范围.为了解决这个问题,需要使用一些数学手段来把这个距离差值转化到0-1的范围内.
我们把Section5中得到的聚光灯到startShadow locator和endShadow locator的距离之差称为total difference.
使用Multiply Divid节点,计算出sample point difference与total difference的比值.即sample point difference在total difference所占百分比.这样就把sample point difference转换到了0-1范围内.
注意:对于位预startShadow locator与聚光灯之间和endShadow locator之外的点的返回值将不在0-1之间.我们将在下一个节点Clamp中调整.因此locator的位置并不需要十分精确的位于阴影开始和结束的地方.我们可以以后在做调整.
Section9
Clamp 节点能把输入值限制在一定范围内输出.Multiply Divide节点在被连接到Ramp节点的vCoordinate属性之前,将通过先Clamp节点来限制范围.Clamp的Min和Max分别设为0和1.这意味这从Multiply Divide节点过来的输入值在0-1之间的保持不变.小于0的按0输出,大于1的按1输出.
注意:在clamp节点中只使用x-channel.这是因为距离这个属性是单值的.当输入的是3值类型的数据时(例如颜色的RGB值)就要用到其他的channel.
在这个渲染网络中,clamp节点的输出值将连接到Ramp节点的vCoordinate属性上.0表示vCoordinate在底部.1表示vCoordinate在顶部.
我们可以通过调整ramp的位置和数值来控制输出.最后ramp将连接到聚光灯的Filter Size和Shadow Color属性上. 注意:如果输入的数据没有经过clamp节点,在0-1范围之外的数据将重复coordinate的值.会导致一些不可预料的结果.(如下图)
Section10
最终将用2个ramp节点来控制dmap shadow的Filter Size和the Shadow Color属性.
Filter Size将影响dmap shadow的柔化和模糊效果.本例中它被blurInterpolationRamp节点控制.这个节点有两个color entries.在底部设为2,在顶部设为32.
这意味着Filter Size的最小值为2,这个值用于渲染离startShadow locator最近的点.而最大值32将用于渲染离endShadow locator最近的点.这能给dmap shadow产生柔化的衰减效果.
下图是将Filter Size设为1和不设置的比较.
为了加强最终效果,我们把另一个ramp节点连接到Shadow Color属性上.这个ramp的两个color entries的值分别设为0.5和-0.5. -0.5将startShadow locator附近的阴影变暗.而0.5使endShadow locator附近的阴影变亮和透明.
结论
以上例子证明了我们可以用一个衰减深度帖图的渲染网络来节省渲染时间,在许多情况下能代替光线追踪的方式.