之前项目中的模型面数动辄就会达到一百好几十万面,打成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
的检查器窗口中查看每个对象的属性,以了解它们使用的贴图和材质球。