从0开发3D引擎(一):开篇
介绍
大家好,本系列带读者踏上Web 3D编程之旅~
本系列是实战类型,从0开始带领读者写出“良好架构、良好扩展性、优秀的性能、最小功能集合(MVP)” 的3D引擎。
本系列的素材来自我们的产品:Wonder-WebGL 3D引擎和编辑器 的整个开发过程。
本系列是我正在写的书的预览版。详情请见:Wonder暂停开发,开始写书
本系列与我的“用函数式编程,从0开发3D引擎和编辑器”系列博文的区别:
-
本系列是它的重写版
-
本系列是实战类型,而它是经验总结类型
-
本系列只写引擎,而它既写引擎又写编辑器
为什么本系列只写引擎?
-
因为大部分人更关心引擎
-
为了加快写作速度,省略需要较多篇幅的编辑器
上一篇博文
下一篇博文
本系列特色
1.完全从0开始,强调实战
2.保持精简,只实现最小功能,重点强调架构、扩展、性能
3.完全、彻底地使用函数式编程
现在3D领域使用函数式编程的资料很少,主流还是使用面向对象。
我以前也是用面向对象,不过自从我开始接触函数式编程,就拥抱了它。
希望能通过本系列,向读者展示函数式编程的魅力,扩展读者的视野和思维。
能给读者带来什么收益?
1.手把手教读者如何从0开发3D引擎
2.学习函数式编程及其在3D领域的应用
3.学习3D编程中基础的功能实现,如纹理、光照、模型等
4.学习引擎的设计和架构,如Data Oriented、多线程等
读者如何学习本系列
本系列从第三部分开始,会开始写程序,开发引擎。建议读者从这部分开始,不要按照文中给出的程序实现,自己再一行一行地重写一遍。因为这样效率低下,而且有可能会出错(虽然“程序实现”试图给出完整的代码,但仍然有可能遗漏了一些细节。这会导致读者如果自己照着写的话,自己写的程序可能会运行失败),所以建议读者阅读每篇文章,理解程序的实现,然后在文末查看该文的完整项目代码。
本系列技术选型
- 使用Reason语言(函数式编程语言,可编译为Javascript)
Reason是在Ocaml语言的基础上修改而来,专门提供给前端开发者使用。
Reason是函数式编程语言,使用Bucklescript编译器编译成javascript语言。
在我看来,至少有两大优点:
1.编译后的javascript优化得非常好,让我们能够高性能地使用函数式编程。
2.强类型和类型推导,让我们既不用向Typescript那样定义很多类型(Reason会帮我们推导类型),又可以享受强类型约束的好处(编译时能检查更多的错误)。
我们Wonder已经使用Reason两年的时间了,所有产品,包括前端后端,都用Reason语言写,非常好用。
Reason的相关评价详见:
如何评价 reasonml ? -> Wonder的回答
如何评价 Facebook 推出的编程语言 Reason?
- 使用WebGL 1.0作为底层API
为了引擎能跑在移动端,我们选择WebGL 1.0而不是WebGL 2.0。
引擎的特色
-
函数式编程
-
使用“函数式反应式编程”(FRP)实现异步
-
多线程渲染
-
Data Oriented
-
契约检查
-
基于job的可扩展的渲染管道
引擎支持的运行环境
重点支持桌面端浏览器(引擎的多线程渲染等功能只能在桌面端开启):
- Chrome
- Firefox
- 360 browser(v10.0及以上)
- qq browser(v10.4及以上)
也能够支持移动端浏览器:
- 微信浏览器(安卓4.4及以上、ios 8及以上)
内容规划
本系列分成六个部分:
第一部分:准备(已完成)
主要内容:
- 准备预备知识
- 搭建开发环境
- 搭建测试环境
第二部分:基础(已完成)
主要内容:
-
学习函数式编程
-
学习函数式反应式编程
-
学习Reason
第三部分:搭建雏形(已经开始写)
主要内容:
-
编写最小的3D程序
-
从中提炼引擎
-
改进引擎架构
第四部分:增加功能(没有开始写)
主要内容:
-
增加基础功能
-
加入Scene Graph
第五部分:增强扩展性(没有开始写)
主要内容:
-
加入脚本组件
-
加入自定义材质
-
加入其它可能的扩展,如ui扩展等
第六部分:应用(没有开始写)
主要内容:
-
通过引擎支持的扩展,加入实际应用需要的功能(如picking等)
-
实现几个完整的3D应用
推荐我发布的相关的精品资料
如果读者想全面了解Web 3D的相关学习资料,推荐阅读分享收集的Web 3D学习资源:
本文中分享了我收集的Web 3D相关的博客、书籍、教程、demo等内容
如果读者想要学习“敏捷开发+领域模型驱动+2D游戏开发”,推荐阅读炸弹人游戏开发系列:
本系列博文记录了炸弹人游戏迭代开发的过程。在开发的过程中,代码会不断重构,领域模型会不断演变,高层划分也会不断变化。
如果读者想要学习“开发2D引擎”,推荐阅读提炼游戏引擎系列:
本系列记录了从炸弹人游戏中提炼2D游戏引擎YEngine2D雏形的实战过程,您可以通过本系列了解到引擎提炼的思想、引擎的设计以及引擎是如何从游戏中提炼的,学习引擎开发的知识。希望对您能有所帮助!
如果读者想要学习“面向对象设计+前端架构”,推荐阅读前端的架构设计与演化实例:
本文介绍我在实际的前端项目中的架构设计,展示因为需求变化而导致架构变化的过程。
全文分为三个阶段,分别对应三次需求的变化,给出了对应的架构设计。
在第一个阶段中,我使用面向过程设计;在第二个阶段和在第三个阶段中,我使用面向对象设计。