unity code之FBX模型导入与渲染

入口:

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数据的。

基于FBX SDK的FBX模型解析与加载 -(一)_wozhengtao的博客-CSDN博客_fbx sdk

最终用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中。

猜你喜欢

转载自blog.csdn.net/llsansun/article/details/121423747