分享
Ogl

OGL——轻量级 WebGL 新秀,为何能成为 Three.js 的“极简派”替代?

一、什么是 OGL?

OGL([oframe/ogl])是一个仅用 ES Module 编写、零依赖的 WebGL 库,主打“最小抽象层”。

它保留了 Three.js 在 Renderer / Camera / Mesh / Geometry / Program 等 API 上的友好命名,却把庞杂的场景管理、材质系统统统留给开发者自己实现,从而把整体体积压缩到 Core 8 kb + Math 6 kb + Extras 15 kb ≈ 29 kb(min+gzip)。截至 2025 年 5 月,GitHub 已收获 4 k+ star

地址:https://github.com/oframe/ogl (opens in a new tab)

二、为什么选择 OGL?

  1. 极小体积可随手引入
    与三方 CDN/ImportMap 搭配即可上线,配合 tree‑shaking 更可把包体压到个位数 KB。(GitHub (opens in a new tab))

  2. 低抽象,保留原生 WebGL 的可控性
    所有核心类都薄如纸张;想调用 gl.enable(DEPTH_TEST)?直接写就行。比起“黑盒”式引擎,这种设计更方便 Debug 与性能微调。(GitHub (opens in a new tab))

  3. 学 WebGL 的最佳教材
    OGL 仅约 29KB,结构清晰、逻辑直白,源码几百行就能看懂;而 Three.js 打包后近 700KB,模块多、封装重,学习成本更高。

三、OGL vs Three.js对比

维度OGLThree.js
压缩体积Core ≈ 8 kb;完整 ≈ 29 kb通常打包后 > 130 kb(gzip,tree‑shaking 后)
抽象层贴近 WebGL;需自行写 Shader/材质高度封装;内建 40+ 材质、加载器、后期管线
学习曲线需掌握 GLSL & 渲染管线API 完整,门槛低
可控性 / 性能纯手工 Shader,可做到极致精简巨量特性伴随不可避免的“死代码”
生态案例教程为主,社区小而专插件、工具、可视化编辑器生态庞大
典型场景Banner、流体遮罩、滚动交互等前端动效复杂 3D 场景、数字孪生、AR/VR

简而言之:Three.js 适合“一站式”3D 项目;OGL 则是“我只想要一块 WebGL 原料,剩下自己调味”的极客选择。

四、灵感案例速览

我们来看下使用ogl实现的一些网站案例

五、五分钟上手:从零到旋转立方体

代码动手前先说原理:

  1. Renderer 封装了 WebGL 上下文和自动更新视口;

  2. Camera 只做投影矩阵的计算,没有任何后期管线;

  3. Program 就是薄包装的 Shader;MeshGeometryProgram 组合起来;

  4. 没有 “Scene” 概念,顶层用 Transform 管理层级关系;

  5. 一切 Uniform 更新、动画循环都由你自己控制——这正是 OGL 的“可控性”所在。

import { Renderer, Camera, Transform, Box, Program, Mesh } from 'ogl';
 
// ① 创建渲染器并挂载 <canvas>
const renderer = new Renderer();
const gl = renderer.gl;
document.body.appendChild(gl.canvas);
 
// ② 相机与窗口自适应
const camera = new Camera(gl);
camera.position.z = 5;
function resize() {
  renderer.setSize(window.innerWidth, window.innerHeight);
  camera.perspective({ aspect: gl.canvas.width / gl.canvas.height });
}
window.addEventListener('resize', resize);
resize();
 
// ③ 创建场景根节点
const scene = new Transform();
 
// ④ 立方体几何 & 着色器
const geometry = new Box(gl);
const program = new Program(gl, {
  vertex: /* glsl */`
    attribute vec3 position;
    uniform mat4 modelViewMatrix, projectionMatrix;
    void main() {
      gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
    }
  `,
  fragment: /* glsl */`
    void main() { gl_FragColor = vec4(1.0); }
  `
});
const cube = new Mesh(gl, { geometry, program });
cube.setParent(scene);
 
// ⑤ 渲染循环
requestAnimationFrame(function update(t) {
  requestAnimationFrame(update);
  cube.rotation.y -= 0.04;
  cube.rotation.x += 0.03;
  renderer.render({ scene, camera });
});

六、适用场景与推荐组合

需求选择推荐库/工具
品牌页 Banner、鼠标互动特效OGLLenis(平滑滚动)、GSAP(时间线)
中大型 3D 产品展示、数字孪生Three.jsdrei / react-three-fiber / Three.js 官方后期管线
Shader 学习、WebGL 教程OGLglslify、dat.GUI/Tweakpane
WebAR/VR、WebGPUThree.jsWebXRManager、postprocessing

七、写在最后

如果你厌倦了在 Three.js 里“削足适履”地删 Loader、删材质,只为追求更小首屏;或者你想要在 Shader 里自由驰骋、不被庞大框架束缚,那么 OGL 正是那个让你“回归 WebGL 本真”的小而美选择。下班后抽半小时,复制一段官方 Demo,改改着色器颜色,你会发现 WebGL 原来也可以如此优雅纯粹——而这,正是极简主义的魅力所在。