分析衰减深度帖图阴影

2015-10-14 16:12:36来源:作者:人点击

导言:

这套教程是我很久以前收藏的,虽然教程比较老,但个人感觉对衰减深度贴图阴影分析的非常好,今天拿出来与大家分享,希望对大家能够有所帮助。

下面教程开始。

我们可以用使用深度帖图阴影来模拟柔和的光线追踪 (RayTracing) 的效果。

衰减 (ATTENUATED) 这个词的含义是消减和柔化阴影。在以下的例子中,我们通过调整阴影的颜色来减弱阴影的亮度。我们这里所演示的技巧在某些场景中是十分有效的。他能极大的减少渲染时间。例如当光线通过使用了透明帖图的物体或有颜色的透明表面时,就要必须使用光线追踪。

下面两图是左边用光线追踪右边是衰减深度帖图渲染。效果差不多但是光线追踪的渲染时间要多 2.6 倍。(图01)

图01

Section1

打开场景,包含一个椅子模型和一个加上了 attenuated dmap shadow 效果的聚光灯,其名称为 dmapSoftShadow。(图02)

图02

Section2

在 Hypershade 窗口中的 light 选项卡下选择 dmapSoftShadow,并点击 Show Upstream Connections 按钮,便可以看到这个聚光灯的网络节点。这个网络是为了从最近点到最远点淡化阴影而设置的,它包含3个 Locators,一个灯光信息节点以及一些能驱使两个 Ramp textures 调整阴影的过滤尺寸和颜色属性的数学节点。

Section3

Locator 的作用是在空间里标定位置。第一个 Locator 的位置就是聚光灯的位置,他和聚光灯之间有 constrained 的联系。另外两个 Locator 分别在阴影的开始和结束的位置。(图03)

图03

Section4

这3个 locators 与2个 Distance Between 节点连接,Distance Between 节点是用来计算聚光灯和另外两个 locator 的距离的。

Distance Between 节点输出的是3D空间上两点间的距离,是通过下面的公式计算的。(图04)

图04

(x1、y1、z1) 和(x2、y2、z2)分别是两个 locator 的坐标。

注意:必须用MEL命令来创建 Distance Between 节点,输入 createNode distanceBetween; 命令。这个节点不会在 Hypershade 出现,你必须在Outliner 中用鼠标中键把它拖到 Hypershade 中去。(图05)

图05

Section5

然后把聚光灯到两个 locator 的距离连接到 plusMinusAverage Utility 节点上,并将此节点设为 Subtract 方式,这是一个将聚光灯到两个 locator 的距离相减的工具,我们可以了解到两个距离之差(注意这里是遵循矢量加减法则)。

这个距离上的差值将决定两个 Ramp texture 节点如何影响 dmap shadow 的 Filter Size 和 Shadow Color。(图06)

图06

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 时十分有用。(图07、图08)

图07

图08

Section7

Section7 和 Section5 的方法类似,我们用另一个 plusMinusAverage 节点来确定 Sample Distance 和聚光灯到 startShadow locator 的距离差。为方便起见,这个差值命名为 sample point difference。(图09)

图09

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 的位置并不需要十分精确的位于阴影开始和结束的地方。我们可以以后在做调整。(图10)

图10

Section9

Clamp节点能把输入值限制在一定范围内输出,Multiply Divide 节点在被连接到 Ramp 节点的 vCoordinate 属性之前,将通过先 Clamp 节点来限制范围。Clamp 的 Min 和 Max 分别设为0和1,这意味这从 Multiply Divide 节点过来的输入值在0-1之间的保持不变,小于0的按0输出,大于1的按1输出。(图11)

图11

注意:在 clamp 节点中只使用 x-channel,这是因为距离这个属性是单值的,当输入的是 3 值类型的数据时 ( 例如颜色的 RGB 值 ) 就要用到其他的 channel。(图12)

图12

在这个渲染网络中,clamp 节点的输出值将连接到 Ramp 节点的 vCoordinate 属性上。0表示 vCoordinate 在底部,1表示 vCoordinate 在顶部。(图13)

图13

我们可以通过调整 ramp 的位置和数值来控制输出,最后 ramp 将连接到聚光灯的 Filter Size 和 Shadow Color 属性上。注意: 如果输入的数据没有经过clamp 节点,在 0-1 范围之外的数据将重复 coordinate 的值,会导致一些不可预料的结果。(图14)

图14

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和不设置的比较。(图15)

图15

为了加强最终效果,我们把另一个 ramp 节点连接到 Shadow Color 属性上,这个 ramp 的两个 color entries 的值分别设为 0.5 和 -0.5. -0.5 将startShadow locator 附近的阴影变暗。而0.5使 endShadow locator 附近的阴影变亮和透明。(图16)

图16

结论

以上例子证明了我们可以用一个衰减深度帖图的渲染网络来节省渲染时间,在许多情况下能代替光线追踪的方式。

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台