欢迎进入 WebGL 的世界!
在上一篇《第一篇:WebGL 简介 - 让你的浏览器闪耀起来》,我们介绍了 WebGL 和它的一些基本概念。今天,我们将带你进入更实践的领域:设置你的 WebGL 开发环境并创建你的第一个 3D 对象。
设置开发环境
-
选择合适的浏览器:
- 确保你使用的是支持 WebGL 的最新版本的浏览器。Chrome, Firefox, Safari, 和 Edge 都是不错的选择。
-
调试工具:
chrome
npm 包
- stats.js:一个简单的信息框,展示性能信息
创建你的第一个 WebGL 应用--绘制三角形
-
编写 WebGL 初始化代码:
- 在 HTML 文件中,添加一个
<canvas>元素。这是 WebGL 渲染的地方。 - 接着,编写 JavaScript 代码来初始化 WebGL 上下文。
<script setup lang="ts"> import { ref, onMounted } from "vue"; const canvas = ref<HTMLCanvasElement | null>(null); let gl = ref<WebGLRenderingContext | null>(null); onMounted(() => { if (!canvas.value) return // WebGL 上下文 gl.value = canvas.value.getContext('webgl') if (!gl.value) return ...创建webgl主要代码逻辑 }) </script> <template> <canvas ref="canvas"> </canvas> </template> - 在 HTML 文件中,添加一个
-
创建着色器
着色器是 WebGL 中用来定义物体表面特征(如颜色、亮度等)的小程序。我们将创建一个简单的顶点着色器和片元着色器。
onMounted(() => { ... // 1. 顶点着色器 // 顶点着色器,它接收一个二维向量作为顶点的位置,并将其转换为四维向量,以便在 WebGL 中使用。 const vertex = ` attribute vec2 position; void main() { gl_Position = vec4(position * 1.0, 0.0, 1.0); } ` // 创建一个新的顶点着色器对象 const vertexShader = gl.value.createShader(gl.value.VERTEX_SHADER) // 将源代码附加到顶点着色器对象上 gl.value.shaderSource(vertexShader, vertex) // 编译顶点着色器程序 gl.value.compileShader(vertexShader) // 2. 片段着色器 // 片段着色器,它接收一个四维向量作为颜色,并将其转换为四维向量,以便在 WebGL 中使用。 const fragment = ` precision mediump float; void main() { gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); } ` // 创建一个新的片段着色器对象 const fragmentShader = gl.value.createShader(gl.value.FRAGMENT_SHADER) // 将源代码附加到片段着色器对象上 gl.value.shaderSource(fragmentShader, fragment) // 编译片段着色器程序 gl.value.compileShader(fragmentShader) // 3. 创建 WebGL 程序对象 // 创建一个新的 WebGL 程序对象 const program = gl.value.createProgram() // 将顶点着色器对象附加到 WebGL 程序对象上 gl.value.attachShader(program, vertexShader) // 将片段着色器对象附加到 WebGL 程序对象上 gl.value.attachShader(program, fragmentShader) // 链接 WebGL 程序对象 gl.value.linkProgram(program) // 使用 WebGL 程序对象 gl.value.useProgram(program) }) -
定义顶点数据
我们将定义三个顶点来创建一个三角形。
onMounted(() => { ... // 4. 将数据写入缓冲区对象 // 顶点着色器中的顶点位置变量 const points = new Float32Array([ -1, -1, 0, 1, 1, -1 ]) // 创建一个新的缓冲区对象 const bufferId = gl.value.createBuffer() // 将缓冲区对象绑定到目标 gl.value.bindBuffer(gl.value.ARRAY_BUFFER, bufferId) // 向缓冲区对象中写入数据 gl.value.bufferData(gl.value.ARRAY_BUFFER, points, gl.value.STATIC_DRAW) // 5. 将缓冲区对象中的数据分配给顶点着色器中的变量 // 获取顶点着色器中的顶点位置变量 const aPosition = gl.value.getAttribLocation(program, 'position') // 将缓冲区对象分配给 a_Position 变量 gl.value.vertexAttribPointer(aPosition, 2, gl.value.FLOAT, false, 0, 0) // 连接 a_Position 变量与分配给它的缓冲区对象 gl.value.enableVertexAttribArray(aPosition) )} -
渲染
onMounted(() => { ... gl.value.clear(gl.value.COLOR_BUFFER_BIT) gl.value.drawArrays(gl.value.TRIANGLES, 0, points.length / 2) )}
恭喜你,当你把这些代码片段组合到一起并运行时,你应该会在浏览器中看到一个红色的三角形。
在接下来,我们将进一步探讨如何使用更复杂的几何形状、添加光照效果、以及如何应用纹理映射,让你的 3D 场景更加生动。