WebGL - 介绍

你好,未来的WebGL魔法师们!欢迎加入我们激动人心的3D网页图形世界之旅。我很高兴能作为你的向导,一起探索WebGL这个迷人的领域。作为一个教授计算机图形学超过十年的人,我可以向你保证,尽管前方的道路可能看起来令人畏惧,但它同样极其有价值。所以,系好安全带,让我们跳进去吧!

WebGL - Introduction

什么是OpenGL?

在我们深入了解WebGL之前,让我们快速了解一下它的前身,OpenGL。想象你是一位试图创作杰作的艺术家。OpenGL就像是你的神奇颜料和画笔套装,让你能在计算机屏幕上创作出令人惊叹的视觉艺术。

OpenGL代表开放图形库,是一个跨平台的API(应用程序编程接口),用于渲染2D和3D矢量图形。自1992年以来,它一直存在,并且成为无数游戏、模拟和视觉应用的基础。

这里有一个简单的类比:如果你的计算机屏幕是一块画布,那么OpenGL就是帮助程序员以惊人的细节和速度在这块画布上绘画的工具集。

什么是WebGL?

现在,让我们将注意力转移到我们节目的明星:WebGL。如果说OpenGL是桌面应用的画笔,那么WebGL就是网络的画笔。它是一个JavaScript API,允许你在不需要任何插件的情况下,直接在网页中创建出色的3D图形。

WebGL将OpenGL ES 2.0(用于嵌入式系统的OpenGL版本)的力量带到了网络,允许开发者通过JavaScript直接利用GPU。

下面是一个简单的WebGL "Hello, World!"示例:

<canvas id="glCanvas" width="640" height="480"></canvas>
<script>
function main() {
const canvas = document.getElementById("glCanvas");
const gl = canvas.getContext("webgl");

if (gl === null) {
alert("无法初始化WebGL。您的浏览器或机器可能不支持。");
return;
}

gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
}

window.onload = main;
</script>

这段代码在你的网页上创建了一个黑色画布。它可能看起来不多,但这是你进入WebGL世界的第一步!

谁开发了WebGL

WebGL是由Khronos Group开发的,他们是OpenGL背后的同一群人。WebGL首次在2011年推出,自那时起,它改变了我们对网络图形的看法。

有趣的事实:WebGL的开发受到了Vladimir Vukićević在Mozilla的实验的启发。他创建了一个暴露OpenGL ES给JavaScript的canvas元素,这为WebGL的发展奠定了基础。

渲染

渲染是从2D或3D模型生成图像的过程。在WebGL中,这个过程是实时发生的,这意味着图像是在你与之交互时即时生成的。

下面是一个渲染红色三角形的简单示例:

// 顶点着色器程序
const vsSource = `
attribute vec4 aVertexPosition;
void main() {
gl_Position = aVertexPosition;
}
`;

// 片元着色器程序
const fsSource = `
void main() {
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
`;

// ...(初始化代码)

// 绘制场景
function drawScene(gl, programInfo, buffers) {
gl.clearColor(0.0, 0.0, 0.0, 1.0);  // 清除为黑色,完全不透明
gl.clearDepth(1.0);                 // 清除所有内容
gl.enable(gl.DEPTH_TEST);           // 启用深度测试
gl.depthFunc(gl.LEQUAL);            // 近处的物体遮挡远处的物体

// 在开始绘制之前清除画布
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

// ...(设置场景)

{
const numComponents = 2;  // 每次迭代提取2个值
const type = gl.FLOAT;    // 缓冲区中的数据是32位浮点数
const normalize = false;  // 不归一化
const stride = 0;         // 从一组值到下一组值需要多少字节
const offset = 0;         // 缓冲区内部从哪里开始
gl.bindBuffer(gl.ARRAY_BUFFER, buffers.position);
gl.vertexAttribPointer(
programInfo.attribLocations.vertexPosition,
numComponents,
type,
normalize,
stride,
offset);
gl.enableVertexAttribArray(
programInfo.attribLocations.vertexPosition);
}

// 告诉WebGL在绘制时使用我们的程序
gl.useProgram(programInfo.program);

{
const offset = 0;
const vertexCount = 3;
gl.drawArrays(gl.TRIANGLES, offset, vertexCount);
}
}

这段代码设置了必要的着色器和缓冲区,以在屏幕上渲染一个简单的红色三角形。

GPU

GPU代表图形处理单元。它是一种专用处理器,旨在处理渲染图形中涉及的复杂数学运算。虽然CPU非常适合通用计算,但GPU擅长并行执行许多简单计算,这对图形工作非常理想。

可以这样理解:如果渲染一个复杂的3D场景就像绘制一幅巨大的壁画,那么CPU就像一个极其有才华的艺术家,而GPU就像数千个普通艺术家一起工作。

GPU加速计算

GPU加速计算指的是将GPU与CPU结合使用,以加速科学、分析、工程、消费和企业应用程序。在WebGL的背景下,这意味着你的图形计算被卸载到GPU,从而释放CPU处理其他任务,并产生更平滑、更快速的图形。

支持的浏览器

WebGL的美妙之处在于它在现代浏览器中的广泛支持。截至2023年,WebGL支持以下浏览器:

浏览器 版本
Chrome 9+
Firefox 4+
Safari 5.1+
Opera 12+
Internet Explorer 11+
Microsoft Edge 12+

WebGL的优势

WebGL提供了许多优势:

  1. 跨平台兼容性:一次编写,到处运行(只要浏览器支持)。
  2. 无需插件:它内置在浏览器中。
  3. 硬件加速:利用GPU实现更好的性能。
  4. 与网络技术集成:可以与其他网络API结合,提供丰富的交互体验。
  5. 开放标准:任何人都可以为其发展做出贡献。

环境设置

设置你的WebGL环境出奇地简单。你需要的只是:

  1. 一个现代的网络浏览器
  2. 一个文本编辑器(我推荐Visual Studio Code)
  3. 一个本地网络服务器(你可以使用Python内置的服务器或Node.js的http-server)

以下是一个简单的设置过程:

  1. 为你的项目创建一个新的目录
  2. 创建一个HTML文件(例如,index.html)和一个JavaScript文件(例如,script.js
  3. 在你的HTML文件中,包含你的JavaScript文件并设置一个canvas:
<!DOCTYPE html>
<html>
<head>
<title>我的第一个WebGL项目</title>
</head>
<body>
<canvas id="glCanvas" width="640" height="480"></canvas>
<script src="script.js"></script>
</body>
</html>
  1. 在你的JavaScript文件中,初始化WebGL:
function main() {
const canvas = document.getElementById("glCanvas");
const gl = canvas.getContext("webgl");

if (gl === null) {
alert("无法初始化WebGL。您的浏览器或机器可能不支持。");
return;
}

// WebGL代码放在这里
}

window.onload = main;

就这样!你现在准备好开始你的WebGL之旅了。记住,学习WebGL就像学习骑自行车 - 起初可能会有些摇晃,但经过练习,你很快就会自如地骑行。快乐编码!

Credits: Image by storyset