哔哩哔哩自研虚拟偶像文件格式BVA已开源!
本期作者
刘宏伟
哔哩哔哩资深开发工程师
负责主站直播中心的虚拟产品开发,专注于虚拟基础能力的建设。
背景
目前现存的3D文件格式,主要有三大类,有专门面向模型设计者的格式如FBX,DAZ,还有引擎专用的资源,该类资源可以包含几乎所有引擎支持的功能性数据,而还有一类偏小众的文件格式就专门针对某些特定领域,其中在互联网上流传最广泛的当属MMD格式,在B站上也有大量用MMD生成的视频内容,类型下图对现有的一些3D格式类型做了功能和应用场景上的对比。
3D格式对比图
通过分析当前主流3D格式,我们了解到现有几种主流3D格式的局限性,为了支持玩家创作高自由度的3D世界,并能进行分享交易,有必要拥有一个能够克服以上缺陷的新文件格式。该格式像png这种图片格式一样,不受操作系统,工具类型和版本影响,易于使用和创建修改等,方便在运行时进行加载和导出,只不过是以3D的形式进行呈现的。
目前为止最适合作为角色模型“载入即用”模型中,只有VRM是比较合适的,MMD由于历史久远,没有对面捕和动作捕捉做很好的兼容性适配,于是日本多家企业联合推出里“VRM”格式,用于处理VR应用程序的Avatar模型数据,如今亦被广泛应用于vTuber。因为其为日本企业联合制定的,具有一定的局限性,并仅有关于人物角色部分的数据定义。并且有一定的区域特性,如口型匹配只能适配日文,而用于处理3D渲染画面的Shader只支持三种 MToon,Unlit,PBR,扩展的灵活度上非常受限,不支持动画,不支持场景加载,第三方集成商也无法方便的扩展自己的功能,这些要素都阻碍了vTuber行业发展,现在的优质vTuber通常采取价格昂贵的定制方案。
为了填补上述各类格式能力上的一些缺陷,增强已有格式能力,并掌握自治权,以便控制格式能力的覆盖范围和扩展性,我们认为有必要创造一种适合中国本土化的标准格式,以满足日益繁多的业务和本土化特色需求,并掌握虚拟生态的话语权。基于此需求,哔哩哔哩BVA应运而生。
BVA的能力价值
多种应用场景
哔哩哔哩BVA的能力价值:
格式自研物理系统展示
满足文件化的需求,作为可传播,交易使用的介质。如资源商店,开放平台内容载体,web3.0下的NFT应用;
提供功能开发扩展的第三方开发者工具;
其作为哔哩哔哩官方标准的同时,第三方也可定制开发以便支持特定内容,满足第三方入驻应用的特殊需求。
bilibili旗下产品使用场景
基本技术规范
文件基本结构遵循GLTF标准,那么为什么遵循GLTF标准呢?主要有以下几个原因:
glTF是对近二十年来各种3D格式的总结,使用最优的数据结构。来保证最大的兼容性以及可伸缩性。这就好比是本世纪初xml的提出,有大量科技巨头的第三方支持。
因为json描述文件的特点,它支持预留一般以及特定供应商的扩展,故而在自制导入导出额外数据的时候会很方便,扩展性是无穷的。
glTF能够包括场景、灯光、动画等,也能够包括网格、材质、纹理,甚至包括了渲染技术。
已经在短短几年内被大量专业工具,游戏引擎,WebGL 所支持,背靠Khronos组织,拥有良好的开源生态。
GLTF结构
组织结构的文件是一个JSON,描述该模型的节点层级,材质,相机,动画等相关逻辑结构,bin则对应这些对象的具体数据信息,纹理内容则单独以PNG,JPG文件的形式存在。GLB文件则将以上所有的数据打包到一个文件里。
gltf文件组成
资源引用上以Scene(场景)和Node(场景中的基本节点,在Unity中就是GameObject)作为入口向下映射到其他各种类型的资源。
gltf文件结构树
对比VRM有何优势?
我们自研的BVA优势如下:
运行时完全兼容标准GLTF文件,扩展功能以Extension或者Extra的形式添加,不会破坏GLTF标准,可以在各个游戏引擎,WebGL上使用,能被专业设计软件直接打开编辑(Maya, Blender, C4D等);
支持场景导出,动画,多媒体,Cubemap天空盒,Draco网格压缩,自定义材质参数和脚本参数等均支持,功能性可以不断扩展,包含代码生成工具,对开发者,创作者,用户均有着友好的支持;
材质可以自行选择,确立属于自己的标准规范,且包含了代码生成工具,可以应对快速的变换需求;
可针对业务灵活定制组件或用户端自定义逻辑,这些数据也可以导出到文件,例如可以将一个VR女友放到文件里,而非独立生成应用。
BVA运行时的框架
BVA运行时架构图
文件加载机制
单个文件本身可以包含多场景,其中SceneID指定了多个Scene中的一个。对于单场景,其资源加载和移除都是立即的,如果后续还需要用到,需重新载入整个文件。
场景加载方式上主要有如下两类:
为Avatar专门写的多线程快速加载更多适用于较小的文件体积,加载的时候会卡主渲染线程,大场景会有明显的卡顿和Crash风险(长时间不响应系统可能会自动结束进程)。
为了兼顾大场景渐进加载并减少内存占用,提供一种Payload机制,只在需要的某个资源的时候才开始加载该资源,采取Recursively Load(递归式加载)的方式加载。
Recursively Load的优缺点
只有当用到该资源的数据才会开始读取到内存中,并且不会导致主线程被阻塞,物体可以在后台静默加载,不影响主线程的渲染和用户操作,适用于大场景的加载,由于不会失去响应,crash的风险很低,但缺点就是无法分解任务并行处理,加载速度偏慢。
在Unity游戏引擎内的编辑模式
和运行时不同使用机制
随着技术的进步,现在的游戏,尤其是AAA级游戏的品质每隔五年就会有很大的一次提升,开发成本也会剧增,在这个过程中,对游戏引擎的要求也越来越高,现代引擎如Unreal Engine,Unity3D普遍都有着功能强大的编辑器,在可视界面下的这种工具极大的方便了开发者的开发历程。基于该特点,本格式提供的Unity SDK同时处理了编辑器和下编辑模式的导入和运行时两种模式的加载使用。
文件在Editor和Runtime下的不同处理流程
GLTFSceneImporter进行Runtime的文件加载,所有的资源都直接保存到内存或显存中,不写入到本地,SDK中Runtime层的东西被用于第三方应用引入后将支持该文件格式的载入与导出功能,例如第三方再引入该SDK后可以将任意创建的3D资源导出为该格式。
在游戏引擎下视为资源用GLTFImporter进行导入的时候,先调用GLTFSceneImporter构建整个场景,然后遍历整个场景中的Mesh, Animation, Material, Texture等资源, 将这些资源通过写入到工程的本地文件里,写入到工程资源目录中后将会进行引用重指向,以建立在游戏引擎下的编辑状态的引用,在编辑模式下,将具备全面的文件导出配置功能。
AssetImportContext可以直接将某些资源,如Mesh,Avatar,Animation直接与文件本身关联起来,不用以独立的文件存在与工程中,点击展开该文件即可看到这些内容。
文件的创建和使用流程
SDK支持加载该格式与标准gltf格式文件,而VRM,MMD这类资源借助第三方库也能实现加载。并且任何方式加载到场景中的资源,均可以被导出,只要是受支持的导出类型,在游戏引擎编辑模式下可以实现全面的功能导出,在运行时下,也可以使用大部分的导出功能,第三方开发者可以在此之上打造各种内容生成工具,例如捏人工具。
文件导出工具界面
SDK已完成事项
标准GLTF支持的所有Scene,Node,Mesh,Material,Texture等信息记录
添加KHR_materials_pbrSpecularGlossiness, KHR_materials_unlit, KHR_materials_clearcoat 等官方gltf扩展的实现
灯光导入导出支持,使用GLTF的KHR_lights_punctual扩展
相机导入导出添加额外的引擎特定数据,但仍保留gltf 标准中camera的支持
几类常见碰撞体,球形,方形,圆柱形,胶囊形
自定义材质类型的导入导出扩展系统设计
骨骼蒙皮Skin
Blendshape 网格形变,一般用于角色的面部表情变换
Animation 动画包含物体的空间位置(位置,旋转,大小)和BlendShape的变换
Avatar记录人体骨架数据,用于通用的人形动画和动作捕捉
音频数据(已支持wav, mp3, ogg)
添加URL数据导出,使用方式待定
流媒体视频播放,URL引用各种外部资源(包括网络文件,流媒体,本地文件)
Meta数据,License信息,主要决定可以在哪些用途下使用该模型,比如是否允许使用在轻微色情或暴力活动上
BlendshapeMixer 表情混合输出
Timeline系统,可以基于时间轴去实现各种动画的混合,包括动画,声音,Avatar表情控制,物体的可见性,材质参数等
Skybox天空盒系统
PostProcess后处理
DynamicBone(头发和衣服物理系统)
Decal 用于制作喷漆,贴花
TextMesh 基于网格的文字显示
Draco非常流行的一个开源网格压缩标准,属于官方支持的扩展
Cubemap (Panorama 或者Vertical and horizontal cross layouts)
Sprite,用于2D渲染或者UI
Lightmap 场景烘焙贴图(RGBM Encoding,线性贴图)
EventSystem 事件系统
SDK中包含的工具或能力
分散文件(.gltf) & 压缩包(.zip) & 整包(.glb) 导出与加载
针对Avatar编写了全新的加载机制,速度有极大的提升
Runtime下的Load和Editor下的导入为预制体和工程Asset做了一定的区分
VRM和MMD资源转换,主要是迁移原先的材质和物理系统,并给面捕做新的适配
材质Shader导出代码生成工具
组件参数的Extra导入导出代码生成工具
Legacy动画导出,Humanoid动画转Legacy以兼容标准gltf的工具
文件查看器 ,可以预览该文件格式的大部分功能
计划中的功能开发
提供脚本语言的支持,如lua,typescript,并可以自由选择解析引擎
提供UI的支持,使用基本的UI元素作为信息做存储
针对直播或社交类游戏的场景做一些功能性组件
Unity SDK现已开源,快去看看吧!
https://github.com/bilibili/UnityBVA