WebGL - 几何学:初学者指南
你好,未来的 WebGL 大师们!我很高兴能成为你们在这激动人心的 WebGL 几何世界旅程中的向导。作为一个教授计算机图形学超过十年的老师,我可以告诉你,理解 WebGL 中的几何学就像学习用代码作画。这很有挑战性,但回报巨大!所以,让我们卷起袖子,开始吧!
定义所需的几何体
在我们开始创建令人惊叹的 3D 图形之前,我们需要了解 WebGL 中的几何学意味着什么。本质上,几何学是我们屏幕上看到的一切的基础。它由点、线和形状组成,构成了我们 3D 对象的结构。
想象你正在用乐高积木建造一座房子。每一块积木代表 3D 空间中的一个点,当你连接这些点时,你创建边和面。这正是我们在 WebGL 中所做的,但用的是代码而不是塑料积木!
让我们从一个简单的例子开始 - 创建一个三角形:
const triangleVertices = [
0.0, 1.0, 0.0,
-1.0, -1.0, 0.0,
1.0, -1.0, 0.0
];
在这里,我们定义了 3D 空间中的三个点。每个点由三个数字(x, y, z)表示。这个数字数组就是我们将用来告诉 WebGL 在哪里绘制我们的三角形的。
缓冲区对象
现在我们有了定义好的几何体,我们需要一种方式将这些数据发送到 GPU。这时缓冲区对象就派上用场了。你可以将缓冲区对象想象为特殊的容器,它们保存我们的几何数据,使其易于 GPU 访问。
创建缓冲区
创建缓冲区是我们为 GPU 准备几何体的第一步。下面是如何操作的:
const buffer = gl.createBuffer();
这行代码创建了一个空的缓冲区对象。就像准备一个空盒子,以便填满我们的乐高积木。
绑定缓冲区
创建缓冲区后,我们需要告诉 WebGL 我们想使用这个缓冲区。我们通过绑定缓冲区来实现:
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
这就像拿起我们的乐高盒子并说,“嘿,WebGL,我现在要在盒子里放一些积木!”
将数据传递到缓冲区
现在来到激动人心的部分 - 用我们的几何数据填充缓冲区:
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(triangleVertices), gl.STATIC_DRAW);
让我们分解一下:
-
gl.bufferData()
是我们用来填充缓冲区的方法。 -
gl.ARRAY_BUFFER
告诉 WebGL 我们正在处理当前绑定的缓冲区。 -
new Float32Array(triangleVertices)
将我们的 JavaScript 数组转换为类型化数组(稍后会详细介绍)。 -
gl.STATIC_DRAW
是给 WebGL 的一个提示,关于我们计划如何使用这些数据。
类型化数组
你可能好奇为什么我们在前一步使用了 Float32Array
。WebGL 非常挑剔它的数据类型。为了效率,它更喜欢使用类型化数组。类型化数组确保每块数据的大小和类型是一致的。
下面是 WebGL 中常用的类型化数组表格:
类型化数组 | 描述 | 使用场景 |
---|---|---|
Float32Array | 32 位浮点数 | 顶点位置,纹理坐标 |
Int8Array | 8 位有符号整数 | 小的整数 |
Uint8Array | 8 位无符号整数 | 颜色组件 |
Int16Array | 16 位有符号整数 | 较大的整数 |
Uint16Array | 16 位无符号整数 | 顶点索引 |
Int32Array | 32 位有符号整数 | 非常大的整数 |
Uint32Array | 32 位无符号整数 | 非常大的正整数 |
在我们的例子中,我们使用 Float32Array
是因为我们的顶点位置是浮点数。
解绑缓冲区
在我们完成缓冲区的操作后,解绑是一个好习惯:
gl.bindBuffer(gl.ARRAY_BUFFER, null);
这就像把乐高盒子放回架子上。它可以防止我们对缓冲区进行意外的更改,并保持我们的 WebGL 状态整洁。
就这样,伙计们!我们成功地定义了我们的几何体,创建了一个缓冲区,填充了数据,并了解了类型化数组。这是在 WebGL 中创建任何 3D 对象的基础。
记住,学习 WebGL 是一个旅程。如果一开始有些概念看起来有点棘手,不要担心。通过实践,你很快就能创建出惊人的 3D 图形!在我教学的这些年里,我见证了无数学生从困惑的初学者成长为 WebGL 巫师。你已经走上了加入他们行列的道路!
在下一课中,我们将探索如何使用这些缓冲区实际在屏幕上绘制我们的几何体。准备好见证你的第一个 WebGL 三角形诞生!在此之前,快乐编码,别忘了休息一下,活动一下编码的手指!
Credits: Image by storyset