Web3D技术探索之路
如果无法正常显示,请先停止浏览器的去广告插件。
1. Web3D技术探索之路
刘茜
奇安信科技集团
2.
3. 个人简介
大屏主视觉开发 Web3D开发
2017-2018 2020-今
QAX
QAX
流体、三维重构 3D地图引擎开发
2013-2016
USTB 2019-2020
QAX
4.
5. • 业务背景
• 场景拆解和搭建
• 技术架构
• 优化方案
• 未来规划和展望
6. • 业务背景
• 场景拆解和搭建
• 技术架构
• 优化方案
• 未来规划和展望
7. 大屏主视觉业务
8. 2021年之前
3D贴图工程师
3D开发能力
业务场景需求
平面设计能力
9. 竞品技术方案对比
DataV
RayData
51World
10. 2021年之后
3D搭建工程师
3D开发能力
业务场景需求
3D建模能力
11. 奇安信3D演化道路
2019-2020
City
District
Earth
Topo
2020-2021
12. • 业务背景
• 场景拆解和搭建
• 技术架构
• 优化方案
• 未来规划和展望
13. City场景拆解
水平近远
精模
素模
天际线
天际
素模
精模
14. City场景拆解
垂直高度
数据
氛围
城市基础
15. 模型选择
• fbx
• FilmBox(MotionBuilder),3D ⻆色动画软件,Autodesk 家族
• 专注于动作制作,在modeling和rendering上有赖于其他软件的配合
• obj、mtl
• Alias|Wavefront(Alias),加拿大图像业巨头
• 两种格式需要配合使用,很受欢迎
• collada
• Sony ,基于 XML
• 为娱乐而生、Google Earth
• glTF
• 工业界(Microsoft、Cesium、Unity etc.)共同提出、维护
• 高效、可扩展
16. glTF2.0
17. glTF2.0
18. 建模工具选择
Blender优势
• 实时渲染
• 开源免费,扩展性强,插件丰富
• 全平台(Windows、MacOS、Linux)
• 基于工作流的交互方式
• 操作效率高
19. 渲染底层选择
20. 编辑器选择
21. 设计-研发约定
glTF支持
glTF不支持
• Bloom
• SSAO
• HDR
• 粒子动画
• 涟漪动画
• 菲涅尔
• 脚本逻辑
• 。。。
22. 基于业务的编辑器
模型加载 代码生成
业务模型 光照 氛围
后期 数据 动画 脚本
23. 基于glTF2.0设计研发工作流
24. 建模阶段
25. 模型数据来源
Blender GIS 插件
行政区划
GeoJSON
开放地理数据
ShapeFile
坐标映射
地图数据模型导出
FBX
26. 城市模型导出
服务器发布
矢量瓦片
5G空间
服务端
binary
材质
贴图
自研的3D地图Lib
生成地理信息的面
划定范围导出
FBX模型
客户端
27. 插件实现UV动画导出
Blender插件
Mapping的k帧
Blender材质编辑器
Blender插件导出机制及引擎解析
28. 研发阶段
29. 研发需要实现的能力
模型加载 代码生成
业务模型 光照 氛围
后期 数据 动画 脚本
30. IBL+HDR
等量矩形贴图
立方体贴图
31. 基于业务的编辑器
模型加载 代码生成
业务模型 光照 氛围
后期 数据 动画 脚本
32. 后期
SSAO
Bloom
原图
亮度提取
高斯模糊
叠加原图
原图
深度缓冲
AO
叠加原图
33. 研发需要实现的能力
模型加载 代码生成
业务模型 光照 氛围
后期 数据 动画 脚本
34. 氛围
粒子动画
匀变速运动
涟漪/扫光
35. 研发需要实现的能力
模型加载 代码生成
业务模型 光照 氛围
后期 数据 动画 脚本
36. 帧动画
37. 交付阶段
38. 导出项目工程
assets
lib
场景内容
Runtime
39. • 业务背景
• 场景拆解和搭建
• 技术架构
• 优化方案
• 未来规划和展望
40. 3D编辑器
41. 3D编辑器框架
42. 模块组织关系
3D编辑器
消费
资源模块
能力
消费
ECS引擎
43. 资源模块
44. ECS设计
45. 脚本生命周期
46. 研发需要实现的能力
模型加载 代码生成
业务模型 光照 氛围
后期 数据 动画 脚本
47. ECS脚本开发
自定义行为组件
实体添加组件
48. 代码分层
业务逻辑代码
业务组件
渲染基础
核心
依赖
49. • 业务背景
• City场景案例
• 技术架构
• 优化方案
• 未来规划和展望
50. 优化方案
增加本地缓存,减少网络请求
多线程计算,减少主线程压力
•
计算优化:WebWorker
•
缓存优化:IndexedDB
•
交互优化:GPU拾取
CPU
GPU 减少GPU上传
•
渲染优化:Mesh合并
•
纹理优化:纹理合并
内存 减少GPU和CPU内存占用
•
面数优化:复用资源
•
文字优化:矢量字体
51. 渲染优化
渲染的场景大,模型多,导致帧率低
减少DrawCall
合并前
相同材质的物体合并Geometry
合并后
52. 面数优化
大场景中,使用的模型面数多,文件大,复制的面数少,物体多
8ms
树
1ms
0.64ms
树林
0.5ms
0.5ms
利用纹理和alpha使用简易面
森林
合并且复用物体
53. 纹理优化
图片上传多、琐碎
纹理合并上传,Mesh调整UV使用
材质多个属性通道烘焙到一个纹理
Ambient Occlusion (R)
Roughness (G)
Metallic (B)
NormalMap
Base Color
54. 文字优化
超大文字渲染更优方案,SDF(Signed Distance Field)
SDF字符集
生成SDF文字
24
256
渲染SDF文字代码
Signed Distance Field
SDF文字图集
500
55. 计算优化
文字碰撞检测、模型解析占用主线程时间,希望可以不阻塞主线程
WorkerPool伪代码
Web Worker
生成WorkerPool,根据task值判断结果类型
SharedArrayBuffer
Worker
Running
分配任务
Worker
Waiting
结束任务
结束任务
分配任务
Worker
Running
Pool
分配任务
创建任务,根据task值判断任务类型
结束任务
Worker Pool
56. 交互优化
物体多,物体合并,拾取不准确,射线检测慢
GPU拾取
给每个实体一种颜色,渲染一遍,有鼠标事件时读取像素颜色,反推实体ID
• 多Mesh合并后的精确拾取
• GPU修改顶点的物体拾取
八叉树拾取
使用八叉树数据结构,将场景中的模型放入不同cell中,适合稳定布局场景
57. • 业务背景
• City场景案例
• 技术架构
• 优化方案
• 未来规划和展望
58. 材质编辑器
材质节点编辑,解决自定义材质问题,帮助设计师创造材质
59. 地图 vs 定制建筑
60. 总结
• 3D模型化:释放压力
• 场景搭建和工作流:明确⻆色分工
• ECS引擎:组合灵活
• 优化方案:量体裁衣
61.
62.