threejs社区活跃度高,版本迭代速度快,基本每1~2个月就会有新版本发布。截至2026.12月份,最新版本是r182,更多版本和源码信息请浏览github代码库。
📁 src/ - 源代码核心 文件夹 说明 audio/ 音频相关
core/ 核心基础类和接口,如Object3D、BufferGeometry
math/ 数学库:向量、矩阵、四元数、欧拉角等
scenes/ 场景相关:Scene、Fog、Background等
geometries/ 几何体:BoxGeometry、SphereGeometry等
materials/ 材质系统:Material、ShaderMaterial等
lights/ 光源:DirectionalLight、PointLight等
cameras/ 摄像机:PerspectiveCamera、OrthographicCamera
renderers/ 渲染器:WebGLRenderer、WebGPURenderer
loaders/ 加载器:GLTFLoader、OBJLoader、TextureLoader
animation/ 动画系统:KeyframeTrack、AnimationMixer
controls/ 控制器:OrbitControls、FlyControls
objects/ 3D对象:Mesh、Line、Points等
textures/ 纹理相关:CanvasTexture、CubeTexture、DepthTexture等
helpers/ 可视化辅助
nodes/ hree.js的新渲染系统和着色器节点系统
📁 examples/ - 示例与资源 文件夹 说明 jsm/ ES6模块化示例代码
models/ 示例3D模型文件
textures/ 示例纹理图片
css/ 样式文件
fonts/ 字体文件
📁 editor/ - 可视化编辑器 文件夹 说明 index.html 编辑器主界面
js/ 编辑器JavaScript代码
css/ 编辑器样式
doc/ 编辑器文档说明
examples/ 编辑器官方案例
images/ 编辑器相关图片
📁 docs/ - 文档相关 文件夹 说明 docs/ threejs文档
manual/ threejs手册
📁 test/ - 测试相关 文件夹 说明 e2e/ E2E 测试
unit/ 单元测试
treeshake/ js打包和性能优化
three.js
├── 核心层 (core/, math/)
├── 对象层 (objects/, geometries/, materials/)
├── 场景层 (scenes/, lights/, cameras/)
├── 渲染层 (renderers/)
└── 工具层 (loaders/, controls/, animation/)
Three.js 自 2009 年发布以来经历了多次重大版本更新。以下是主要大版本的核心改动:
2010: r1-r49 (早期探索) 2012: r50-r58 (走向成熟) 2016: r70-r83 (模块化重构) 2019: r100-r119 (ES6 模块化) 2021: r125-r135 (现代API) 2022: r146+ (新渲染系统)
three.js 文件拆分为多个模块
// 旧版本 var geometry = new THREE.Geometry();
geometry.vertices.push(new THREE.Vector3(0, 0, 0)); // 新版本(BufferGeometry) var geometry = new THREE.BufferGeometry(); var positions = new Float32Array([0, 0, 0]);
geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));
import/export
/src 和 /examples/jsm
// 旧版本 (CDN)
<script> var scene = new THREE.Scene(); script> // 新版本 (ES6模块) import * as THREE from 'three'; import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; const scene = new THREE.Scene(); const controls = new OrbitControls(camera, renderer.domElement);
three.js/ ├── build/ # 编译后的 UMD 包 ├── docs/ # 文档 ├── examples/ # 示例 │ ├── js/ # 旧版示例 (兼容) │ └── jsm/ # ES6 模块示例 (新) ├── src/ # 源码 (ES6 模块) └── package.json
// 移除的API THREE.Geometry() // 完全移除 THREE.Face3() // 移除 THREE.Math.degToRad() // 改为 THREE.MathUtils.degToRad
// 旧 THREE.Math.clamp(x, min, max); THREE.Math.degToRad(degrees); // 新 THREE.MathUtils.clamp(x, min, max); THREE.MathUtils.degToRad(degrees);
// 旧 new THREE.WebGLRenderer({ antialias: true, alpha: true, precision: 'highp' }); // 新(移除 precision 等参数) new THREE.WebGLRenderer({ antialias: true, alpha: true });
// 旧 uniforms: { time: { value: 1.0, type: 'f' }, color: { value: new THREE.Color(0xff0000) }
} // 新(移除 type 定义) uniforms: { time: { value: 1.0 }, color: { value: new THREE.Color(0xff0000) }
}
// 实验性 WebGPU 渲染器 import { WebGPURenderer } from 'three/addons/renderers/WebGPURenderer.js'; const renderer = new WebGPURenderer();
import { NodeMaterial,
color,
uv,
add, OscNode } from 'three/addons/nodes/Nodes.js'; // 创建节点材质 const material = new NodeMaterial();
material.colorNode = add(color(0xff0000), uv());
Geometry 类(完全)
Face3、Face4
DirectGeometry
MathUtils
JSONLoader
SceneUtils.createMultiMaterialObject
Material 的 copy() 方法
WebGLRenderer 的 gammaInput/gammaOutput
Texture 的 generateMipmaps 自动检测
SkinnedMesh 的 bindMode
Material 的 flatShading(改为 MeshStandardMaterial 属性)
LegacyGLTFLoader,只保留 GLTFLoader
Animation 方法
// 旧材质系统(已移除) new THREE.MeshFaceMaterial([ new THREE.MeshBasicMaterial({ color: 0xff0000 }), new THREE.MeshBasicMaterial({ color: 0x00ff00 })
]); // 新方式 - 使用数组材质 new THREE.Mesh(geometry, [ new THREE.MeshBasicMaterial({ color: 0xff0000 }), new THREE.MeshBasicMaterial({ color: 0x00ff00 })
]);
// 旧版本 new THREE.WebGLRenderer({ precision: 'highp' // highp/mediump/lowp }); // 新版本(自动选择,移除配置) new THREE.WebGLRenderer();
// 旧版本 - 回调方式 const loader = new THREE.JSONLoader();
loader.load('model.json', function(geometry, materials) { const mesh = new THREE.Mesh(geometry, materials);
}); // 新版本 - Promise/async 方式 import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'; const loader = new GLTFLoader();
loader.loadAsync('model.glb').then((gltf) => { const mesh = gltf.scene;
scene.add(mesh);
});
THREE.JSONLoader(已废弃)
THREE.BinaryLoader
THREE.SceneLoader
THREE.AudioLoader(改为 AudioLoader 模块)
// 旧动画系统 const animation = new THREE.Animation(
mesh,
geometry.animation ); // 新动画系统(使用 AnimationClip) const mixer = new THREE.AnimationMixer(mesh); const clip = THREE.AnimationClip.findByName(animations, 'run'); const action = mixer.clipAction(clip);
action.play();
// 旧版本(r124 及之前) THREE.Math.degToRad(180); THREE.Math.radToDeg(Math.PI); THREE.Math.clamp(value, 0, 1); THREE.Math.euclideanModulo(n, m); // 新版本(r125+) THREE.MathUtils.degToRad(180); THREE.MathUtils.radToDeg(Math.PI); THREE.MathUtils.clamp(value, 0, 1); THREE.MathUtils.euclideanModulo(n, m);
// 已移除的函数 THREE.Math.generateUUID(); // 改为 THREE.MathUtils.generateUUID() THREE.Math.nextPowerOfTwo(); // 改为 THREE.MathUtils.floorPowerOfTwo() THREE.Math.isPowerOfTwo(); // 改为 THREE.MathUtils.isPowerOfTwo()
// 旧:手动管理实例 // 新:更高效的 InstancedMesh const instancedMesh = new THREE.InstancedMesh(geometry, material, count);
// BatchNode 实验性特性 import { BatchNode } from 'three/addons/nodes/Nodes.js';
// 旧:@types/three 包 import * as THREE from 'three'; // 新:内置 TypeScript 定义(r125+) // 直接从 three 包获得完整类型支持
// 更好的类型推断 import { Scene, PerspectiveCamera, WebGLRenderer } from 'three'; // 示例模块也有完整类型 import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
// 使用迁移辅助 if (THREE.Geometry) { // 旧版本兼容代码 } else { // 新版本代码 } // 或使用 polyfill function createLegacyGeometry() { // 实现兼容性包装器 }
docs/migrations/
# 检查废弃 API 使用 npx three-migrate ./src # 版本比较 npm view three versions # 查看所有版本
这些重大版本改动反映了 Three.js 从简单的 3D 库向现代、高性能、模块化图形引擎的演进过程。
让我详细解析 WebGL 1、WebGL 2 和 WebGPU 在 Three.js 中的支持现状、技术差异以及未来走向。
2011: WebGL 1.0 发布 (OpenGL ES 2.0) 2017: WebGL 2.0 发布 (OpenGL ES 3.0) 2023: WebGPU 发布 (Vulkan/Metal/D3D12 风格)
// WebGL 1 限制示例 const renderer = new THREE.WebGLRenderer(); // 1. 纹理限制 // WebGL 1: 不支持 3D 纹理、2D 纹理数组 // WebGL 2: 支持 TEXTURE_3D, TEXTURE_2D_ARRAY // 2. 着色器限制 const material = new THREE.ShaderMaterial({ vertexShader: `
// WebGL 1: 没有统一缓冲区 (uniform buffers)
// WebGL 2: 可以使用 uniform blocks
// WebGL 1: 纹理采样函数有限
texture2D(texture, uv); // 旧语法
`, fragmentShader: `
// WebGL 1: 输出必须为 gl_FragColor
gl_FragColor = vec4(1.0);
` }); // 3. 渲染目标限制 // WebGL 1: 不支持浮点纹理作为渲染目标 // WebGL 2: 支持 floating point textures
✅ Chrome 9+ (2011)
✅ Firefox 4+ (2011)
✅ Safari 5.1+ (2011)
✅ Edge 12+ (2015)
✅ 移动端全面支持
// Three.js 自动处理 WebGL 2/1 兼容 const renderer = new THREE.WebGLRenderer({ // 自动尝试 WebGL 2,失败时回退 WebGL 1 context: gl, // 可传入已有上下文 powerPreference: 'high-performance', // 性能偏好 failIfMajorPerformanceCaveat: true // 性能不足时失败 }); // 检查当前使用的版本 console.log(renderer.capabilities.isWebGL2); // true 或 false // 手动创建 WebGL 2 上下文 const canvas = document.createElement('canvas'); const gl = canvas.getContext('webgl2', { alpha: true, antialias: true, depth: true, stencil: true }); if (!gl) { console.warn('WebGL 2 not available, falling back to WebGL 1');
gl = canvas.getContext('webgl') ||
canvas.getContext('experimental-webgl');
}
// 1. 统一缓冲区对象 (UBO) import { UniformsLib } from 'three'; // Three.js 内部使用 UBO 优化 uniform 传递 material.uniforms = { // 自动打包到 uniform blocks (WebGL 2) common: { value: { time: 0, resolution: new THREE.Vector2() } }
}; // 2. 变换反馈 (Transform Feedback) // 用于 GPU 粒子系统(Three.js 通过 ShaderMaterial 支持) // 3. 多重采样渲染目标 (MSAA) const rt = new THREE.WebGLRenderTarget(1024, 1024, { samples: 4 // WebGL 2: 支持 MSAA }); // 4. 实例化渲染增强 const mesh = new THREE.InstancedMesh(geometry, material, 1000); // WebGL 2: 支持多属性实例化
// Three.js 统一着色器语法 #if defined( WEBGL_1 ) // WebGL 1 兼容代码 vec4 textureColor = texture2D(map, vUv); #else // WebGL 2 代码 (WebGPU 也类似) vec4 textureColor = texture(map, vUv); #endif // Three.js 自动处理的扩展 #ifdef GL_EXT_shader_texture_lod // 使用 textureLOD 扩展 #endif #ifdef GL_OES_standard_derivatives // 使用导数扩展 #endif
✅ Chrome 56+ (2017)
✅ Firefox 51+ (2017)
✅ Safari (macOS 10.13+, iOS 15.4+)
✅ Edge 79+ (2020)
⚠️ 部分移动端支持有限
// 1. 导入 WebGPU 渲染器(实验性) import { WebGPURenderer } from 'three/addons/renderers/WebGPURenderer.js'; // 2. 创建渲染器 const renderer = new WebGPURenderer({ canvas: document.getElementById('canvas'), antialias: true, alpha: true, // WebGPU 特有配置 powerPreference: 'high-performance', forceFallbackAdapter: false // 不使用软件回退 }); // 3. 配置渲染器 renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setAnimationLoop(animate); // 4. 检查支持 if (!renderer.isAvailable()) { console.error('WebGPU not available, falling back to WebGL'); // 回退到 WebGLRenderer const fallbackRenderer = new THREE.WebGLRenderer({ canvas });
}
// 1. 计算着色器支持 import { ComputeShader } from 'three/addons/renderers/webgpu/ComputeShader.js'; const computeShader = new ComputeShader(`
@compute @workgroup_size(64)
fn main(@builtin(global_invocation_id) id: vec3) {
// GPU 计算代码
}
` , { workgroups: [1024, 1, 1] // 工作组配置 }); // 2. 存储纹理 (Storage Textures) const storageTexture = new THREE.StorageTexture(512, 512, THREE.RGBA32Float); // 3. 间接绘制 (Indirect Drawing) // 支持 GPU 驱动的绘制调用 // 4. 管线状态对象 (PSO) // 预编译渲染管线,减少运行时开销
// WebGL 方式 const gl = canvas.getContext('webgl2');
gl.clearColor(0, 0, 0, 1);
gl.clear(gl.COLOR_BUFFER_BIT); // WebGPU 方式(概念代码) const adapter = await navigator.gpu.requestAdapter(); const device = await adapter.requestDevice(); const context = canvas.getContext('webgpu'); const commandEncoder = device.createCommandEncoder(); // 更显式、更底层
✅ Chrome 113+ (2023) - 默认启用
✅ Edge 113+ (2023) - 基于 Chromium
✅ Safari 17+ (2023) - 需要 macOS Sonoma/iOS 17
⚠️ Firefox Nightly - 实验性标志启用
⚠️ 移动端支持有限
启用标志(如果需要):
dom.webgpu.enabled
// Three.js 的渲染器抽象层 class Renderer { // 公共接口 setSize(width, height); setPixelRatio(ratio); render(scene, camera); dispose();
} // 具体实现 class WebGLRenderer extends Renderer { /* WebGL 1/2 */ } class WebGPURenderer extends Renderer { /* WebGPU */ } class CSS3DRenderer extends Renderer { /* CSS 3D */ } class SVGRenderer extends Renderer { /* SVG */ }
// Three.js 内部的功能检测 const capabilities = { // WebGL 1/2 能力 isWebGL1: true, isWebGL2: true, // 扩展支持 textureFloat: true, // 浮点纹理 textureHalfFloat: true, // 半精度浮点 vertexTextures: true, // 顶点纹理 instancedArrays: true, // 实例化数组 // 最大限制 maxTextures: 16, maxVertexUniforms: 4096, maxTextureSize: 8192, // WebGPU 能力 isWebGPU: false, computeShaders: false, storageTextures: false }; // 访问方式 const renderer = new THREE.WebGLRenderer(); console.log(renderer.capabilities);
// Three.js 材质根据渲染器自动调整 const material = new THREE.MeshStandardMaterial({ color: 0xff0000, roughness: 0.5, metalness: 0.5 }); // 内部处理: // 1. WebGL 1: 使用传统着色器,可能降级 // 2. WebGL 2: 使用优化着色器,支持更多特性 // 3. WebGPU: 编译为 WGSL 着色器
// 1. 已移除的扩展(现代浏览器仍支持,但Three.js不再特殊处理) const ext = gl.getExtension('OES_texture_float'); // Three.js 现在直接使用 WebGL 2 的浮点纹理支持 // 2. 已废弃的上下文属性 // 旧方式(已废弃): canvas.getContext('experimental-webgl'); // 新方式: canvas.getContext('webgl'); // 3. Three.js 内部已移除的 WebGL 1 回退代码 // 许多 WebGL 1 的扩展回退代码已被简化
// 计划中的变化(Three.js r160+ 路线图): // 1. 可能将 WebGL 1 设为可选功能 // 2. 默认优先使用 WebGPU(当支持度足够时) // 3. 逐步移除 WebGL 1 专属的兼容代码 // 当前策略: // - 保持 WebGL 1 支持(向后兼容) // - 优化 WebGL 2 路径 // - 并行发展 WebGPU
| 任务 | WebGL 1 | WebGL 2 | WebGPU |
|---|---|---|---|
| Draw Calls/s | 10K-50K | 50K-200K | 500K-1M+ |
| 纹理上传 | 慢 | 中等 | 快(并行) |
| 计算着色器 | 不支持 | 有限支持 | 完全支持 |
| 内存效率 | 低 | 中等 | 高 |
// 性能优先选择逻辑 function createOptimalRenderer() { // 1. 优先尝试 WebGPU if (isWebGPUSupported()) { return new WebGPURenderer({ /* 高性能配置 */ });
} // 2. 使用 WebGL 2 const renderer = new THREE.WebGLRenderer({ powerPreference: 'high-performance', precision: 'highp' // 如果支持 }); // 3. 必要时回退 WebGL 1 if (!renderer.capabilities.isWebGL2) { console.warn('Using WebGL 1, performance may be limited');
} return renderer;
}
// 需要检查的代码 const needsUpdate = { // 1. 着色器语法 shaders: `
// 旧: texture2D() -> 新: texture()
// 旧: gl_FragColor -> 新: out vec4 fragColor
`, // 2. 扩展使用 extensions: [ 'EXT_frag_depth', // WebGL 1 扩展 'OES_texture_float', // WebGL 1 扩展 'ANGLE_instanced_arrays' // WebGL 1 扩展 // 在 WebGL 2 中这些是原生功能 ], // 3. 纹理格式 textureFormats: { float: 'RGB32F', // WebGL 2 原生格式 depth: 'DEPTH24_STENCIL8' // 更好的深度格式 }
};
// 主要变化点 const migrationChanges = { // 1. 着色器语言 shaderLanguage: 'GLSL -> WGSL', // 2. 资源绑定 bindingModel: '全局uniform -> 绑定组', // 3. 管线管理 pipeline: '运行时状态 -> 预编译管线', // 4. 内存模型 memory: '隐式管理 -> 显式分配' }; // Three.js 简化迁移 // 大多数 Three.js API 保持不变 const scene = new THREE.Scene(); // 相同 const camera = new THREE.PerspectiveCamera(); // 相同 const mesh = new THREE.Mesh(geometry, material); // 相同 // 只有渲染器创建不同 const renderer = isWebGPU ? new WebGPURenderer() : new WebGLRenderer();
2024: WebGPU 稳定支持,与 WebGL 2 并行 2025: WebGPU 成为默认推荐(如果浏览器支持 >90%) 2026: 可能将 WebGL 1 移至可选包 2027+: 逐步减少 WebGL 维护,专注 WebGPU
// 2024-2025 年建议: const rendererConfig = { // 大多数项目:使用 WebGL 2(最稳定) primary: 'WebGL 2', // 实验性/高性能项目:尝试 WebGPU experimental: 'WebGPU', // 需要广泛兼容:支持 WebGL 1 回退 fallback: 'WebGL 1', // 检测和适配 autoDetect: true }; // 具体实现 function createRenderer() { // 优先 WebGL 2 let renderer = new THREE.WebGLRenderer({ // 配置... }); // 如果需要 WebGPU 特性 if (needsWebGPUFeatures()) { try {
renderer = new WebGPURenderer();
} catch (e) { console.warn('WebGPU failed, falling back to WebGL');
}
} return renderer;
}
// 完整的特征检测函数 function detectGraphicsCapabilities() { const caps = { webgl1: false, webgl2: false, webgpu: false, features: {}
}; // 检测 WebGL 1 const canvas = document.createElement('canvas'); const gl1 = canvas.getContext('webgl') ||
canvas.getContext('experimental-webgl'); if (gl1) {
caps.webgl1 = true;
caps.features.floatTextures = !!gl1.getExtension('OES_texture_float');
caps.features.vertexTextures = gl1.getParameter(gl1.MAX_VERTEX_TEXTURE_IMAGE_UNITS) > 0;
} // 检测 WebGL 2 const gl2 = canvas.getContext('webgl2'); if (gl2) {
caps.webgl2 = true;
caps.features.ubo = true; // WebGL 2 原生支持 caps.features.msaa = gl2.getParameter(gl2.MAX_SAMPLES) > 1;
} // 检测 WebGPU if (navigator.gpu) {
caps.webgpu = true; // 可以进一步检测适配器能力 } return caps;
}
| 技术 | Three.js 状态 | 浏览器支持 | 未来预测 |
|---|---|---|---|
| WebGL 1 | ✅ 完全支持 | ~98% | 维护模式,可能可选 |
| WebGL 2 | ✅ 默认渲染 | ~95% | 长期支持,主力渲染 |
| WebGPU | 🧪 实验性 | ~70%+ | 未来默认,快速发展 |
短期建议:使用 WebGL 2 作为生产环境首选
中期规划:逐步试验 WebGPU 特性
长期准备:向 WebGPU 迁移,保持向后兼容
具体规划:
| 项目 | 状态 | 目标时间 |
|---|---|---|
| 新材质系统 | 原型阶段 | 2024 Q4 |
| 延迟渲染 | 实验阶段 | 2025 Q1 |
| 体积渲染 | 研究阶段 | 2025 Q3 |
| 实时GI | 规划中 | 2026 |
TypeScript 深度优化
graph TD A[当前状态] --> B[类型定义覆盖 85%] B --> C[API自动生成文档] C --> D[智能代码提示] E[开发者工具] --> F[调试器增强] E --> G[性能分析工具] E --> H[内存泄漏检测]
three.js 生态系统规划
├── 核心库 (three)
│ ├── 2024: 模块化重构
│ ├── 2025: 插件系统标准化
│ └── 2026: 微内核架构
│
├── 官方工具链
│ ├── 编辑器增强 (Three.js Editor)
│ ├── 构建工具 (three-builder)
│ └── 测试框架 (three-test)
│
├── 社区生态
│ ├── 物理引擎桥接
│ ├── AI工具集成
│ └── 云服务接口
│
└── 行业应用
├── 建筑可视化 (AEC)
├── 工业设计 (CAD)
└── 教育科研
WebGPU 稳定版发布
性能优化
API 清理与标准化
智能功能路线
├── 模型自动简化
├── 材质智能生成
├── 场景布局建议
└── 代码生成助手
实时协作
跨平台扩展
云渲染架构
新兴技术
| 指标 | 2024目标 | 2026愿景 |
|---|---|---|
| GitHub Stars | 100k+ | 150k+ |
| NPM 月下载量 | 5M+ | 10M+ |
| 贡献者数量 | 1500+ | 2500+ |
| Stack Overflow 问题 | 95% 解决率 | 98% 解决率 |
教育推广路线 ├── 2024 │ ├── 官方教程视频系列 │ ├── 互动学习平台 │ └── 高校合作计划 │ ├── 2025 │ ├── 认证开发者计划 │ ├── 在线黑客松 │ └── 多语言文档 │ └── 2026 ├── 全球开发者大会 ├── 教科书出版 └── 标准化课程
| 风险 | 概率 | 影响 | 应对策略 |
|---|---|---|---|
| WebGPU 普及缓慢 | 中 | 高 | 保持双后端支持 |
| 浏览器兼容性 | 低 | 中 | 渐进增强策略 |
| 竞争加剧 | 高 | 中 | 专注核心优势 |
| 资金支持 | 中 | 高 | 多元化赞助 |