纹理优化二-模型贴图优化

1. 贴图加载过程分析

以一个基于物理引擎渲染的电视机 Demo 模型为例,一般会输出几种尺寸较大的贴图文件:颜色贴图,法线贴图,金属粗糙贴图,如下图例子所示:
纹理优化二-模型贴图优化_第1张图片

输出贴图一般为 png 格式,许多同学会通过压缩 png 或者将 png 转成 jpg 格式减少纹理大小,其实这种处理方式只优化了图片加载速度,加载完毕后,png/jpg 仍需要全部转码为纹理(texture)才能开始渲染,而具有相同尺寸的贴图纹理 GPU 占用内存大小相同,故压缩后的 png/jpg 对于渲染过程并没有优化 庆幸的是许多设备都有可直接用于渲染的 GPU 压缩纹理(compress texture)格式,压缩纹理可比由 png 直接转换的纹理减少5倍或以上的大小。如果直接提供压缩纹理格式,则不需要进行 png 的转码过程且可大大减少纹理内存。如下图方案2所示:
纹理优化二-模型贴图优化_第2张图片

但由于 GPU 芯片提供商太多,设备的压缩纹理格式多种多样(例如安卓设备常用格式是 ETC1/ETC2,苹果设备是 PVRTC…),手动输出多种格式代价大,导致方案2较难落地。

2. Basis Universal 压缩

Google和Binomial宣布已合作开源Basis Universal GPU纹理编解码器,在保持GPU性能效率的同时,提升Web、桌面端和移动应用程序中图像传输的性能。此版本填补了图形压缩生态系统中的一个关键技术空白,同时也补充了Draco几何压缩的部分早期工作。
Basis Universal纹理格式在GPU上的资源占用比传统JPEG格式小6-8倍,但文件存储所需空间大小却与JPEG相似,这使得它成为当前那些效率低下且无法跨平台运行的GPU压缩方法(如JPEG、PNG等)的一个良好替代方案。Basis Universa纹理格式创建的压缩文件适用于各种常见应用场景:游戏、VR和AR、地图、照片、短视频等。
如果没有通用纹理格式,开发人员将仅有以下两个选项:

  • 使用GPU格式但无法降低存储大小

  • 使用其它可减少存储大小的格式但却无法获得与GPU媲美的性能。

无论是对GPU制造商、软件开发人员还是无法获得良好跨平台体验的最终用户而言,改进并维护这么多不同的GPU格式对整个音视频开发生态来说都是一件负担。我们正在通过这个颇具内在灵活性的解决方案(如可选的更高质量模式)简化这一过程,对每个人来说都可以更轻松地改进与维护。

转折点在于今年五月份,Binomial 公司推出了 Basis Universal 压缩 GPU 纹理技术,Basis Universal 支持多种常用的压缩纹理格式,将 png 转换为 basis 文件后,大小与 jpg 格式差不多,但在 GPU 上比 png/jpg 小6-8倍。
应用程序加载 basis 文件后,可通过 basis 转码器快速转换成适用于设备的压缩纹理格式。如下图(图片来自Google Blog)所示:
纹理优化二-模型贴图优化_第3张图片

Basis 用法也比较简单,可通过 basisu 命令行工具压缩 png,直接从github 官网下载Release版本或者通过 CMake 编译源码,以 Mac 系统为例(Windows 系统将命令改为 basis.exe),列举几种常用用法:

# 进入执行目录
cd bin-osx
# 将.png格式转为 .basis
./basisu xxx.png
# 针对法线/金属/粗糙贴图等linear颜色空间的贴图 需加上-linear
./basisu xxx.png -linear
# 最大限度保证图片质量的转换
./basisu xxx.png -comp_level 5 -max_endpoints 16128 -max_selectors 16128 -no_selector_rdo
# 最大限度压缩linear颜色空间的贴图
./basisu xxx.png -linear -global_sel_pal -no_hybrid_sel_cb

生成的 .basis 文件需要在程序中通过转码器转成设备的压缩纹理格式,例如在ThreeJS 中可通过 basisTextureLoader 转换,具体用法可查阅ThreeJS 官网。

3. 效果测试

为了数据更加明显,我们在Mac Chrome 浏览器performance模式下,针对同一个电视机模型利用 ThreeJS 各自加载了 4096 x 4096 大小的颜色贴图、法线贴图、金属与粗糙贴图,对比如下:

纹理优化二-模型贴图优化_第4张图片

由上图使用 basis 贴图资源文件大小比 png 减少了11倍以上,同时主线程的脚本时间和绘制时间花销也小于 png/jpg 贴图。
需要注意的是,同样由于不同的压缩纹理格式不同,在 basis 文件一致的情况下,不同设备的渲染表现可能会出现不一致,需要进行多端测试,且目前部分格式不支持 alpha 通道,带半透明的颜色贴图若不生效可考虑单独拆出 alpha 贴图。

相关文章:

纹理优化一、纹理压缩
转载地址

你可能感兴趣的:(cg&图形学,纹理优化,资源管理,纹理压缩,DDS)