从0开发3D引擎(一):开篇

介绍

大家好,本系列带读者踏上Web 3D编程之旅~

本系列是实战类型,从0开始带领读者写出“良好架构、良好扩展性、优秀的性能、最小功能集合(MVP)” 的3D引擎。

本系列的素材来自我们的产品:Wonder-WebGL 3D引擎和编辑器 的整个开发过程。

本系列是我正在写的书的预览版。详情请见:Wonder暂停开发,开始写书

本系列与我的“用函数式编程,从0开发3D引擎和编辑器”系列博文的区别:

  • 本系列是它的重写版

  • 本系列是实战类型,而它是经验总结类型

  • 本系列只写引擎,而它既写引擎又写编辑器

为什么本系列只写引擎?

  • 因为大部分人更关心引擎

  • 为了加快写作速度,省略需要较多篇幅的编辑器

上一篇博文

从0开发3D引擎:目录

下一篇博文

从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雏形的实战过程,您可以通过本系列了解到引擎提炼的思想、引擎的设计以及引擎是如何从游戏中提炼的,学习引擎开发的知识。希望对您能有所帮助!

如果读者想要学习“面向对象设计+前端架构”,推荐阅读前端的架构设计与演化实例

本文介绍我在实际的前端项目中的架构设计,展示因为需求变化而导致架构变化的过程。
全文分为三个阶段,分别对应三次需求的变化,给出了对应的架构设计。
在第一个阶段中,我使用面向过程设计;在第二个阶段和在第三个阶段中,我使用面向对象设计。

本文参考资料

Wonder-WebGL 3D引擎和编辑器
“用函数式编程,从0开发3D引擎和编辑器”系列博文

posted @ 2020-01-02 16:45  杨元超  阅读(1327)  评论(5编辑  收藏  举报