【Unity】纹理

【Unity】纹理

https://docs.unity.cn/cn/2022.3/Manual/Textures.html

纹理的作用

  • 用于表示 3D 模型表面。
  • 用于表示 2D 图形。
  • 用于 GUI。
  • 用于粒子系统。
  • 用于地形高度贴图。

导入纹理

纹理是一种位图图像,通常通过其他外部软件制作后导入 Unity 中。

纹理有两种主要导入模式:

  • 纹理:3D 项目的默认格式,常做贴图使用。
  • 精灵:2D 项目的默认格式,常做精灵、UI 使用。

纹理尺寸限制

建议尺寸

为了最佳性能,应保证纹理尺寸长宽都是 2 的幂,允许非正方形。

非 NPOT(非 2 的幂)大小的纹理,通常会占用更多的内存且 GPU 采样速度更慢且无法被压缩。甚至有些平台都不支持 NPOT 纹理大小,此时 Unity 将对纹理进行缩放填充,以牺牲更多的内存和加载速度,使其达到下个最近的 2 的幂大小。

对于非 NPOT 的图像,Unity 会在检视面板的图像大小旁标注。为了使图像满足 POT 要求,在 Unity 内可尝试以下方法:

  • 对于纹理模式图像:可利用图像检视面板的“Non-Power of 2”功能强制缩放。
  • 对于精灵模式图像:可利用图集功能将多个 NPOT 合成一个大的 POT 图像。

最大尺寸

不同的平台对最大纹理大小也有限制,目前最大为 16384,最小如 OpenGL ES 2.0 平台,仅支持 2048。

特殊纹理导入

  • 导入 HRP 纹理:Unity 支持包含 HDR 信息的 EXR 或 HDR 文件,导入时会自动根据目标平台选择正确的格式。
  • 导入法线贴图:将纹理类型设为 Normal map 即可。Unity 使用基于 RGB 格式的法线贴图,或者也可以选择从灰度高度贴图生成。
  • 导入 Alpha 贴图:确保图片中包含了 Alpha 通道信息,或者选择从灰度纹理生成 Alpha 信息。
  • 导入细节贴图:当模型很大时受分辨率影响,主纹理无法清晰表示细节内容,此时可使用细节贴图,通常设为灰色为不可见,白色会使主纹理变量,黑色则使主纹理完全变黑。
  • 导入反射(立方体贴图):将纹理形状设置为 Cube 即可。
  • 各向异性过滤:各向异性过滤使从斜掠角观察模型时依然清晰,这是一种资源密集型操作。可在质量设置面板为所有图片强制设置(若图片自己有设置,则将覆盖)。

纹理格式

Unity 支持导入一些常见图片格式,例如 jpg、png 等,但实际上 GPU 并不支持这些,而是使用一些对内存、采样等更加优化的硬件编码格式。

所以 Unity 导入图片后实际会转换成 GPU 支持的格式来进行存储使用,不同平台间支持的格式也有所不同。

通常 Unity 会自动选择最适合当前平台的纹理格式,但对于一些特殊纹理,例如仅使用一个通道做遮罩用,此时可以手动选择更适合的格式,例如 BC4 格式,从而在减少文件大小的同时仍能保证质量。

纹理压缩

每像素位数 (bpp) 表示单个纹理像素所需的存储量。bpp 越低磁盘内存占用越小,GPU 的内存传输带宽也会降低,所以减少纹理大小是一种可对空间时间都进行优化的手段,而纹理压缩就是一种减少 bpp 的方法。

所有纹理压缩都是有损的,但为了性能考虑应保证 bpp 始终在满足视觉要求的最小值上。

确保选择的目标设备支持的压缩格式,因为当目标设备不支持当前的压缩格式时,Unity 会将其解压成支持的默认未压缩格式,并将压缩与非压缩版本都存储在内存中,从而造成纹理加载变慢且占用额外的内存。

Crunch 压缩

Crunch 压缩是一种较特别的压缩格式,其能在 DXT 或 ETC 压缩的基础上,提供额外的可变比特率压缩,可以更精细的控制文件大小和质量平衡。

Crunch 压缩不是 GPU 的原生压缩格式,所以使用时会由 Unity 解压成 DXT 或 ETC 格式,然后再上传到 GPU。虽然 Crunch 压缩在压缩时比较慢,但解压速度是非常快的,所以不用太担心影响加载时间。

Crunch 压缩有助于进一步减少纹理的磁盘空间,但对运行时内存没有影响。

各平台推荐、默认、支持的纹理格式

https://docs.unity.cn/cn/2022.3/Manual/class-TextureImporterOverride.html

特殊纹理

这些纹理都基于 GPU 支持的功能特性。

渲染纹理

渲染纹理是一种 Unity 在运行时创建和更新的纹理,可交予摄像机或自行渲染其画面,然后像正常纹理一样使用。

自定义渲染纹理

自定义渲染纹理是渲染纹理的扩展实现,额外提供了非常多的高级功能,常用于实现焦散、雨水效果、波纹模拟等效果。

  • 支持使用着色器更新内容,并提供了相应框架。
  • 可自定义更新区域、更新所用着色器通道。
  • 可自定义更新频率包括用脚本精细控制。
  • 支持使用双缓冲区更新,在更新时自动交换纹理,解决自读写问题。
  • 可链接自定义纹理,将多个自定义纹理串起来,Unity 会自动按需更新。
  • 可以通过 Export 菜单将自定义渲染纹理导出成图片文件。

注意双缓冲更新目前有性能问题,因为每次交换都会复制纹理,对性能影响较大。

3D 纹理

3D 纹理是位图图形,其中包含三维信息,而不是标准的二维信息。

通常用于仿真诸如雾或烟的体积效果,模拟体积 3D 网格,或存储动画纹理并在这些动画纹理之间平滑混合。

纹理数组

纹理数组是具有相同大小/格式/标记的 2D 纹理的集合,这些纹理对于 GPU 而言像是单个对象,并可在着色器中使用纹理元素索引进行采样。

它们可以用于实现自定义地形渲染系统或其他特殊效果,让您高效访问大量相同大小和格式的纹理。2D 纹理数组的元素也称为切片或图层。

立方体贴图

立方体贴图是六个正方形纹理的集合,这些纹理代表环境中的反射。六个正方形组成一个包围着对象的虚构立方体的各面;每个面代表沿世界轴方向(向上、向下、向左、向右、 向前和向后)的视图。

立方体贴图常用于捕获对象的反射或“周围环境”;例如 天空盒和环境反射通常使用立方体贴图。

立方体贴图数组

立方体贴图数组是一个包含有大小和格式均相同的立方体贴图的数组,GPU 可以将其作为单个纹理资源进行访问。

立方体贴图数组通常用于实现高效的反射探针、光照和阴影系统。

稀疏纹理

稀疏纹理是太大而无法完全存入显存的纹理。为了处理它们,Unity 将主纹理分解为更小的矩形部分,称为“区块”(tile)。然后,可根据需要加载各个区块。

该功能目前仅在一些相当新的 GPU 上受到支持,如 DirectX 11.2 (Windows 8.1) 系统,或者使用支持 ARB_sparse_texture 的 OpenGL。

流式虚拟纹理

https://docs.unity.cn/cn/2022.3/Manual/svt-streaming-virtual-texturing.html

流式虚拟纹理是一项实验性功能,目前仅 HDRP 支持。它将纹理拆分为瓦片,然后在需要时将这些瓦片逐步上传到 GPU 内存中。

这是 mipmap 流系统的另一种替代品,另一种优化手段。当场景中具有很多高分辨率纹理时可大幅减少 GPU 内存使用量和纹理加载时间。


【Unity】纹理
https://bdffzi-blog.pages.dev/posts/1386286002.html
作者
BDFFZI
发布于
2024年5月31日
许可协议