WebGL 的核心思想和学习要点可以从两个层面来理解:图形编程的本质 和 WebGL 的设计哲学。
🎯 一、WebGL 的核心思想
✅ 1. 图形计算全部在 GPU 上完成
WebGL 把所有图形渲染的重任交给 GPU,通过 Shader(着色器)程序 实现“用代码控制像素”。
CPU 控制逻辑,GPU 负责并行执行大量图形运算。
✅ 2. 渲染流程完全遵循图形管线(Rendering Pipeline)
WebGL 是一个对 OpenGL ES 的封装,它遵循经典图形管线:
1 2 3 4 5 6 7 8 9 10 |
顶点数据 ↓ 顶点着色器(Vertex Shader) → 几何变换(矩阵) ↓ 光栅化(Rasterization) → 把三角形变成像素 ↓ 片元着色器(Fragment Shader) → 决定每个像素的颜色 ↓ 输出到帧缓冲(Framebuffer) → 显示在屏幕上 |
这个流程是固定的,你只能写“顶点着色器”和“片元着色器”这两段程序,其他部分由系统自动完成。
✅ 3. WebGL 是状态机
所有的绘制行为必须先设置状态,再绘制。比如:
gl.clearColor(...)
设置颜色gl.enable(...)
开启功能gl.useProgram(...)
激活程序
一旦状态设置完毕,WebGL 就按这个状态执行。
🧠 二、学习 WebGL 的要点
🧩 1. Canvas 与 WebGL 上下文
canvas.getContext("webgl")
- WebGL 是在 Canvas 中运行的,只能通过 JavaScript 操作
🧩 2. 着色器(Shader)语言
WebGL 着色器使用的是一种叫 GLSL ES(OpenGL 着色器语言) 的语言:
- 顶点着色器 Vertex Shader
- 处理几何位置、坐标变换(常用矩阵)
- 片元着色器 Fragment Shader
- 决定颜色、光照、纹理等效果
1 2 3 4 5 |
attribute vec2 a_position; // 顶点属性 void main() { gl_Position = vec4(a_position, 0.0, 1.0); } |
🧩 3. 缓冲区(Buffer)和属性绑定
- 把顶点数据放进 GPU 的内存中(缓冲区)
- 用
gl.vertexAttribPointer()
把数据和着色器的变量关联起来
🧩 4. 坐标系统(重要)
WebGL 的坐标系统:
- 顶点坐标:NDC(Normalized Device Coordinates),范围 [-1, 1]
- 屏幕左上角不是 (0,0)!
- 需要理解矩阵变换:
模型 → 视图 → 投影
🧩 5. 程序(Program)与渲染流程
- 创建 Shader → 编译 Shader → 链接 Program → 启用 Program → 绘制
1 2 3 4 5 6 |
const shader = gl.createShader(...); const program = gl.createProgram(); gl.attachShader(program, vertexShader); gl.attachShader(program, fragmentShader); gl.linkProgram(program); |
🧩 6. 常见绘制方式
gl.drawArrays()
:用顶点数据绘制图形(如三角形)gl.drawElements()
:使用索引绘制(高效)
📘 三、初学者建议掌握的关键内容
阶段 | 重点学习内容 |
---|---|
初级 | Canvas/WebGL 获取、清屏、着色器结构、绘制三角形 |
中级 | 缓冲区绑定、属性传递、矩阵变换、纹理、帧缓冲 |
高级 | 动态光照、模型加载、3D 相机、性能优化、Picking 选择交互 |
🎁 四、补充:WebGL 太底层怎么办?
WebGL 非常底层,学习曲线陡峭,如果你目标是开发 大屏可视化、数字孪生、3D互动 项目,建议用:
封装库 | 特点 |
---|---|
Three.js | 高层封装、快速出图 |
Babylon.js | 游戏开发友好,UI强 |
regl / twgl | 中级封装,适合性能控制 |
✅ 总结一句话
WebGL 是 GPU 编程的 JavaScript 封装,通过着色器控制像素,整个图形渲染流程围绕着 GPU 管线运行。