相关文章推荐
坚强的啄木鸟  ·  Unity 之 ...·  2 天前    · 
风流的松树  ·  Unity ...·  昨天    · 
温暖的电梯  ·  Android 背景模糊处理 ...·  10 月前    · 
被表白的茶叶  ·  持久功能与 Apache ...·  1 年前    · 

之前项目中的模型面数动辄就会达到一百好几十万面,打成ab包之后也差不多要一百多M,在5G尚未普及的情况下,对于用户的下载体验肯定是很不友好的。所以研究了一下模型的压缩算法,找到了一个比较不错的解决方案,由此记录和分享一下。

思路构想:

1.将模型压缩并上传至服务器

2.从服务器下载模型并解压。然后进行加载

在尝试了一些压缩格式之后,发现压缩率并不理想,更不要说还未进行的解压和加载工作,肯定会耗费更多时间。所以我需要一个更优秀的算法。在了解到draco算法之后尝试了网上的帖子,把obj模型压缩成为.drc格式的文件,之后直接进行加载。虽然体积会缩减。但是缺点也很明显,不能对材质等进行压缩,也就是说只有白模。。。。果断放弃。

在搜索关于draco算法资料时候,偶然发现一篇帖子

如何在页面极速渲染3D模型 - Tencent ISUX Design

gltf格式的文件能否被Unity加载呢?

答案是肯定的

https://github.com/KhronosGroup/glTF

在git上关于gltf的文章,可以看到对Unity的支持,并且有相关的插件提供(虽然并不符合我的需求)

至此,把方案确定为。压缩模型为gltf格式,并上传至服务器。下载后在Unity内进行加载。

转换工具 : FBX2glTF

git地址: GitHub - facebookincubator/FBX2glTF: A command-line tool for the conversion of 3D model assets on the FBX file format to the glTF file format.

系统为windows。下载后是一个.exe文件。需要用命令行工具打开

-h进入help菜单,可以查看相应命令。

-i 输入地址

-o 输出地址

输入指定模型之后即可生成相应的gltf文

FBX2glTF内置了draco算法。不要忘了键入相应指令

文件压缩前后大小对比 可以看出 压缩率还是可以的

压缩完之后就是测试加载啦。

unity这里坑还是很多的。之前用的是官方的加载方式。需要对项目代码进行编译,生成Dll文件之后进行调用。不过这种加载速度很慢。而且会对线程造成堵塞。所以找到了一种更快加载的方式。

glTFast : https://github.com/atteneder/glTFast

这个博主给出了自己编译的库。导入到我们的项目中尝试调用

var gltf = gameObject.AddComponent<GLTFast.GltfAsset>();
gltf.url = "https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/Duck/glTF/Duck.gltf";

这里会有几个大坑,着重讲一下

1.该项目需要导入glTFast和Draco 3D Data Conpression两个package 但是不能经由本地加载。只能通过Add package from git url的形势进行导入,该导入需要事先安装git lfs,否则会失败(俄罗斯套娃)。分别输入 https://github.com/atteneder/glTFast.git & Andreas Atteneder / DracoUnity · GitLab 两个包体的地址 进行等待 则导入正常

2.在本地加载没有问题,但是在其他平台会报一个错误。Arguement can not be null :shader。这里需要我们在编辑器下进行shader的预加载工作 ,然后保存到本地的shader variants内,指定相应的shader variants后即可正常加载。

这个时候会发现。在本地加载时间大概为2s左右。而在其他的平台,加载的时间也大大超过了预期。博主在git中给出了代理的优化方式。代理共有两种,一种是流畅帧,另外一种是非中断式加载模式。

  • TimeBudgetPerFrameDeferAgent for stable frame rate
  • UninterruptedDeferAgent for fastest, uninterrupted loading

具体的加载模式大家可以看实际的项目需求,这里我选择的是非中断加载。

加载完成,在web端的加载速度在1.7s左右

至此模型压缩和加载的工作已经完成。

之前项目中的模型面数动辄就会达到一百好几十万面,打成ab包之后也差不多要一百多M,在5G尚未普及的情况下,对于用户的下载体验肯定是很不友好的。所以研究了一下模型的压缩算法,找到了一个比较不错的解决方案,由此记录和分享一下。思路构想: 1.将模型压缩并上传至服务器 2.从服务器下载模型并解压。然后进行加载在尝试了一些压缩格式之后,发现压缩率并不理想,更不要说还未...
glTF 介绍 1. glTF (GL TransmissionFormat),即图形语言交换 格式 ,它是一种3D内容的 格式 标准,由Khronos Group管理(Khronos Group还管理着OpenGL系列、OpenCL等重要的行业标准); 2. glTF 是一种免版税的规范,用于按应用高效传输和 加载 3D场景和 模型 ; 3. glTF 的设计是面向实时渲染应用的,尽量提供可以直接传输给图形API的数据形式,...
最近需要在 Unity 中解析 GLTF 文件,以及能够导出 Unity 的场景信息。经过查询,最后决定使用Unit GLTF 这个开源库。 1、首选下载代码,git clone https://github.com/KhronosGroup/ Unity GLTF .git 2、打开 Unity GLTF 项目 3、打开项目之后,选择Samples下面的一个场景,在Console有超多的错误信息。 2. 到指定目录 cmd命令行界面进入node_modules\ fbx 2 gltf 文件下的bin文件,然后根据平台选择进入相应目录,示例是window系统选择Windows_NT目录,同时把要转换的 fbx 文件拷贝放在该目录下 3. 批量 格式 转换 执行以下命令,将 fbx 格式 文件批量转换为glb 格式 for %i in ('dir *. fbx ') do FB
Draco 是用于网格 压缩 glTF 扩展以及由 Google 开发的开源库,用于 压缩 和解 压缩 3D 网格以显着减小 3D 内容的大小。它 压缩 顶点位置、法线、颜色、纹理坐标和任何其他通用顶点属性,从而提高在网络上传输 3D 内容的效率和速度。 这意味着 更小的文件大小 和 更快的流式传输,尤其是在 3D Tiles 的情况下,当新的图块出现或需要新的细节级别时,它经常流式传输新的 glTF 模型 。我们一直在与 Khronos 和 Google 合作使 Draco 成为 glTF 扩展,你现在可以在 Ces
Unity 中, FBX 模型 、材质和贴图之间的关联可以通过多种方式来保证。 一种常见的方式是使用 Unity 的材质球(Material)来绑定 模型 和贴图。材质球是一种用于渲染 模型 的组件,它包含有关 模型 的表面特性和渲染属性的信息。使用材质球可以轻松地将贴图应用到 模型 上,并确保它们保持正确的对应关系。在导入 FBX 模型 时, Unity 通常会自动为每个 模型 创建一个默认材质球,您可以在材质面板中更改其属性和贴图。如果您需要为 模型 创建新的材质球,则可以在项目面板中右键单击并选择“Create > Material”,然后将其拖动到 模型 上。 另一种方式是在 FBX 模型 中嵌入材质和贴图。这种方式通常使用外部3D建模软件来完成。例如,在Blender中,您可以在导出 FBX 文件时选择“Embed Textures”选项,这将把材质和贴图嵌入到 FBX 文件中。在 Unity 中导入这种 FBX 文件时,它会自动识别并应用嵌入的材质和贴图。 无论您使用哪种方法,您都可以在 Unity 的资源管理器中查看 模型 、材质和贴图之间的关系。您可以右键单击 模型 或材质,然后选择“Reveal in Explorer”或“Show in Finder”来查看它们在文件系统中的位置。您也可以在 Unity 的检查器窗口中查看每个对象的属性,以了解它们使用的贴图和材质球。