使用 WebGL 创建真实感的 3D 场景

神秘剑客 2021-04-17 ⋅ 16 阅读

WebGL 是一种用于在 Web 浏览器中呈现 3D 图形的 JavaScript API。它是基于 OpenGL ES 2.0 的高性能图形库,并且能够在现代的浏览器上运行。在本教程中,我们将介绍如何使用 WebGL 创建一个真实感的 3D 场景。

准备工作

在开始之前,我们需要确保我们的浏览器支持 WebGL。大多数最新版本的主流浏览器都已经支持 WebGL。可以通过访问caniuse.com来查看您的浏览器是否支持 WebGL。

获取 WebGL 上下文

要使用 WebGL,我们首先需要获取 WebGL 上下文。我们可以通过在 HTML 中创建 <canvas> 元素,并使用 JavaScript 获取其上下文来实现。

HTML

<canvas id="webglCanvas"></canvas>

JavaScript

const canvas = document.getElementById('webglCanvas');
const gl = canvas.getContext('webgl');

创建顶点和片段着色器

WebGL 使用顶点和片段着色器来处理图形的渲染。顶点着色器用于变换顶点的位置和属性,而片段着色器用于确定像素的颜色等属性。

顶点着色器

const vertexShaderSource = `
attribute vec4 a_position;

void main() {
  gl_Position = a_position;
}
`;

片段着色器

const fragmentShaderSource = `
precision mediump float;

void main() {
  gl_FragColor = vec4(1, 0, 0, 1); // 红色
}
`;

编译和链接着色器

在通过 WebGL 绘制图形之前,我们需要将上述的着色器源代码编译为着色器对象,并将其链接到 WebGL 程序对象中。

// 创建顶点着色器
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);

// 创建 WebGL 程序对象,并将着色器链接到该对象
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
gl.useProgram(program);

创建顶点缓冲区

顶点缓冲区是一块内存区域,用于存储顶点数据。我们可以将要绘制的顶点数据存储在顶点缓冲区中,并告诉 WebGL 如何解析这些数据。

const positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);

// 定义一个矩形的顶点数据
const positions = [
  -0.5, 0.5,
  -0.5, -0.5,
  0.5, -0.5,

  -0.5, 0.5,
  0.5, -0.5,
  0.5, 0.5,
];

// 将顶点数据写入缓冲区
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);

设置顶点属性

我们需要告诉 WebGL 如何解析顶点缓冲区中的数据。这需要使用 gl.vertexAttribPointer 方法配置顶点属性。

const positionAttributeLocation = gl.getAttribLocation(program, 'a_position');
gl.enableVertexAttribArray(positionAttributeLocation);
gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);

渲染场景

最后,我们可以使用 WebGL 的绘制命令将顶点数据呈现到屏幕上。

// 清空画布
gl.clearColor(0, 0, 0, 1);
gl.clear(gl.COLOR_BUFFER_BIT);

// 绘制矩形
gl.drawArrays(gl.TRIANGLES, 0, 6);

总结

通过使用 WebGL,我们可以创建出令人印象深刻的真实感 3D 场景。在本教程中,我们探讨了 WebGL 的基础知识,包括获取 WebGL 上下文、创建着色器、编译和链接着色器、创建顶点缓冲区、设置顶点属性以及渲染场景。希望本教程对您入门 WebGL 有所帮助!

参考资料:


全部评论: 0

    我有话说: