返回

WebGL 入门:从一个鼠标画点开始探索原生 WebGL

前端

WebGL 作为一种强大的跨平台 3D 图形 API,因其易于使用和强大的功能,已成为 Web 开发中不可或缺的一部分。然而,对于许多 Web 开发者而言,WebGL 仍然是一个神秘而陌生的领域,往往被认为需要深厚的计算机图形学基础。为了让更多 Web 开发者能够轻松入门 WebGL,本系列文章将从最基础的知识开始,循序渐进地讲解 WebGL 原生编程的基础知识,无需任何计算机图形学基础,即可快速入门 WebGL。

鼠标画点:WebGL 的第一笔

为了让大家更好地理解 WebGL 的基本概念和使用方法,我们将从一个简单的鼠标画点程序开始。这个程序将允许用户在浏览器中通过鼠标点击在画布上绘制点。

  1. 创建画布并初始化 WebGL 上下文

首先,我们需要创建一个 <canvas> 元素并获取其 WebGL 上下文。

<canvas id="canvas"></canvas>
const canvas = document.getElementById('canvas');
const gl = canvas.getContext('webgl');
  1. 编写顶点着色器和片段着色器

WebGL 使用着色器程序来处理图形数据。着色器程序由两个着色器组成:顶点着色器和片段着色器。顶点着色器负责处理顶点数据,片段着色器负责处理片段数据。

// 顶点着色器
const vertexShaderSource = `
  attribute vec2 a_position;
  void main() {
    gl_Position = vec4(a_position, 0.0, 1.0);
  }
`;

// 片段着色器
const fragmentShaderSource = `
  void main() {
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
  }
`;
  1. 创建并编译着色器程序

将顶点着色器和片段着色器编译成着色器程序。

const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexShaderSource);
gl.compileShader(vertexShader);

const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentShaderSource);
gl.compileShader(fragmentShader);

const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
  1. 创建缓冲区对象并填充顶点数据

缓冲区对象用于存储顶点数据。我们将创建一个缓冲区对象并填充一个简单的顶点数据。

const positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
const positions = [
  0, 0,
];
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
  1. 链接顶点着色器的属性和缓冲区对象

将顶点着色器的属性和缓冲区对象链接起来,以便顶点着色器可以访问顶点数据。

const positionAttributeLocation = gl.getAttribLocation(program, 'a_position');
gl.enableVertexAttribArray(positionAttributeLocation);
gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);
  1. 设置视口并清除颜色缓冲区

设置视口并清除颜色缓冲区,以便我们可以开始在画布上绘制。

gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
  1. 使用着色器程序并绘制点

使用着色器程序并绘制点。

gl.useProgram(program);
gl.drawArrays(gl.POINTS, 0, 1);
  1. 添加鼠标事件监听器

添加鼠标事件监听器,以便用户可以在画布上点击绘制点。

canvas.addEventListener('click', (e) => {
  const rect = canvas.getBoundingClientRect();
  const x = e.clientX - rect.left;
  const y = e.clientY - rect.top;
  const position = [
    x * 2 / canvas.width - 1,
    1 - y * 2 / canvas.height,
  ];
  gl.bufferSubData(gl.ARRAY_BUFFER, 0, new Float32Array(position));
  gl.drawArrays(gl.POINTS, 0, 1);
});

通过以上步骤,我们完成了一个简单的鼠标画点程序。当用户在画布上点击时,程序将在点击的位置绘制一个点。通过对这个程序的深入理解,您可以开始学习 WebGL 的更高级知识,并创建更复杂的 3D 图形应用程序。

在后续的文章中,我们将继续深入探索 WebGL 的世界,逐步介绍 WebGL 的基本概念、图形渲染管线、顶点着色器、片段着色器、缓冲区对象、纹理等知识。我们将通过大量的示例和代码,让您能够轻松掌握 WebGL 的编程技巧,并能够创建出令人惊叹的 3D 图形应用程序。