渲染归一化深度贴图

本页面的内容:

此函数可以渲染静态网格物体的局部深度图。可以让您利用完全无光照材质模仿清新的动态阴影。

images/17.jpg

通常,利用标准深度材质截取网格物体自上而下的截图,即可渲染深度。因为深度以正射形式存储,而非存储在 UV 空间中,所以,茂密树木的贴图密度值会显著增加。

此功能已用于 Apple Metal API Zen 演示中的樱桃树。

此技术拥有多项独一无二的优势,也存在一些劣势。

优势:

1.对于复杂的树木,受“垂直重叠”数量的影响,已解包 UV 的分辨率较低。解包后,阴影深度贴图的分辨率不会损失,这样一来,就可以在这种情形下带来更高的分辨率。 1.您可以通过顶点着色器轻松为多种内容预制正确的光照,比如摄像机正对的 sprite,否则不可能通过光团获得良好的阴影。事实上,这就是此函数存在的主要原因 1.为了营造某种程度的逼真效果,生成的深度纹理允许对深度偏差和光透射距离进行微调。 1.生成的纹理也可以放置到无碰撞隐藏游戏静态网格物体上,充当阴影投射器,将树木投射到其他几何体上,包括地面和玩家。这样,阴影效果将大幅提升。 1.对于大规模森林场景,如果您想使用极高面数的树木,而且光团重建因为某些原因出现了问题,级联阴影图也不能提供所需的质量,此功能可以作为很好的替代方法。您可以填充大规模场景和树木,将它们放置好后,在远处看起来会产生一样好的效果。 1.主要计算工作在顶点着色器中完成,好看的无光照材质也很便宜,足以像 Zen 演示证实的那样在移动设备上运行。

劣势:

1.与仅使用光团预制简单情形的光照相比,此功能的内容创建成本有些偏高,但上述原因有时恰好可以证明额外工作的合理性。 1.因为常常出现清晰的效果,所以很难控制生成阴影的模糊程度,除非手动或利用 LODbias 营造模糊效果。 1.此功能仅适用于静态场景,不可以真正地更改阴影的角度,因为它从单一光线视图预制。如果需要,可以用一些参数“模拟”旋转光线,但是,生成的质量将降低很多,而且近似效果仅对球形树木有效,因为在此情况下,从中心旋转不会改变太多。 1.通过无光照材质,您会损失掉光团反射光,并在最后将其调整回来。

预制深度图

images/16.jpg

光线向量:您可以指定光线向量,从中捕捉视图,或者也可以链接至您放在场景中的方向光线 Actor。

要呈现 12 点的正午光线向量,需输入 0,0,-1。

属性 说明
Directional Light 如果从您的场景中选择方向光线使用,上述光线向量设置将被忽视,并用光线代替。
Depth Map Static Mesh 这是插入要捕捉的静态网格物体的位置。
Depth Material Mask Textures 您不必在此处创建或指定材质,该功能会自动为此阵列中的每个元素创建一种材质。如果阵列中的任何元素为空白,将在一段时间内使用屏蔽。如果您的静态网格物体包括 3 个部分,只需将 3 个空白项添加至此阵列,就会为您创建材质。另外,如果网格物体的任何部分有屏蔽纹理之类的纹理,则可以在此处指定。指定将位于匹配所需材质 ID 的阵列项上的纹理。
Mask Channel 此设置可以让您指定屏蔽所在的通道。如果您的屏蔽是填充通道纹理的一部分,而且您需要特殊通道,则此设置非常有用。
Use Level Meshes for Depth 这是一种独立且很少使用的情形,并不指定单一网格物体,而是通过手动操作,利用工具捕捉用户“背景”图顶部放置的一个或一组网格物体的深度。或者,您也可以将 RenderToTexture_LevelBP 真正加入现有场景,以捕捉一组网格物体的深度图。使用此选项时,会提供一些材质中必须使用的高级设置,因为边界必须完全自定义。
Scale XY 此工具利用对象球体边界,尝试最佳匹配捕捉区域内的对象。对于某些情形,此工具会在对象边缘周围留下大量死角。此设置可以让您手动微调,将对象稍稍缩放一点儿。建议将其设置为 1.0,因为如果您在此处更改设置,就必须确保材质参数与您的输入值匹配。
Scale Z 与上述工具类似,此函数利用对象球体边界确定用于生成标准深度结果的局部深度范围。在大多数情形下,应使用默认值 1,但如果您想稍微“剪辑”一些范围,确保能利用 0-1 的全范围提高精确性,则可以减少设置值,直到开始看到红色显示出来(说明像素超出了 0-1 的局部范围,而且将被拉平!)。如果在此处更改了该设置,此功能将依赖于稍后在实际材质中设置的匹配值,所以,建议您忽视该设置,除非有充分的更改理由。
Fit Vector and Scale Info Onto Texture 此选项可用于确保让您记住捕捉过程中使用的设置。如果启用,会将文本和上述值标在图纸上。接下来的两个设置可用于缩放和移动文本。
Text Size 指示信息文本的大小。
Text Locations 这是一个阵列,所以您可以将每个文本元素移动到任何有空间的自定义位置。其中包括两个文本行,所以您需要添加两项才能全部移动。

在网格物体和树叶材质 ID 的屏蔽纹理已指定的情况下,您会看到如下图所示的画面:

images/18.jpg

要渲染此深度图,步骤与上文所述略有不同。

此函数不受“捕捉设置”中选择的缓冲影响,仅与分辨率乘数有关。

您必须在新窗口中玩游戏,然后在控制台输入“renderdepth”,并按 Enter 键。

此功能的命令不同,因为 Pawn 蓝图也必须设置“无光照视图模式”。

将深度图用作材质中的阴影

要使用深度图,必须创建新材质。在该材质内,必须加入 “VolumeShadowMap” 材质函数:

20.JPG

MaterialFunction'/Engine/ArtTools/RenderToTexture/MaterialFunctions/VolumeShadowMap.VolumeShadowMap'

值得注意的是,此材质函数此时主要用于设置植物叶子。不计算任何直接光照组件,只计算阴影。就这一点而论,呈立体几何形状且从光线向外弯曲的阴影将不会像其本身应呈现的那样好看。您可以利用“投影向量”以及顶点法线完成手动点积,然后固定在 0-1 位置,从而修复此缺陷。

下面是一个在规则静态网格物体上使用的阴影示例。此网格物体仅包括一些圆柱体、盒子,以及彼此顶部的球面。

images/21.jpg

左:顶视图,右:较低位置侧视图,可以看到阴影,以及自身阴影的准确度(或者由于直接 N dot L 组件缺失而缺乏)。

输入针 说明
Position (V3) 只在预制一组场景中放置的静态网格物体时才使用。此选项在某种程度上还处于试验阶段,因此,建议将其保持断开连接状态。
Range (S) 此设置用于剪辑范围。您需要确保此值与深度图渲染期间设置为 “Scale Z” 的值匹配。
Transform Position (B) 是否转换成自定义光线向量。默认设置是 False,也就是说将使用正午默认局部位置 0,0,-1 的光线。
Projection Vector (V3) 此向量是渲染您深度图的源光线向量。如果选择通过纹理上的光线向量和缩放信息渲染调试文本,您的纹理上应该有要使用的光线向量值。否则,就要使用渲染过程中指定的光线向量,或者,如果您不打算覆盖正午时的默认方向,只需忽视这一点即可。
Use Custom UVs (B) 默认为 FALSE。如果为 TRUE,此函数将利用顶部着色器上计算的 CustomUV 计算内部 UV。此选项主要是对移动设备很重要,但也可以在所有平台上保存像素着色器指令。如果为 True,您必须将此函数的 X、Y 和 Z 输出值插入对应的自定义 UV,然后将正确的 UV 节点插入以下两个输入值。
Custom UV, XY (V2) 如果要指定 CustomUV,必须将含有索引集的纹理坐标节点放置在将 “X,Y” 输出值与材质 CustomUV 输入值连接起来的索引位置。
Custom UV, Z (S) 如果要指定 CustomUV,必须将含有索引集的纹理坐标节点放置在将 “Z” 输出值与材质 CustomUV 输入值连接起来的索引位置。您可能必须利用组件屏蔽传递正确的组件。
Shadow Volume Texture (T2d) 这就是您应该按纹理对象或纹理对象参数连接深度图纹理的位置。
Self Shadow Offset 此选项应该设置为较小的负数,如 -0.01。其功能是使阴影产生偏差,以防对象本身随机显示阴影。
Transmission Mip Bias 当前已断开连接,但稍后会重新连接。可以让您对用于透射的深度图纹理进行 MipBias。
Opacity (S) 仅用于内部透射。此设置仅影响“内部透射屏蔽”输出,不影响阴影输出。
Shadow Accumulation Distance (S) 此选项可用于借助距离来调整阴影增加到全黑的速度。当设置为 1.0 时,阴影将非常生硬。将值减少到 0 时,光线将出现并穿过较薄的对象。
Blur using offset RGB texture (B) 默认为 FALSE。当设置为 TRUE 时,您就可以将深度纹理图中每个 R、G、B 通道偏移,使其和色差相似。然后,此函数将混合每个通道的结果,使模糊效果比它通常情况下利用此技术实现的效果更宽、更柔和。
输出针 说明
Internal Transmission Mask 这是内部透射的结果,通过“不透明度”输入值允许光线穿过。将此作为独立输出十分有用。此功能可让您将透射值与自定义颜色相乘(建议用 VectorParameter ,有可调整性),然后将得到的结果添加至以下“阴影”输出。
Shadow 这是主阴影效果。要使用它,只需将此针与您所需的纹理和/或其他材质指令相乘即可。您可以通过多种方式给阴影着色。其中一种好方式是,将此阴影输出用于“光照”颜色和“阴影”颜色之间的 Lerp,这样,就可以直接控制每种颜色。
XY 只在要利用 CustomUV 在顶点着色器中进行计算时才需要使用此选项。如果使用,请将此针插入材质上的其中一个可用 CustomUV 输入。
Z 只在要利用 CustomUV 在顶点着色器中进行计算时才需要使用此选项。如果使用,请将此针插入材质上的其中一个可用 CustomUV 输入。

内部透射设置示例:

images/22.jpg

左:不透明度 = 1;中:不透明度 = 0.2;右:不透明度 = 0.1

树叶材质透射示例:

images/19.jpg