返回
WebGL绘制渐变三角形实战:掌握顶点着色器的力量
前端
2024-01-24 09:40:58
在上一篇博文中,我们探索了使用WebGL绘制点和三角形的基础知识,并通过WebGLBuffer向WebGL传递顶点数据。今天,我们将深入研究WebGL,了解如何绘制渐变色三角形,从而揭开顶点着色器的强大功能。
理解顶点着色器
顶点着色器是一个程序,它作用在单个顶点上,执行一系列变换和计算。在我们的例子中,我们将使用顶点着色器来计算三角形每个顶点的颜色。
代码实现
// 顶点着色器代码
const vertexShaderSource = `
attribute vec3 a_position;
attribute vec3 a_color;
varying vec3 v_color;
void main() {
gl_Position = vec4(a_position, 1.0);
v_color = a_color;
}
`;
// 片元着色器代码
const fragmentShaderSource = `
precision mediump float;
varying vec3 v_color;
void main() {
gl_FragColor = vec4(v_color, 1.0);
}
`;
// WebGL初始化
const canvas = document.querySelector('canvas');
const gl = canvas.getContext('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);
// 创建着色器程序
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
// 顶点数据
const positions = [
-0.5, -0.5, 0.0,
0.5, -0.5, 0.0,
0.0, 0.5, 0.0
];
const colors = [
1.0, 0.0, 0.0,
0.0, 1.0, 0.0,
0.0, 0.0, 1.0
];
// 缓冲对象
const positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
const colorBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
// 绑定缓冲对象
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
const positionAttributeLocation = gl.getAttribLocation(program, 'a_position');
gl.enableVertexAttribArray(positionAttributeLocation);
gl.vertexAttribPointer(positionAttributeLocation, 3, gl.FLOAT, false, 0, 0);
gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer);
const colorAttributeLocation = gl.getAttribLocation(program, 'a_color');
gl.enableVertexAttribArray(colorAttributeLocation);
gl.vertexAttribPointer(colorAttributeLocation, 3, gl.FLOAT, false, 0, 0);
// 设置视口
gl.viewport(0, 0, canvas.width, canvas.height);
// 清空画布
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
// 绘制三角形
gl.useProgram(program);
gl.drawArrays(gl.TRIANGLES, 0, positions.length / 3);
探索渐变效果
顶点着色器接受顶点数据并对其进行计算。在我们的示例中,我们计算每个顶点的颜色,并将其存储在v_color
中。然后,片元着色器使用v_color
值来设置每个像素的颜色。
通过分别设置每个顶点的颜色,我们可以创建渐变效果。在本例中,我们设置三个顶点具有不同的颜色(红色、绿色和蓝色),这会在三角形表面产生一种平滑的过渡。
结论
WebGL的强大功能在于其允许我们通过顶点着色器和片元着色器对单个顶点和像素进行操作。在绘制渐变三角形的过程中,我们展示了顶点着色器如何计算顶点颜色,而片元着色器如何使用这些颜色来生成最终图像。
通过了解顶点着色器的力量,我们可以创造出复杂且动态的WebGL场景,从而将我们的想象变成栩栩如生的数字世界。