目录
vLevel = floor[F d(uv)/dx, d(uv)/dy) +Random(-0.25,0.25)]
应用:做NPR的时候在PS里调贴图的颜色信息,可以把图像模式从8位改成更高位数以获得更丰富的灰度信息
r.VT.Flush 强制刷新虚拟纹理缓存
r.VT.Borders.1
stat virtualtexturing
RuntimeVirtualTextureVolume相机,
RuntimeVirtualTexture底片
Virtual Texture
Why:
均一化内存占用
what:
用page table按显示块加载
虚拟纹理主要用于减少大规模纹理资源(例如超高分辨率纹理或大型开放世界场景纹理)对显存的占用。在传统纹理处理中,如果场景需要加载多个高分辨率纹理,可能会快速耗尽显存资源。而虚拟纹理可以分割纹理资源,只把当前帧可见范围内的纹理数据加载到显存里,而非整张纹理图。
这种技术通常使用“按需加载”机制:把纹理拆散成一个个tile(上图灰色部分)打散,放在物理内存中的不同位置(图右下角),并根据当前相机位置决定哪些页面需要加载,避免了显存的过度消耗。虚拟纹理系统在后台动态地管理这些页面,类似于一种纹理的“流式传输”,让开发者在不损失视觉质量的情况下使用超高分辨率纹理。
how:
引擎中开启Virtual Texture support



采样方式:通过Shader修改
(mip之间的过渡)
传统纹理采样是通过硬件支持的,是通过硬件处理两个mip之间的差值返回给mip
虚拟纹理采样只能通过shader的修改,把两个数据都采样出来,然后在shader里做lerp就需要两倍的物理内存采样开销。(tricky的方法,在实际的采样数值上加二维的偏移(有一些帧采样mip2,有一些帧采样mip3),然后再通过TAA(时域抗锯齿)把mip2 mip3混合到一起,从而达到三线性效果。)
vLevel = floor[F d(uv)/dx, d(uv)/dy) +Random(-0.25,0.25)]
表达式的分解
vLevel = floor[...]
:vLevel
表示生成的层级值,这个值取整(向下取整),确保选择的是一个特定的整数层级。
d(uv)/dx, d(uv)/dy
:d(uv)/dx
和d(uv)/dy
是关于UV坐标的偏导数,表示当前片元(像素)在X和Y方向上UV坐标的变化率。在纹理采样中,这些偏导数通常用于估算片元在不同区域内的细节变化情况。较大的UV变化率通常意味着需要较低的MIP层级(即较模糊的纹理),而较小的变化率可能意味着需要更高的MIP层级(即更清晰的纹理)。
Random(-0.25, 0.25)
:Random(-0.25, 0.25)
是一个在-0.25到0.25之间的随机值,用于添加一定的随机噪声,避免纹理层级选择过于规则。这种噪声通常用于消除因采样而出现的视觉伪影(如莫尔条纹)。
floor[...]
:整个表达式的结果通过floor
函数向下取整,以获得一个离散的层级值。这样可以用这个值来选择特定的MIP纹理层级。
Setup
新建底片
runtime virtual texture volume相当于相机,runtime virtual texture相当于底片,底片可以存储本身的shader信息和相机的投影信息两种信息。
编辑器可以实时更新,但是游戏里是不能实时更新的,因为它是个Cache
用途
- cache复杂材质
- 地形上很多东西 decal模型混合 开销非常大 把所有东西拍成一张贴图,减少tiling重复性 增加细节
- 物体之间材质的交互 拍材质的变化 采样到变化,让物体之间的材质有相关性
一个volume拍轮廓做树下面那块图,一个volume斜着放拍投影(共同作用于地面材质)
树的材质不是vt

😀蓝图步骤



RVT的应用:cache材质
动态阴影
地形,材质。虚拟纹理可以处理场景物体和地面的自然衔接
SVT存在硬盘上,RVT当看到的时候生成/渲染。
SVT应用:
按需加载显示大面积纹理
尤其适用于很多不同种类贴图在一个很小的区域,容易内存爆炸。贴图超过texture pool会糊
贴着表面流动的物体/附着地表的草
例图源虚幻引擎官方第18期 | Virtual Texture(虚拟纹理)的理解和应用(Grass贴地工程文件)
新版本dds文件
MIP及压缩设置
MIPMAP texture必须要2幂次否则只能无mip
虚拟纹理流送(Virtual Texture Streaming)开启时的优势
- 内存优化
- 仅加载可见区域纹理,内存占用降低50-90%
- 支持8K+超高清纹理(如《赛博朋克2077》城市贴图)
- 加载加速
- 初始加载时间缩短30-70%(无需载入全量资源)
- 多平台适配
- 在移动端(如骁龙8系设备)可节省300MB+内存
开启时的代价
- 运行时开销
- 增加5-15ms的纹理查找耗时(每帧)
- 需要预留10-20% GPU带宽处理流式传输
- 视觉延迟
- 高速移动时可能出现0.5-2秒的纹理模糊(如《刺客信条》骑马穿越场景)
各向异性
低分辨率Mip缺失
使用LOD避免在远处
svt和rvt的区别
虚幻引擎RVT与SVT的区别(极简版):- RVT(运行时虚拟纹理)
→ 动态“混合”场景细节(如地面磨损、积雪覆盖),实时生成一张虚拟纹理,降低重复绘制开销。
→ 用途举例:角色走过雪地,实时在脚印处混合泥土和雪的纹理。- SVT(流送虚拟纹理)
→ 将超大纹理“切块”按需加载(如100GB超清贴图),只渲染视野内的部分,节省显存。
→ 用途举例:开放世界地图,远处山脉的超清岩石纹理仅在玩家靠近时加载。一句话总结:RVT是“动态PS”(混合细节),SVT是“分块加载器”(优化显存)。
-
SVT (Streaming Virtual Texturing):按需加载和显示大面积纹理,节省内存,提高渲染效率。
-
RVT (Runtime Virtual Texturing):将纹理在运行时动态烘焙到虚拟纹理,适合实时变化的效果,如动态光影。

双线性过滤和三线性过滤的区别
-
双线性过滤:对纹理的四个相邻像素进行插值,使纹理在放大或缩小时更平滑。
-
三线性过滤:在双线性过滤基础上,增加不同 mip map 层级之间的插值,使纹理在切换 mip map 时更平滑。
UE的PixelNormalWS节点
如果将 PixelNormalWS
节点直接连接到 Base Color
,它会将像素法线的世界空间方向数据直接输出为颜色。由于法线数据是一个向量(包含 x、y、z 分量),引擎会将这些分量映射为 RGB 颜色值。具体效果如下:
- 红色通道:表示法线的 X 分量(水平方向)。
- 绿色通道:表示法线的 Y 分量(垂直方向)。
- 蓝色通道:表示法线的 Z 分量(垂直深度方向)。
这种映射会呈现一种基于像素法线方向的彩色图案。图像会显示不同的颜色,视角变化时颜色也会相应变化,这是因为每个像素的法线方向在世界空间中不同。
数字图像处理
NPR图像色深
在图像处理中,8位、16位、32位模式指的是每个颜色通道使用的比特数,即图像的色深(bit depth)。色深影响图像的色彩范围和细节表现力:
-
8位图像:每个颜色通道使用 8 位(即 1 字节),因此单通道的色彩范围为 0-255(总共 256 种灰度)。如果是 RGB 图像,总共有 256×256×256=16,777,216256 \times 256 \times 256 = 16,777,216256×256×256=16,777,216 种颜色(约 1670 万色)。8位图像色彩范围适中,文件较小,适用于大部分网页和常见的应用场景。
-
16位图像:每个颜色通道使用 16 位(2 字节),色彩范围为 0-65535,总共支持约 281 万亿种颜色。16位图像可以记录更多细节与颜色过渡,适用于需要高质量色彩表现的图像处理、打印或专业摄影。
-
32位图像:每个颜色通道使用 32 位(4 字节),总色彩数极高(约为 3400 万亿亿种)。32 位图像通常用于高动态范围图像(HDR)和科学图像处理,能够保存极细腻的亮度和颜色信息,但文件体积非常大。
选择合适的色深
- 8位:适合快速查看、网页和一般应用。
- 16位:适合专业编辑、打印、精细的色彩调整。
- 32位:适合HDR效果、高精度科学图像。
应用:做NPR的时候在PS里调贴图的颜色信息,可以把图像模式从8位改成更高位数以获得更丰富的灰度信息
颜色编码
YCoCg Base Color是一种颜色编码方式,在解码时将YCoCg转换回常见的RGB颜色空间,从而在游戏或实时渲染中更高效地应用纹理。
YCoCg色彩空间将图像的颜色信息分解为亮度(Y)和两种色差分量(Co红和绿色之间的差异和Cg蓝和绿色之间的差异),可以实现更高的压缩效率,同时保留较好的视觉质量。
写于2024.10.29 修订于2025.3.26
[中文直播]第18期 | Virtual Texture(虚拟纹理)的理解和应用 | Epic 李文磊_哔哩哔哩_bilibili
【UE5教程】虚拟纹理使用技巧【附RVT材质函数下载】_哔哩哔哩_bilibili