[官方培训] 05-虚幻引擎中的纹理 | 周澄清 Epic
传送门:[官方培训]05-虚幻引擎中的纹理 | 周澄清 Epic_哔哩哔哩_bilibili
一. 纹理知识概述
1.1 虚幻引擎中的纹理
- 纹理贴图:是用来记录色彩信息的数据载体
- 一般会用纹理贴图来装载除颜色,包括高光,金属,法线,粗糙,蒙板等数据信息
- 纹理是三维渲染输入数据的主要来源,在进行真实光照模拟时,如果只知道光照角度、强度,而不知道模拟物体表面特性,纹理贴图则会提供特性数据来源
- 纹理贴图制作中的长宽尺寸一般是 2 的幂次方
- (个别渲染硬件支持非 2 的幂次方,但是大都支持 2 的幂次方)
- 虚幻中,要求纹理必须产出 2 的幂次方
- 在向显卡传递数据时,非 2 的幂次方纹理会被转换为2的幂次方(虚幻在资产预处理阶段已经将纹理进行了转换),但这非常浪费时间
- UV:表示纹理贴图上每个像素点的位置信息
- 把 2D 纹理引用到 3D 模型上,需要设定贴图的循环模式(平铺)
- 均匀 UV 将是一张标准坐标系,左上角为(0,0)点,右下角为(1,1)点
- 纹理与 UV 相互配合
- UV 决定了纹理中像素在三维模型上的位置,而 UV 数据存在于模型上
- 在制作美术模型中,将模型完成后必须要进行 UV 展开,以便进行纹理制作
1.2 Compression 纹理压缩
- 目的:显存有限,牺牲视觉质量换取显存空间
- 颜色 color 数据与原始 raw 数据
- UE 的工作色彩空间是线性 sRGB
- 启用 sRGB:纹理提亮, 开启颜色纹理(Base / Albedo / Emissive map),本质是将 DCC 软件中保存的 sRGB 编码的颜色数据,转为线性编码(UE 的 PBR 渲染管线必须在线性编码的 sRGB 空间下进行)
- 不同压缩选项对 sRGB 选项的支持不同
- Normalmap 法线贴图不支持 sRGB
- Masks 遮罩不支持 sRGB
- Alpha 透明度不支持 sRGB
- 压缩算法的异同与适用场合
- DXT(BC1) / DXT3(BC3):默认有损压缩
- BC5:默认法线贴图
- 压缩 RGB 通道时,因为人眼对绿色更敏感,G 通道会比 R、B 通道保留更多信息(如:在默认压缩方式中,G 通道占有 6 位,而 R、B 通道只占有了 5 位的数据)
- 当打包一个含金属性、粗糙度、AO 的 RGB 纹理时,通常会把对结果影响最大的粗糙度放在 G 通道,其他放在 R、B 通道里
- 压缩设置不同,但压缩方法可能相同(如:Grayscale 灰阶、Displacementmap 置换贴图两种不同的压缩设置,均使用了 G8 的压缩方法)
![]()
- Compress Without Alpha 无透明度压缩:压缩 RGB 纹理,不压缩 Alpha 通道(压缩 RGB 纹理比压缩 RGBA 纹理的占用资源小一倍)
![]()
- Normalmap 法线贴图:默认使用 BC5 的压缩格式,Normalmap 法线贴图只压缩了 R、G 通道(B通道可根据 R、G 通道求解,减少资源占用),不支持 sRGB
![]()
- Masks 遮罩:默认使用 DXT1 的压缩格式,不支持 sRGB
![]()
- Grayscale 灰阶、Displacementmap 置换贴图:均使用 G8 (非压缩格式)的压缩格式,但 Grayscale 灰阶使用的是原始数据的 R 通道,Displacementmap 置换使用 Alpha 通道
![]()
- VectorDisplacementmap 向量置换贴图:使用 B8G8R8A8 的压缩格式,启不启用 Compress Without Alpha 无透明度压缩对资源大小没影响
![]()
- HDR:使用 FloatRGBA 的压缩格式,无损存储(非压缩格式),最占资源,但精度最高
![]()
- HDR Compressed 压缩 HDR:有损保存 HDR 的方式
![]()
- UserInterface2D 用户界面2D:根据原始 HDR 文件中的信息,选择使用 B8G8R8A8 还是 FloatRGBA 的压缩格式
![]()
- Alpha 透明度:使用 BC4 的压缩格式,以更高精度的方式单独压缩 R 通道,不支持 sRGB
![]()
- DistanceFieldFont 距离场字体:很多情况下,表现与 Displacementmap 置换贴图相同,但 Displacementmap 置换贴图会根据文件信息选择 8 或 16 位,距离场仅 8 位
![]()
- BC7:用法上与 Default 默认压缩接近,但会耗费更多资源
![]()
- HalfFloat 半浮点:将 R 通道以 16 位的半精度浮点数的格式保存
![]()
1.3 纹理采样方式
- 引擎中大部分采样,默认使用线性采样的方式(过渡更柔和),但有时候(如:遮罩贴图采样)也需要得到锐利清晰的边界
- Nearest Point 最近点采样
- 取离其最近一个整数像素点的值,进行采样
- Bilinear 双线性采样
- 取离其最近一个2*2像素区域,根据其小数值做加权平均,进行采样
- Trilinear 三线性采样
- 主要和层级贴图 Mipmap 结合使用
- 在两层的 Mipmap 上,分别各做一次双线性采用,将得到的值做一次线性采样插值得到最终结果
- Anisotropic 各向异性采样
- 采样时,根据相机视角,离相机近的用更大采样区域,离相机远的用更窄的采样区域
![]()
![]()
1.4 Mipmap 层级纹理
- 目的:预计算增加了内存占用,换取视觉效果提升(和纹理流送结合使用,降低显存占用)
- 尺寸:长宽为 2 的幂(不一定是正方形)
- 1、2、4、8、16、32...
- 如果尺寸不满足,可以在纹理设置中选择 Power Of Two Mode:Pad to Power Of Two 自动填充纹理尺寸为 2 的幂次方
- 内存:使用了 Mipmap,会多消耗约 33% 的空间
- 生成方式:模糊或锐化(上一级的 4 个像素加权平均后生成下一级的一个像素)
- LOD Bias 偏移量 = 平台偏移 + group 组偏移 + Per tex 逐材质偏移(偏移后,近距离纹理变糊)
![]()
1.5 Texture Group 纹理组
- 目的:将纹理按其用途进行归类,便于统一批处理操作
- 通过编辑 Device Profiler 配置文件或 BaseDeviceProfiles.ini 工具,调整纹理组各参数
![]()
1.6 Texture Streaming 纹理流送
- 目的:消耗 CPU、IO 等资源,以动态加载需要用到的纹理层级,使得场景能用更多的纹理资源而不出现显存不足的情况
- 原理概述:
- 运行前,构建 Texture Streaming Data 纹理流送数据
- 运行时,CPU 根据视角、可见性、遮挡、Texture Streaming Data 等计算需要的 LOD 贴图层级
- 根据 LODBias,调整贴图层级
- 根据纹理流送池的大小(占用情况),决定加载或卸载贴图层级(贴图优先级)
- 发送异步 IO 请求,加载相关资源
- 常见问题与调试:
- 显存池不足造成模糊:通过命令行输入
Stat Streaming,查看当前纹理流送相关信息r.streaming.poolsize查看/调整默认显存纹理池大小(强行设置流送池大小为1:r.Streaming.PoolSize 1,则会报错)![]()
- 贴图精度不够或过高,导致模糊或浪费显存,可以通过肉眼观察或使用优化视图定位问题,打开优化视图,绿色则表示过高(可通过设置纹理的 LOD Bias 偏移数值,进行优化)
![]()
- 调试时,
r.Streaming.DropMips 2:禁用纹理池中的缓存或被隐藏的贴图,只保留当前使用的纹理层级,使调试数据更准确
- 设置纹理为流送
![]()
- 命令行输入
Statistics,开启统计数据,查看当前纹理占用情况![]()
- 渲染 Sequence 时,如果镜头快速切换会导致纹理猝不及防,可以给纹理先预热 Warm up 个几帧
![]()
二. 常用纹理类型

2.1 Texture2D 二维纹理
- 上文介绍的纹理流送这些都是二维纹理(可理解为图片纹理)
2.2 Cubemap 立方体纹理
- 由 6 张二维纹理组合成立方体的纹理
- 不再通过 UV 坐标进行采样,而是通过方向向量采样,主要用于:
- 天光、天空盒、室内橱窗映射 Interior mapping
![]()
- 创建方式:
- 在 DCC 软件中创建 .dds 或 .hdr 文件,导入引擎
- 导入外部制作的 HDR 全景图
![]()
- 使用导入的纹理作为天光
![]()
- 在引擎中动态创建
- 添加 Scene Capture Cube 场景捕获立方体,放置在场景中的封闭空间中(模拟全局环境),并设置立方体纹理渲染目标
![]()
- 将立方体纹理渲染目标映射到平面,不同角度观察有不同效果(类似于室内橱窗映射)
![]()
2.3 Volumetric Texture 体积纹理
- 目的:表达 3D 空间信息,而不仅仅表达物体表面信息
- 原理:将 2D 纹理分块,每块代表 3D 空间一个横截面的信息
- 用途:
- 将复杂的着色预计算后烘培到体积纹理
- 常用于云雾烟等特效表现
![]()
- 假定有一张 16*16 像素的噪点纹理材质,基础通道着色器含 223 条指令
![]()
- 将此纹理材质烘培到 RT 渲染目标,由 RT 转静态纹理,再由静态纹理最终生成 Volumetric Texture 体积纹理
![]()
- 将 Volumetric Texture 体积纹理运用于材质,可以制作波光粼粼效果,基础通道着色器指令数减少到 45 条
![]()
2.4 RenderTarget 渲染目标
- 目的:运行时动态创建纹理内容(如上节案例所示,使用 Draw Marital to Render Target 节点运行时创建)
- 用途:
- 将引擎模拟的内容烘培成静态纹理,减少消耗
- 引擎延迟渲染管线中的 Gbuffer 就是一系列的渲染目标
- Shader Map 阴影贴图等也用到
- 各种特效(如水底倒影、雪地轨迹...)
2.5 Streaming Virtual Texture 流式虚拟纹理
- 使用固定的内存开销情况下,支持更大尺寸的纹理,运行时,由引擎动态调度加载/卸载哪个纹理层级的哪个部分
- Streaming Virtual Texture 流式虚拟纹理采样(相较于普通纹理采样),需要更高的 GPU 开销,有利于更好地 batching
![]()
- Streaming Virtual Texture 流式虚拟纹理与 Texture Streaming 纹理流送的区别:
|
Streaming Virtual Texture 流式虚拟纹理 |
Texture Streaming 纹理流送 |
|
|
信息计算 |
GPU 基于 G-Buffer 信息(精确度更高) |
CPU 基于包围盒信息/UV 信息等计算当前一帧所需纹理的 LOD 层级(信息未必准确) |
|
加载 |
按需加载可见区域,将纹理细分为 tile(默认尺寸 128*128),以节省资源和内存开销 |
会加载整个 mip 层级(哪怕只显示了一小部分) |
- UDIM 支持超大尺寸贴图拼接:将几个正常尺寸的贴图拼接成超大尺寸虚拟纹理,方便统一多种物体的材质(使用同一个 Shader),进行合拼渲染,减少 DrawCall,提升渲染效率
- UDIM 文件格式命名规范:文件名.UDIM数值编码.png
![]()
- 修改 UV 范围为:0-2
![]()
- 打开优化视图:虚拟纹理待定 Mips,查看是否理想
![]()
- Virtual Lightmap 虚拟光照贴图的支持:导入一个超大尺寸纹理时会自动转换为虚拟纹理
![]()
- 将一般纹理右键 Convert to Virtual Texture 转换为虚拟纹理,右下角出现 VT 提示
![]()
- 采样器类型:相应的变化为虚拟
![]()
- 假如导入一张超大的纹理,Streaming Virtual Texture 流式虚拟纹理被自动勾选
![]()
- 控制台命令
r.vt.borders 1查看流式虚拟纹理的 debug 信息
2.6 Runtime Virtual Texture 运行时虚拟纹理
- 目的:运行时支持动态生成的超大纹理
- 用途:
- 超大的过程纹理 / 渲染目标(Render Target),可用于大地形
- 支持更多的纹理混合,提升品质
- 用作超大的作为一个巨大的渲染结果缓存,优化运行效果(空间换时间)
- 地图分层渲染
- 使用:
- 不适合动态物体(不能保证每帧及时更新),适合扁平的物体(如:道路)
- 可以存储 YCoCg 编码的颜色以替代 RGB 颜色,可以改善 Color Banding and Shade 色带和色差(但会多出 25% 的内存消耗)
- 瓦片拼合时边界的处理 Tile Border anisotropic filtering(Tile Border 默认 4,可设置更高,)
- 同 Streaming Virtual Texture 流式虚拟纹理,使用 Runtime Virtual Texture 运行时虚拟纹理前,需先打开
![]()
- 创建 Runtime Virtual Texture 运行时虚拟纹理,设置需要保存的信息
![]()
- 在场景中放置 Runtime Virtual Texture Volume 运行时虚拟纹理体积,指定使用的范围
![]()










































浙公网安备 33010602011771号