非常好的方向 👍!
WebGL 的学习难点不在“API”,而在于图形学底层逻辑 + 数学基础。
下面我帮你整理一份完整的学习笔记式总结,涵盖:
🌐 WebGL 核心概念
🧮 向量与矩阵的前置数学知识
🧠 如何把数学与 WebGL 的实际渲染流程对应起来
🕹️ 一、WebGL 基本概念概览
1️⃣ 什么是 WebGL?
WebGL(Web Graphics Library) 是一种基于 OpenGL ES 2.0 的 JavaScript API,
它让你可以在浏览器中直接调用 GPU(显卡)来绘制 2D/3D 图形。
✅ 运行环境:浏览器
✅ 编程语言:JavaScript + GLSL(着色器语言)
✅ 渲染模式:基于 GPU 的管线式渲染模型(Rendering Pipeline)
2️⃣ WebGL 的渲染流程(管线 Pipeline)
WebGL 主要由以下几个阶段组成:
[CPU]
↓
1️⃣ 顶点着色器(Vertex Shader) ← 处理顶点坐标、矩阵变换
↓
2️⃣ 图元装配(Primitive Assembly) ← 线、三角形的构成
↓
3️⃣ 光栅化(Rasterization) ← 转换为像素片段
↓
4️⃣ 片元着色器(Fragment Shader) ← 处理像素颜色、光照、纹理
↓
5️⃣ 帧缓冲(Frame Buffer) ← 输出到屏幕
关键点:
- 顶点着色器:控制“形状与位置”
- 片元着色器:控制“颜色与材质”
- CPU 负责准备数据,GPU 负责高速计算
3️⃣ WebGL 的主要组成部分
| 模块 | 功能 |
|---|---|
Canvas | 绘制图形的 HTML 元素容器 |
gl context | WebGL 上下文(通过 canvas.getContext("webgl") 获取) |
Shader | GPU 程序,GLSL 语言编写 |
Buffer | 顶点、法线、纹理坐标等数据存储区 |
Texture | 贴图,用于赋予物体表面细节 |
Matrix | 用于平移、旋转、缩放、投影变换 |
🧮 二、前置数学基础
WebGL 的数学基础主要包括:
- 向量(Vector)
- 矩阵(Matrix)
- 齐次坐标与变换(Homogeneous Coordinates)
- 投影与视图变换(Projection & View)
1️⃣ 向量(Vector)
向量是描述空间方向与长度的基本元素。
🧭 常见向量运算:
| 运算 | 公式 | 意义 |
|---|---|---|
| 向量加法 | a + b = (ax+bx, ay+by, az+bz) | 平移、叠加方向 |
| 标量乘法 | k·a = (k·ax, k·ay, k·az) | 缩放向量长度 |
| 点积(Dot Product) | a·b = ax·bx + ay·by + az·bz | 计算夹角、光照强度 |
| 叉积(Cross Product) | a×b = (aybz−azby, azbx−axbz, axby−aybx) | 求法线方向(垂直向量) |
| 单位化(Normalize) | **â = a / | a |
💡 点积用途:
float light = max(dot(normal, lightDir), 0.0);
用于计算光照亮度。
2️⃣ 矩阵(Matrix)
矩阵是 WebGL 中进行坐标变换的核心工具。
常见的 4×4 矩阵类型(齐次坐标系):
| 类型 | 示例 | 作用 |
|---|---|---|
| 平移矩阵 | translate(x, y, z) | 移动物体位置 |
| 旋转矩阵 | rotate(angle, axis) | 绕轴旋转物体 |
| 缩放矩阵 | scale(sx, sy, sz) | 改变物体大小 |
| 视图矩阵 | lookAt(eye, target, up) | 模拟相机视角 |
| 投影矩阵 | perspective(fov, aspect, near, far) | 模拟透视投影 |
🔢 4×4 矩阵的作用方式
顶点坐标(以齐次形式表示):
v = [x, y, z, 1]
经过模型、视图、投影矩阵变换:
v' = Projection * View * Model * v
即:
世界坐标系 → 摄像机坐标系 → 屏幕坐标系
3️⃣ 齐次坐标(Homogeneous Coordinates)
WebGL 中默认使用 4D 向量 [x, y, z, w]:
- 当
w = 1:表示位置(可平移) - 当
w = 0:表示方向(不受平移影响)
这样可以用统一的矩阵乘法来同时实现旋转、缩放和平移。
4️⃣ 投影变换(Projection)
将 3D 世界映射到 2D 屏幕:
| 投影类型 | 特点 | 应用 |
|---|---|---|
| 正交投影(Orthographic) | 不考虑透视,平行线不收敛 | 工程图、CAD |
| 透视投影(Perspective) | 远小近大,逼真效果 | 游戏、3D 场景 |
透视投影矩阵示例:
mat4.perspective(out, fovy, aspect, near, far);
🧠 三、WebGL 与数学的对应关系
| 图形学概念 | WebGL 实现 | 数学基础 |
|---|---|---|
| 顶点位置 | 顶点缓冲区(VBO) | 向量 |
| 模型变换 | u_ModelMatrix | 平移、旋转、缩放矩阵 |
| 视图变换 | u_ViewMatrix | lookAt矩阵 |
| 投影变换 | u_ProjectionMatrix | 透视矩阵 |
| 光照计算 | dot(normal, lightDir) | 向量点积 |
| 法线方向 | cross() | 向量叉积 |
⚙️ 四、代码示例:顶点变换流程
// 顶点着色器(vertex shader)
attribute vec4 a_Position;
uniform mat4 u_ModelMatrix;
uniform mat4 u_ViewMatrix;
uniform mat4 u_ProjectionMatrix;
void main() {
gl_Position = u_ProjectionMatrix * u_ViewMatrix * u_ModelMatrix * a_Position;
}
发表回复