运行时虚拟纹理 (RVT)在运行时使用GPU按需创建其纹素数据,工作方式与传统纹理映射类似。较大区域上的RVT缓存着色数据非常适用于使用贴花类材质的地形和适配地形的样条。
工作流程
使用以下高级步骤在项目中设置和使用运行时虚拟纹理:
在内容浏览器中创建 运行时虚拟纹理 资源。用于将所有组件(Actor、RVT体积和RVT材质)链接在一起,渲染运行时虚拟纹理。
在 模式(Modes) 面板中将 运行时虚拟纹理体积(Runtime Virtual Texture Volume) 添加到场景。此操作用于将RVT资源放置到场景中。
配置材质以 写入 到RVT资源。
配置材质以从RVT资源 采样。
设置一个或多个基元或地形Actor,以渲染至RVT资源。
欲了解设置RVT的详细步骤指南,参见运行时虚拟纹理快速入门。本指南将设置地形材质和其他场景Actor,以使用运行时虚拟纹理。
运行时虚拟纹理组件
在虚幻引擎4(UE4)项目中,使用以下组件设置和处理运行时虚拟纹理:
运行时虚拟纹理资源
运行时虚拟纹理 资源包含在场景中创建RVT时将使用的配置详情。将此视为RVT系统中的关键部分,用于连接场景中渲染至RVT的材质和Actor。
以下组件引用RVT资源:
场景中放置的各 运行时虚拟纹理体积 均指定了单个RVT资源。
单独场景 Actor 指定了任意数量的RVT资源,当处于指定RVT资源之一的体积边界内时,其会被渲染至运行时虚拟纹理。
在Actor通过RVT体积被渲染至RVT之前,其 材质 必须使用 虚拟纹理 材质域或使用正确设置的RVT材质表达式。
在内容浏览器中使用右键点击快捷菜单或 新增(Add New) 按钮新建RVT资源。在 材质和纹理(Materials & Textures) 类别下,选择 运行时虚拟纹理(Runtime Virtual Texture)。
点击查看大图。
双击资源,在其编辑器窗口中打开并配置相关设置:
使用此窗口定义运行时虚拟纹理支持的材质属性大小、图块大小和类型。
有关此类设置的详情和用途,参见虚拟纹理设置页面。
资源操作
右键点击快捷菜单中包含一组操作,可协助管理材质中的RVT资源:
使用此项查找材质(Find Materials Using This) 将在内容浏览器中查找并高亮显示引用此RVT资源的所有材质。
固定材质使用(Fix Material Usage) 提供更改RVT资源材质类型后自动固定所有材质的方法。其将查找所包含Runtime Virtual Texture Sample节点的有材质和材质函数,该节点引用此RVT资源。若节点中的 虚拟纹理材质类型 与RVT资源中的材质类型不匹配,则节点中的材质类型固定与RVT资源匹配。
运行时虚拟纹理材质类型
设置RVT材质时,共有四个选项可选择:
材质类型 |
注释 |
压缩格式 |
|
---|---|---|---|
底色(Base Color) |
仅保存底色。 |
BC1 |
|
底色、法线、粗糙度、高光度(Base Color, Normal, Roughness, Specular) |
保存底色、法线、粗糙度和高光度。启用压缩后,使用两个BC3纹理保存数据。一个纹理包含底色和法线X。另一个纹理包含粗糙度、高光度、法线Z方向和法线Y。 |
BC3 + BC3 |
|
YCoCg底色、法线、高光度(YCoCg Base Color, Normal, Specular) |
保存底色、法线、粗糙度和高光度。启用压缩后,使用三个纹理;BC3纹理保存以YCoCg格式编码的底色,BC5纹理保存法线X、Y,而BC1纹理保存粗糙度、高光度和法线Z方向。 |
BC3 + BC5 + BC1 |
|
场景高度(World Height) |
保存高度值。 |
R16_UNORM |
底色、法线(Base Color, Normal) 材质类型已在虚幻引擎4.23版本中被移除。在4.24版本中,使用此类型资源将自动转换为使用 底色、法线、粗糙度、高光度(Base Color, Normal, Roughness, Specular) 材质类型。
运行时虚拟纹理底色存储
利用 YCoCg底色、法线、粗糙度、高光度(YCoCg Base Color, Normal, Roughness, Specular) 材质类型,可对RVT中的底色进行不同编码。
底色默认保存为RGB并压缩为BC1。此类编码可导致存储数据中出现色移和色带,在平滑渐变的底色数据中最为明显。YCoCg材质类型有助于减少此类瑕疵。但使用此类材质将增加25%内存开销,同时还需进行虚拟纹理数据的额外性能采样和解码。
运行时虚拟纹理法线存储
法线及X、Y值保存在BC5纹理中或者两个BC3纹理的透明通道中,基于与BC5的相同精确度。法线的Z方向还用于保存场景空间法线。
从材质图表中将法线写入RVT的方法共两种:
使用 Runtime Virtual Texture Output 节点
使用标准材质输出节点
材质从Runtime Virtual Texture Output节点中写入时不会将隐藏变换应用到输出。向此节点输入的任何内容将被写入RVT(纹理中同时保存部分编码)。
从标准材质输出节点写入材质时,将应用隐式变换。注意:4.24版本中的此行为与引擎之前版本不同。从材质输出节点写入RVT时的默认行为最初是将输出法线变换为RVT体积朝向定义的共享切线空间。在4.24版本中,默认行为是将法线变换为场景空间。
推荐在场景空间中将法线保存在RVT内。使用此常用空间可在RVT中写入和读取多个基元时实现更佳的混合行为。
运行时虚拟纹理体积
运行时虚拟纹理体积(Runtime Virtual Texture Volume) 用于将RVT资源放置于场景中。此体积应包围Actor,将在设置材质后渲染到此Actor;通常为地形或表面地形类基元。
对于任何基元采样或写入,运行时虚拟纹理都应处于体积边界内。放置RVT体积时,使用关卡 详情(Details) 面板中的 从边界变换(Transform from Bounds) 参数快速定位和缩放体积至选定Actor。此通常与场景中的地形类似。
在 放置Actor(Place Actors) 面板中,将 运行时虚拟纹理体积 拖入场景。
选择体积后,使用关卡 细节(Details) 面板找到 从边界变换(Transform from Bounds) 类别,并使用 源Actor(Source Actor) 资源选项或滴管在场景中选择Actor。
使用 复制旋转(Copy Rotation) 和 复制边界(Copy Bounds) 按钮快速定位、缩放和旋转体积。
使用RVT体积负Z方向上的正射投影,对渲染至RVT的对象进行渲染。
运行时虚拟纹理材质表达式
对于指定了RVT资源的场景Actor,须设置其材质以启用以下操作:
将 材质域(Material Domain) 设为 虚拟纹理(Virtual Texture),无不需其他设置,并启用将Actor写入到场景中的RVT。
添加可启用写入到RVT资源的材质逻辑,以便将对象合成到场景生成的最终RVT中。
材质域:虚拟纹理
使用 细节(Details) 面板将 材质域(Material Domain) 设为 虚拟纹理(Virtual Texture),将其渲染至场景中的RVT:
使用主材质节点写入到场景中的绑定RVT,该RVT使用指定到RVT体积和场景Actor的同一RVT资源。无需其他设置便可将材质或Actor渲染至场景中的RVT。
写入到和采样运行时虚拟纹理
要写入到和采样运行时虚拟纹理,首先须设置部分RVT表达式以处理材质:
运行时虚拟纹理(Runtime Virtual Texture Output) 表达式用于定义同时写入到和采样运行时虚拟纹理的单个材质。应将现有材质逻辑插入此节点。
运行时虚拟纹理取样(Runtime Virtual Texture Sample) 表达式利用指定RVT资源采样并输出该材质的采样。
Runtime Virtual Texture Sample Parameter 表达式的工作原理与Runtime Virtual Texture Sample节点类似,但会将采样的RVT资源公开为材质实例的参数进行覆盖。
和其他参数类似,可直接创建此节点或右键点击Runtime Virtual Texture Sample节点,在快捷菜单中选择 转换为参数(Convert to Parameter) 进行创建。
使用材质实例覆盖RVT资源时,指派的RVT资源必须与运行时虚拟纹理采样参数表达式的细节面板中设置的材质匹配。
此为写入到绑定RVT资源并对其进行采样的地形材质范例。平台不支持虚拟纹理时,其还可使用逻辑退回到传统地形渲染:
点击查看大图。
其他材质表达式
在以下两种情境下使用RVT时将编译材质:
渲染至RVT
渲染至其他通道
若要将部分材质逻辑渲染至RVT,运行时虚拟纹理替换(Runtime Virtual Texture Replace) 表达式是理想选择。
查看属性(View Property) 表达式还有几个RVT特定选项:
Virtual Texture Output Level 节点会输出当前正在渲染的RVT mip等级。
Virtual Texture Output Derivative 节点输出场景空间的X和Y大小,该场景空间被当前虚拟纹理输出的单个纹素覆盖。
此类表达式的一个用例是在RVT中模拟缤纷基于距离着色的使用。由于RVT独立于摄像机,因此无法直接表达此类着色。但通过使着色mip依赖等级,即可获得类似效果。可使用 Runtime Virtual Texture Replace 节点仅实现 Runtime Virtual Texture Output 节点的mip等级依赖着色路径。
若要设置材质逻辑以在不支持虚拟纹理时退却到替代路径,虚拟纹理特征切换(Virtual Texture Feature Switch) 十分有用。
场景Actor输出属性
场景中放置的Actor都可渲染至RVT。以下为理想候选Actor类型:
理想候选Actor |
非理想候选Actor |
---|---|
|
|
由于RVT内容实际上是着色缓存,因此不会逐帧完整更新,意味渲染到RVT的对象应具有 静态 移动性。蒙皮和动画基元并非渲染至RVT的理想选择。
使用Actor 细节(Details) 面板中的 渲染至虚拟纹理(Render to Virtual Textures) 阵列,指定其可在场景中渲染至的RVT资源。可将Actor指定到多个RVT。只有将RVT资源指定到场景中放置的RVT体积,并正确设置Actor的材质后,才会开始渲染至RVT。
参见运行时虚拟纹理快速入门查看范例。另参见虚拟纹理设置参考。
在场景中渲染至RVT时,遵循以下章节进一步了解Actor行为。
虚拟纹理通道类型
使用 虚拟纹理通道类型(Virtual Texture Pass Type) 选项控制虚拟纹理相关项目的地形和基元的渲染。有时,若将基元渲染至RVT,或要在不支持虚拟纹理的主机上运行项目时,需要变更主通道。
利用以下选项可控制渲染至RVT的对象:
选择 |
说明 |
---|---|
仅虚拟纹理(Virtual Texture Only) |
不在主通道中渲染此Actor,若场景中无RVT,则不渲染此Actor。不支持虚拟纹理时,此选项应用于不必要的项目(例如贴花类材质)。例如,使用静态网格体平面并将材质输出到RVT,会将贴花等材质写入RVT地形材质。如果主机或特征等级不支持虚拟纹理,静态网格体平面将不会渲染至主通道。 |
虚拟纹理或主通道(Virtual Texture OR Main Pass) |
根据虚拟纹理支持,将Actor渲染至RVT或主通道。例如,RVT应写入渲染道路网格体和材质的地形样条,以沿样条应用其材质。但若场景中无有效RVT,或特征等级不支持虚拟纹理,地形仍会显示样条道路网格体。 |
虚拟纹理和主通道(Virtual Texture AND Main Pass) |
无论是否支持虚拟纹理,将Actor渲染至RVT和主通道。对于需要同时写入和采样RVT的对象(例如地形),这是理想的选择。例如,设为同时写入数据到RVT和渲染最终RVT的地形材质应始终可见。 |
对于渲染至RVT的基元,建议禁用阴影投射和碰撞。阴影投射和碰撞不会自动禁用。
设置LOD和Mip
通过设置细节等级(LOD)和剔除行为,使用虚拟纹理高级卷栏属性控制Actor渲染至RVT的方式。在Actor的关卡 细节(Details) 面板中访问这些参数:
对于场景中的基元,调整以下属性:
属性 |
说明 |
---|---|
虚拟纹理LOD偏差(Virtual Texture LOD Bias) |
设置LOD以渲染至RVT中。基于渲染的基元覆盖虚拟纹理页面的程度,自动选择此选项。使用此选项可应用进一步偏差。较高值将强制使用较少细节LOD。 |
虚拟纹理跳过Mip(Virtual Texture Skip Mips) |
RVT中跳过渲染此基元所需最低mip数。若已知无需在设定绘制距离外渲染基元,则此选项将消除渲染至RVT的开销。 |
虚拟纹理最小覆盖(Virtual Texture Min Coverage) |
若设定此值,将忽略 虚拟纹理跳过Mip(Virtual Texture Skip Mips) 参数,而将基于基元在mip中的预估投影大小在RVT mip中剔除(或移除)基元。此值以像素为单位,而非日志空间。例如,设值为3时将剔除(或移除)投影尺寸小于8像素的基元。 |
对于场景中的地形,调整以下属性:
属性 |
说明 |
---|---|
虚拟纹理LOD数量(Virtual Texture Num LODs) |
用于将地形组件渲染至RVT的LOD数量。设值为0表示各地形组件都将作为单个四边形渲染至RVT中。0为GPU性能最优值。若地形材质需要高频顶点插值数据,则需要更高值。 |
虚拟纹理LOD偏差(Virtual Texture LOD Bias) |
应用于要渲染至RVT的选定LOD的偏差。 |
对象排序优先级
将多个基元渲染至场景中的RVT时,可能会出现对象图层排序问题。由于未使用Z缓冲,且Actor的材质可进行透明度混合,因此可能需要定义排序顺序。
对于场景中的选定Actor,使用关卡 细节(Details) 面板设置其 半透明排序优先级(Translucency Sort Priority)。
所有Actor的默认值为 0。值越小,越先渲染(或在底部图层上),值越大,越晚渲染(或在顶部)。
值相同的Actor渲染顺序为 undefined。如果场景中的RVT缺失Actor,先检查 半透明排序优先级(Translucency Sort Priority)。
流送虚拟纹理编译
当RVT涵盖具有众多Actor的大型场景时,渲染到RVT低分辨率mip将十分缓慢。此外,在此情况下,场景Actor需要永久常驻,以便渲染至表现场景远处部分的低mip,这一过程极耗内存。
因此,烘焙和流送RVT的低分辨率mip则更为高效。仍会在运行时渲染较高分辨率mip。由此,单个虚拟纹理可充分利用流送虚拟纹理和运行时虚拟纹理这两种方法。
使用RVT启用SVT
要向RVT添加流送虚拟纹理支持,设置要流送的低mip数。
在RVT资源中,使用 流送到虚拟纹理的低mip数(Number of low mips to stream to the virtual texture) 属性设置要流送的低mip数。
点击查看大图。
低mip值越高,生成的流送虚拟纹理越大,将在摄像机较近距离处使用此纹理。
接下来需要编译流送虚拟纹理。共有两种操作方法:
使用编辑器工具栏中的 编译(Build) 菜单,并选择 编译虚拟纹理(Build Virtual Textures)。
点击查看大图。
此选项将在当前开启的关卡中编译所有虚拟纹理。
使用RVT体积组件并点击 在编辑器中使用流送低Mip(Use Streaming Low Mips in Editor) 属性旁的 编译(Build)。
此选项仅编译选定RVT体积的虚拟纹理。
编辑器默认固定使用运行时生成的RVT数据进行渲染,而非使用流送虚拟纹理数据。此操作无需在相关编译后更新流送虚拟纹理。
要在RVT低mip中渲染流送虚拟纹理,在RVT体积 细节(Details) 面板中选择 在编辑器中使用流送低mip(Use Streaming Low Mips in Editor) 属性。
优化、统计数据和调试
在以下章节中了解项目中运行时虚拟纹理的优化和调试方式。
统计数据
用反引号(`)键打开控制台,并输入以下命令以启用其统计数据:
使用 stat virtualtexturing
查看虚拟纹理场景开销详情(以毫秒计)和页面表计数器。
使用 stat virtualtexturememory
显示当前场景使用虚拟纹理相关的内存计数器。
流送虚拟纹理低mip调试
要协助显示流送虚拟纹理使用处的距离,使用RVT体积 细节(Details) 面板中的 编译调试(Build Debug) 按钮,其位于 在编辑器中使用流送低mip(Use Streaming Low Mips in Editor) 属性旁。
此按钮将利用着色来重新编译流送纹理数据,以便查看流送虚拟纹理低mip的使用位置。
内存池
在 BaseEngine.ini
配置文件中设置虚拟纹理的内存池大小。逐纹理设置此类池的压缩格式和图块大小。通过指定项目的最大内存预算来配置池大小。此类设置位于 [/Script/Engine.VirtualTexturePoolConfig]` 下。
虚幻引擎4.24语法
设置自己的值时,图块大小将被定义为大小范围。此外还有 bAllowSizeScale
,用于定义是否使用命令 r.VT.PoolSizeScale
可扩展性设置上设定的值应用到内存池。
设置自己的值时,可使用以下范例作为起始点:
[/Script/Engine.VirtualTexturePoolConfig]
+Pools=(SizeInMegabyte=128, bAllowSizeScale=1, MinTileSize=0, MaxTileSize=9999, Formats=(PF_DXT5, PF_DXT5))
+Pools=(SizeInMegabyte=4, bAllowSizeScale=0, MinTileSize=0, MaxTileSize=9999, Formats=(PF_G16))
在此设置中,底色、法线、粗糙度、高光度(Base Color, Normal, Roughness, Specular) RVT分配128MB池,场景高度(World Height) RVT分配了4MB池。
Unreal Engine 4.23 Syntax
设置自定义值时,可使用128或256的图块大小和4纹素边框作为初始配置,如下例所示:
[/Script/Engine.VirtualTexturePoolConfig]
+Pools=(SizeInMegabyte=36, TileSize=136, Format=PF_DXT1)
+Pools=(SizeInMegabyte=72, TileSize=136, Format=PF_BC5)
+Pools=(SizeInMegabyte=72, TileSize=136, Format=PF_DXT5)
+Pools=(SizeInMegabyte=34, TileSize=264, Format=PF_DXT1)
+Pools=(SizeInMegabyte=68, TileSize=264, Format=PF_BC5)
+Pools=(SizeInMegabyte=68, TileSize=264, Format=PF_DXT5)
此配置转换为64x64 128大小的图块池,或32x32 256大小的图块池,开销约为100MB。
根据RVT内容类型,仅使用BC5和DXT5池之一。
配置虚拟纹理物理内存池时,使用 stat virtualtexturing
命令显示虚拟纹理系统的动态使用,包括缓存负载。此外,输入命令 r.VT.ListPhysicalPools
将虚拟纹理系统状态的大量有关信息转储到输出日志。
调试
使用以下控制台变量调试项目中的虚拟纹理:
控制台变量 |
说明 |
---|---|
|
使用此命令清空虚拟纹理系统中的所有物理缓存。若怀疑问题可能是因不良缓存失效而引起,此命令非常有用。 |
|
使用此命令设置最大页面逐帧上传数量(默认64)。若要限制帧中正在更新的运行时虚拟纹理图块量,以防达到性能峰值,此命令非常有用。 |
控制台变量和可扩展性
可基于各项目和各平台或可扩展性级别微调以下控制台变量。
控制台变量 |
描述 |
---|---|
|
逐帧上传的虚拟纹理页面最大数。降低此值可提高性能,但视觉效果更新将变慢。 |
|
在编辑器模式下,逐帧上传的页面最大数。此值独立于命令 |
|
此为应用到RVT资源 大小(以图块计)(Size in Tiles) 属性的偏差。值为-1表示RVT分辨率减半。值为1表示RVT分辨率加倍。 |
|
应用到虚拟纹理物理池大小的比例因子。值小于1将减小纹理池大小。对于内存较为有限的平台,此值可能为必需项。 |
|
此为虚拟纹理采样的特定MaxAnisotropy设置。 |
其他说明和限制
目前不支持移动平台。
可在顶点着色器暂存中采样虚拟纹理。由于顶点着色器不会生成虚拟纹理GPU反馈,因此建议谨慎使用。