📅  最后修改于: 2023-12-03 15:05:55.225000             🧑  作者: Mango
WebGL是一种用于在Web浏览器中进行交互式2D和3D图形渲染的API。使用WebGL,开发者可以在Web浏览器中使用类似OpenGL的API进行3D图形渲染。本文将给程序员介绍如何使用WebGL来绘制一个简单的三角形。
在开始前,需要准备以下材料:
在HTML文件中添加一个canvas元素,并设置宽度和高度。
<canvas id="myCanvas" width="500" height="500"></canvas>
在JavaScript文件中,获取canvas元素以及WebGL上下文,并将它们存储在变量中。
// 获取canvas元素和WebGL上下文
const canvas = document.getElementById("myCanvas");
const gl = canvas.getContext("webgl");
设置WebGL视口以及清除背景色。
// 设置视口
gl.viewport(0, 0, canvas.width, canvas.height);
// 清除背景色
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
编写顶点着色器代码,用于将顶点的坐标转换为屏幕上的坐标。
// 顶点着色器代码
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, 1.0, 1.0, 1.0);
}
`;
创建着色器程序,并将顶点着色器和片元着色器连接到一起。
// 创建顶点着色器
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 shaderProgram = gl.createProgram();
gl.attachShader(shaderProgram, vertexShader);
gl.attachShader(shaderProgram, fragmentShader);
gl.linkProgram(shaderProgram);
gl.useProgram(shaderProgram);
定义三角形的顶点数据,并将每个顶点的x和y坐标存储在一个Float32Array数组中。将这个数组绑定到WebGL缓冲区中,并定义一个顶点属性,用于读取每个顶点的坐标。
// 定义三角形的顶点数据
const vertices = new Float32Array([
-0.5, 0.5,
-0.5, -0.5,
0.5, -0.5,
]);
// 将顶点数据绑定到WebGL缓冲区中
const buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
// 定义顶点属性
const positionAttributeLocation = gl.getAttribLocation(shaderProgram, "a_position");
gl.enableVertexAttribArray(positionAttributeLocation);
gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);
使用gl.drawArrays方法绘制三角形。
// 绘制三角形
gl.drawArrays(gl.TRIANGLES, 0, 3);
HTML代码:
<!DOCTYPE html>
<html>
<head>
<title>WebGL-绘制三角形</title>
<meta charset="utf-8">
</head>
<body>
<canvas id="myCanvas" width="500" height="500"></canvas>
<script src="./main.js"></script>
</body>
</html>
JavaScript代码:
// 获取canvas元素和WebGL上下文
const canvas = document.getElementById("myCanvas");
const gl = canvas.getContext("webgl");
// 设置视口
gl.viewport(0, 0, canvas.width, canvas.height);
// 清除背景色
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
// 顶点着色器代码
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, 1.0, 1.0, 1.0);
}
`;
// 创建顶点着色器
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 shaderProgram = gl.createProgram();
gl.attachShader(shaderProgram, vertexShader);
gl.attachShader(shaderProgram, fragmentShader);
gl.linkProgram(shaderProgram);
gl.useProgram(shaderProgram);
// 定义三角形的顶点数据
const vertices = new Float32Array([
-0.5, 0.5,
-0.5, -0.5,
0.5, -0.5,
]);
// 将顶点数据绑定到WebGL缓冲区中
const buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
// 定义顶点属性
const positionAttributeLocation = gl.getAttribLocation(shaderProgram, "a_position");
gl.enableVertexAttribArray(positionAttributeLocation);
gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);
// 绘制三角形
gl.drawArrays(gl.TRIANGLES, 0, 3);
将上述代码复制到HTML和JavaScript文件中,使用本地Web服务器运行HTML文件。在浏览器中打开该网页,就可以看到一个简单的白色三角形。