WebGL - 初学者友好的指南

你好,未来的 WebGL 巫师们!我很高兴能成为你们在这个令人兴奋的 WebGL 世界中的向导。作为一名教授计算机科学多年的老师,我可以告诉你们,WebGL 就像是你浏览器中的一支魔法画笔。它让你可以直接在网页中创建令人惊叹的 3D 图形!那么,我们卷起袖子,开始吧,好吗?

WebGL - Context

创建 HTML-5 <canvas> 元素

首先,我们需要一个画布来绘画。在 HTML5 中,我们有一个非常实用的东西叫做 <canvas> 元素。它就像一张白纸,我们将在上面绘制我们的 WebGL 杰作。

让我们创建我们的画布:

<canvas id="myWebGLCanvas" width="800" height="600">
你的浏览器不支持 HTML5 canvas。
</canvas>

这段代码创建了一个宽 800 像素、高 600 像素的画布。我们给它一个 ID "myWebGLCanvas" - 想象一下这就是我们的画布的名字标签。标签内的文本是针对不支持 canvas 的浏览器的备用信息(但别担心,大多数现代浏览器都支持)。

获取画布 ID

现在我们有了画布,我们需要在 JavaScript 代码中获取它。我们使用 getElementById 方法来实现。这就好比通过名字标签来称呼我们的画布。

let canvas = document.getElementById('myWebGLCanvas');

这行代码找到我们的画布元素,并将其存储在一个名为 canvas 的变量中。简单!

获取 WebGL 绘图上下文

接下来是激动人心的部分 - 获取我们的 WebGL 上下文。上下文就像是我们将在画布上使用的魔法绘图工具。

let gl = canvas.getContext('webgl');

if (!gl) {
console.log('WebGL 不支持,退回到 experimental-webgl');
gl = canvas.getContext('experimental-webgl');
}

if (!gl) {
alert('你的浏览器不支持 WebGL');
}

让我们分解一下:

  1. 我们尝试使用 getContext('webgl') 来获取 WebGL 上下文。
  2. 如果这不起作用(也许浏览器比较旧),我们尝试 experimental-webgl
  3. 如果我们仍然没有得到上下文,我们向用户提示他们的浏览器不支持 WebGL。

WebGLContextAttributes

当我们创建 WebGL 上下文时,我们可以指定一些属性来自定义其行为。这就像为我们的魔法画笔选择设置。以下是可以用的属性表:

属性 描述 默认值
alpha 画布包含一个 alpha 缓冲区 true
depth 绘图缓冲区至少有一个 16 位的深度缓冲区 true
stencil 绘图缓冲区至少有一个 8 位的模板缓冲区 false
antialias 绘图缓冲区执行抗锯齿 true
premultipliedAlpha 页面合成器会假设绘图缓冲区包含预乘 alpha 的颜色 true
preserveDrawingBuffer 缓冲区不会被清除,并将保留其值直到被清除或覆盖 false
failIfMajorPerformanceCaveat 如果系统性能较低,上下文创建将失败 false

要使用这些属性,我们可以在获取上下文时传递一个对象:

let contextAttributes = {
alpha: false,
depth: true,
stencil: true,
antialias: true,
premultipliedAlpha: false,
preserveDrawingBuffer: false,
failIfMajorPerformanceCaveat: false
};

let gl = canvas.getContext('webgl', contextAttributes);

WebGLRenderingContext

一旦我们有了 WebGL 上下文,我们就可以开始使用它的方法和属性来创建惊人的图形。WebGLRenderingContext 提供了所有 WebGL 绘图功能。

以下是一个简单的示例,它用漂亮的天蓝色清空画布:

if (gl) {
// 设置清空颜色为天蓝色
gl.clearColor(0.529, 0.808, 0.922, 1.0);

// 用指定的清空颜色清空颜色缓冲区
gl.clear(gl.COLOR_BUFFER_BIT);
}

让我们分解一下:

  1. gl.clearColor(0.529, 0.808, 0.922, 1.0): 这设置了我们将用来清空画布的颜色。这些数字代表红色、绿色、蓝色和 alpha 值,范围从 0 到 1。
  2. gl.clear(gl.COLOR_BUFFER_BIT): 这实际上用我们指定的颜色清空了画布。

就这样!你已经画出了你的第一幅 WebGL 杰作 - 一幅美丽的天蓝色画布!

记住,这只是一个开始。WebGL 有大量的函数允许你创建复杂的三维图形。这就像学习绘画 - 我们从一个空白的画布和一个单一的颜色开始,但随着练习,你很快就能创造出复杂的三维世界!

在我们结束这个 WebGL 上下文的介绍时,我想起了我第一次教授这个概念的时候。我有一个学生对清空画布的不同颜色非常兴奋,他花了一整个下午创建了一个“颜色变化的情绪灯”程序。这正说明,即使是最简单的概念也能激发出惊人的创造力!

在下一课中,我们将更深入地研究 WebGL 并开始绘制一些形状。在此之前,祝你们编码愉快,愿你们的画布永远色彩斑斓!

Credits: Image by storyset