项目详情

three.js

把 GPU 渲染管线包成 JS 对象,让浏览器里跑 3D 像写 React 一样自然

GitHub 地址 MIT JavaScriptWebGL / WebGPU

更新于 2026-08-04

← 返回汇总
项目速览

一句话定位

Web 端 3D 图形的事实标准库

2010 年由 Ricardo Cabello(mrdoob) 发起的 JavaScript 3D 库。目标:易用、轻量、跨浏览器、通用。把 Scene / Camera / Renderer 三件套抽象成声明式 API,底层用 WebGL/WebGPU 调用 GPU。几乎所有 Web 上的 3D 产品(产品展示、数据可视化、WebXR、游戏)都建立在它或它的衍生框架(React Three Fiber、Babylon 早期借鉴)之上。

项目速览

核心数据

114k
GitHub Stars
36k
Forks
2010
诞生(15 年)
1.5k+
官方示例
为什么存在

它解决的三个问题

WebGL 太底层

原生 WebGL 要手写 shader、管 buffer、算矩阵。一个旋转方块几百行,劝退大多数人。

浏览器碎片化

2010 年代 WebKit/Gecko/IE 各家实现差异大,统一抽象层才能「写一次到处跑」。

3D 知识门槛

数学(线性代数)、光照模型、空间分区门槛高。库封装掉细节,让 Web 开发者专注业务。

🔥 核心原理

渲染一帧发生了什么

调用 renderer.render(scene, camera) 后,库内部按以下管线把 JS 对象转成 GPU 指令:

① Scene Graph 遍历 Mesh/Line/Points 剔除不可见物体 ② 投影矩阵 model → view → projection ③ 渲染排序 透明物体后画 按材质合并 ④ Shader 编译 Material → GLSL 按灯光特征拼接 ⑤ GPU 绘制 drawArrays / drawElements JS 对象 → GPU 帧缓冲 数据上传 (一次) 顶点 / 法线 / UV / 索引 → WebGLBuffer (VRAM) Uniform 更新 (每帧) 相机矩阵 / 灯光参数 → uniform4f / uniformMatrix 光栅化输出 顶点着色 → 片元着色 → Canvas / SwapChain
主流程管线(每帧执行) Shader 动态编译(Material 驱动) 数据搬运层
🔥 核心原理

场景图 + 组件化

three.js 用「场景图」组织 3D 世界。每个 Object3D 有 transform(位置/旋转/缩放),父子关系自动继承变换矩阵。

Scene Mesh (车) Light Camera Geometry Material Mesh = 几何体 + 材质
  • Object3D:所有 3D 对象基类,持 position/quaternion/scale
  • Scene:根节点,管理所有可见物体的容器
  • Mesh:Geometry(形状) + Material(外观)的组合体
  • Camera:不进场景图,但定义观察视角与投影方式
  • 父子继承:移动父节点,子节点跟随——机械臂关节就是这么搭的
🔥 核心原理

Material 如何变成 GLSL

three.js 不让你写完整 shader,而是提供「材质」声明外观,内部按场景特征动态拼接 GLSL。这是它易用性的核心。

// 你只写这一行
const mat = new THREE.MeshStandardMaterial({
  color: 0x2b9246,
  roughness: 0.4,
  metalness: 0.8
});

// 库内部根据场景自动拼接 shader:
// - 场景有 3 盏灯 → 注入 3 次 lighting 计算
// - 开了阴影 → 注入 shadowmap 采样
// - 用了 envMap → 注入 IBL 反射
// - 雾效开启 → 末尾乘雾色
// 结果:一份 GLSL,自动适配当前渲染状态

代价:shader 字符串由几十个 chunk 拼成,改一行要重编译。所以高级用户会用 onBeforeCompile 注入自定义代码,或直接用 ShaderMaterial 写裸 GLSL。

🔥 核心原理

WebGLRenderer 的工作

  • 状态管理:缓存当前绑定的 program/buffer/texture,避免重复 setUniformLocation 调用
  • 程序缓存:相同 Material + 灯光特征 → 复用编译好的 WebGLProgram
  • 几何体上传:首次渲染时把顶点数据上传到 VRAM,后续只更新变化的 uniform
  • 帧缓冲:管理 render target、深度测试、混合模式
  • WebGPU 支持:r163+ 起 WebGPURenderer 进入主线,未来默认
// 最小渲染循环
renderer.setAnimationLoop(() => {
  mesh.rotation.y += 0.01;
  renderer.render(scene, camera);
});

// setAnimationLoop 用
// requestAnimationFrame,
// 与浏览器刷新率同步
// (通常 60fps,VR 90fps)
架构分层

库的四个抽象层

L4 应用层
Examples / Addons
1500+ 示例 + 后处理、控制器、加载器、特效。import 时按需引入。examples/jsm/
L3 API 层
Scene / Mesh / Material
声明式对象 API。开发者 99% 时间在这层,无需懂 GPU。src/objects, src/materials
L2 渲染层
WebGLRenderer / WebGLProgram
把 L3 对象翻译成 draw call。管 shader 编译、状态机、buffer。src/renderers
L1 数学层
Vector3 / Matrix4 / Quaternion / Euler
向量/矩阵运算。可独立使用,许多库直接 import 这层。src/math
快速上手

五分钟跑起一个 3D 立方体

import * as THREE from 'three';

// 1. 场景 + 相机 + 渲染器
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, innerWidth/innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(innerWidth, innerHeight);
document.body.appendChild(renderer.domElement);

// 2. 几何体 + 材质 → 网格
const cube = new THREE.Mesh(
  new THREE.BoxGeometry(),
  new THREE.MeshStandardMaterial({ color: 0x2b9246 })
);
scene.add(cube);
scene.add(new THREE.DirectionalLight(0xffffff, 1)); // 别忘了灯
camera.position.z = 3;

// 3. 动画循环
renderer.setAnimationLoop(() => {
  cube.rotation.x += 0.01;
  renderer.render(scene, camera);
});
生态版图

不只是库,是一整个生态

项目定位关系
React Three FiberReact 声明式包装@react-three/fiber,把对象变成 JSX
dreiR3F 工具集常用 helper 组件(OrbitControls、Loader)
Babylon.js竞品(微软系)偏游戏引擎,three 偏通用渲染
PlayCanvas竞品(商业化)带编辑器,three 纯库
model-viewerGoogle Web 组件底层用 three,封装成 <model-viewer>
Spline / Womp无代码 3D 工具导出 three.js 场景给 Web
three.js examples1500+ 官方示例事实上的文档和学习样本
适用场景

用它来做什么

风险提示

需要知道的坑

潜力评估

未来空间

WebGPU 迁移是未来 3 年主线——更接近现代图形 API,支持 Compute Shader,性能上限翻倍。114k stars + 15 年积累的生态护城河,Babylon 短期难超越。R3F 让它在 React 生态续命,无代码工具(Spline)降低门槛扩大用户基数。只要 Web 3D 存在,它就是基础设施。


上一个
Anthropic Skills
下一个
F5-TTS
1 / 16