入口:
unity的资源导入入口在AssetDataBase.cpp中ImportAsset。
他会先找给到的metaDataPath来确定这个Asset是属于什么类型。
资源导入继承关系
继承关系中AssetImporter是最基本的资源导入类,然后如果是模型相关的会用ModelImporter继承他,然后如果是fbx相关的资源则会用FBXImporter继承他来实现。资源导入相关的继承关系在AssetPipeline目录下。
生成资源数据
这里比较关键的是AssetDataBase下的importer->GenerateAssetData ();然后他会执行导入DoMeshImport,运行到FBXImporter的DoMeshImport中
在fbximporter.cpp中有ConvertToFBXFile是指把相关的源文件转到fbx下。ConvertToFBXFile下会根据之前的资源的后缀来区分解决,比如区分是maya、max、blend、c4d等转换文件的源文件格式。
FBX读取
然后回到DoMeshImport中CImportSettings记录导入的设置。
LoadAndLookupSymbols这里是解析获取数据的方式,然后DoImportScene是自己写的在UnityFBX这个类里的分析fbx数据的方法。他是用fbx的sdk来导入fbx数据的。
最终用ImportSceneToCImportScene来整合数据到CImportScene中。
组织导入数据类型
回到FBXImporter中的DoMeshImport,CImportSceneToImportScene中会组织nodes数据中的位置缩放旋转等,网格数据,材质数据,摄像机数据,灯光数据,动画数据,采样帧率放到ImportScene结构里面。DoMeshImport最终返回这个数据。
然后ModelImporter的GenerateAssetData后面会GenerateAll生成具体的数据。
生成skinnedmesh相关数据
再GenerateAll下如果发现是要导入skinnedmesh的话就会执行到ImportSkinnedMesh。
再ImportSkinnedMesh中会初始化SkinnedMeshRenderer,然后Setup传入mesh数据。然后就到了SkinnedMeshFilter的Setup中,他会UpdateCachedMesh更新mesh的cache。
组织vbo正式绘制mesh
unity绘制mesh都是通过组织vbo来绘制的,在SkinnedMeshFilter的Render中通过DrawUtil::DrawVBOMeshRaw来执行绘制,给到vbo和mesh来绘制。这里的mesh就是上一步给到的cachemesh。
然后vbo就是看各个平台下的vbo了,比如d3d11的话就是D3D11VBO,d3d的话是D3D9VBO,opengl是ARBVBO,opengles20是VBOGLES20,opengles30是GLES3VBO。
然后会在DrawUtil::DrawVBOMeshRaw下执行vbo.DrawVBO,然后在VBOGLES20中DrawInternal执行opengles20的绘制,到了DrawInternal下就是具体的gl语言绘制了。绑定ebo的buffer,vbo的buffer,然后SetupVertexInput中设置图片数据,颜色数据到opengl,然后通过glDrawElements也就是索引列表来绘制网格,结束整个绘制。
导出以及保存
最终通过AssetImportPrefabQueue的QueuePrefab假如到prefab中。
通过AssetDataBase的GenerateLibraryRepresentation生成数据到library中。