Unity 静态资源优化 – 纹理

纹理资源优化

纹理大小

  • 现代显卡中对于纹理大小的支持一般都使用2的幂次方,大小非2的幂次的纹理资源将无法使用ETC1和PVRTC压缩格式,在导入时自动伸缩为2的幂次也可能会导致内存占用或者贴图质量问题;
  • 不同平台、不同硬件配置选择不同的纹理大小,Unity下可以采用bundle变体设置多套资源、通过Mipmap限制不同平台加载不同level层级的贴图;
  • 根据纹理用途的不同选择不同的纹理加载方式,如流式纹理加载Texture Streaming、稀疏纹理Sparse Texture、虚拟纹理VirtualTexture等方式;
  • 不能让美术人员通过增加纹理大小的方式增加细节,否则会造成纹理使用上的内存爆炸,可以选择细节贴图DetailMap或增加高反差保留的方式;
  • 在不降低视觉效果的情况下尽量减小贴图大小,最好的方式是纹理映射的每一个纹素的大小正好符合屏幕上显示像素的大小,如果纹理小了会造成欠采样,纹理显示模糊,如果纹理大了会造成过采样,纹理显示噪点。这一点做到完美平衡很难保障,可以充分利用Unity编辑器下SceneView->DrawMode->Mipmap来查看在游戏摄像机视角下哪些纹理过采样,哪些纹理欠采样,进而来调整纹理大小;

纹理颜色空间

默认大多数图像处理工具都会使用sRGB颜色空间处理和导出纹理。但如果纹理不是用作颜色信息的话,不要使用sRGB空间,如金属度贴图、粗糙度贴图、高度图或者法线贴图等。一旦这些纹理使用sRGB空间会造成视觉表现错误;

纹理压缩

纹理压缩是指图像压缩算法,保持贴图视觉质量的同时,尽量减小纹理数据的大小。默认情况下纹理原始格式采用PNG或TGA这类通用文件格式,但与专用图像格式相比访问和采样速度都比较慢,无法通用GPU硬件加速,同时纹理数据量大,占用内存较高。所以在渲染中会采用一些硬件支持的纹理压缩格式,如ASTC 、ETC、ETC2、DXT等。

纹理图集

纹理图集是一系列小纹理图像的集合;

优点

  • 采用共同纹理图集的多个静态网格资源可以进行静态合批处理,减少DrawCall调用次数;
  • 纹理图集可以减少碎纹理过多,因为他们打包在一个图集里,通过压缩可以更有效的利用压缩,降低纹理的内存成本和冗余数据;

缺点

  • 美术需要合理规划模型,并且要求模型有相同的材质着色器,或需要制作通道图去区分不同材质。制作和修改成本较高;

纹理过滤

  • Nearest Point Filtering:临近点采样过滤最简单、计算量最小的纹理过滤形式,但在近距离观察时,纹理会呈现块状;
  • Bilinear Filtering:双线性采样过滤会对临近纹素采样并插值化处理,对纹理像素进行着色。双线性过滤会让像素看上去平滑渐变,但近距离观察时,纹理会变得模糊;
  • Trilinear Filtering:三线性过滤除与双线性过滤相同部分外,还增加了Mipmap等级之间的采样差值混合,用来平滑过度消除Mipmap之间的明显变化;
  • Anisotropic Filtering:各向异性过滤可以改善纹理在倾斜角度下的视觉效果,适合用于地表纹理;

纹理Mipmap

逐级减低分辨率来保存纹理副本。相当于生成了纹理LOD,渲染纹理时,将根据像素在屏幕中占据的纹理空间大小选择合适的Mipmap级别进行采样;

优点

  • GPU不需要在远距离上对对象进行全分辨率纹理采样,因此可以提高纹理采样性能;
  • 同时也解决了远距离下的过采样导致的噪点问题,提高的纹理渲染质量;

缺点

  • 由于Mipmap纹理要生成低分辨率副本,会造成额外的内存开销;

Unity纹理导入设置

Texture Shape

  • 2D:最常用的2D纹理,默认选项;
  • Cube:一般用于天空和与反射探针,默认支持Default、Normal、Single Channel几种类型纹理,可以通过Assets > Create > Legacy > Cubemap生成,也可以通过C#代码 Camera.RenderToCubemap在脚本中生成;
  • 2D Array 2D:纹理数组,可以极大提高大量相同大小和格式的纹理访问效率,但需要特定平台支持,可以通过引擎SystemInfo.supports2DArrayTextures 接口运行时查看是否支持;
  • 3D:通过纹理位图方式存储或传递一些3D结构化数据,一般用于体积仿真,如雾效、噪声、体积数据、距离场、动画数据等信息,可以外部导入,也可运行时程序化创建;

Alpha Source

默认选择Input Texture Alpha即可,如果确定不使用原图中的Alpha通道,可以选择None。另外From Gray Scale一般不会选用;

Alpha Is Transparency

指定Alpha通道是否开启半透明,如果位图像素不关心是否要半透明可以不开启此选项。这样Alpha信息只需要占1bit,可以节省内存;

Ignore Png file gamma

是否忽略png文件中的gamma属性,这个选项是否忽略取决于png文件中设置不同gamma属性导致的显示不正常,一般原图制作流程没有特殊设置,这个选项一般默认即可;

Read/Write

开启此选项会导致内存量增加一倍,默认不开启,除非脚本逻辑中需要动态读写该纹理时需要打开此选项;

Generate Mip Maps

什么时候不需要生成MipMaps?

  1. 2D场景;
  2. 固定视角,摄像机无法缩放远近;

Border Mip Maps

默认不开启,只有当纹理的是Light Cookies类型时,开启此选项来避免colors bleeding现象导致颜色渗透到较低级别的Mip Level纹理边缘上

MipMap Filtering

  • Box:最简单,随尺寸减小,Mipmap纹理变得平滑模糊
  • Kaiser:避免平滑模糊的锐化过滤算法。

Mip Maps Preserve Coverage

只有需要纹理在开启mipmap后也需要做Alpha Coverage时开启。默认不开启;

Fadeout MipMaps

纹理Mipmap随Mip层级淡化为灰色,一般不开启,只有在雾效较大时开启;

选择合适纹理过滤的最佳经验

  • 使用双线性过滤平衡性能和视觉质量;
  • 有选择地使用三线性过滤,因为与双线性过滤相比,它需要更多的内存带宽;
  • 使用双线性和2x各向异性过滤,而不是三线性和1x各向异性过滤,因为这样做不仅视觉效果更好,而且性能也更高;
  • 保持较低的各向异性级别,仅对关键游戏资源使用高于2的级别;

各平台默认纹理压缩格式

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇