要创建一个使用WebGL实现磨砂玻璃效果,可以按照以下步骤进行:
- 创建一个HTML文件,命名为index.html,并在文件中添加必要的HTML结构和样式。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>磨砂玻璃效果</title>
<style>
body {
margin: 0;
padding: 0;
overflow: hidden;
}
canvas {
display: block;
}
</style>
</head>
<body>
<canvas id="canvas"></canvas>
</body>
</html>
- 创建一个JavaScript文件,命名为script.js,并在文件中添加必要的代码。
window.onload = function() {
// 获取canvas元素
var canvas = document.getElementById('canvas');
var gl = canvas.getContext('webgl');
// 创建顶点着色器
var vertexShaderSource = `
attribute vec2 a_position;
attribute vec2 a_texCoord;
varying vec2 v_texCoord;
void main() {
gl_Position = vec4(a_position, 0, 1);
v_texCoord = a_texCoord;
}
`;
var vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexShaderSource);
gl.compileShader(vertexShader);
// 创建片元着色器
var fragmentShaderSource = `
precision highp float;
uniform sampler2D u_texture;
varying vec2 v_texCoord;
void main() {
vec4 color = texture2D(u_texture, v_texCoord);
float dx = 1.0 / textureSize(u_texture, 0).x;
float dy = 1.0 / textureSize(u_texture, 0).y;
vec4 sum = vec4(0.0);
sum += texture2D(u_texture, vec2(v_texCoord.x - 4.0*dx, v_texCoord.y - 4.0*dy)) * 0.05;
sum += texture2D(u_texture, vec2(v_texCoord.x - 3.0*dx, v_texCoord.y - 3.0*dy)) * 0.09;
sum += texture2D(u_texture, vec2(v_texCoord.x - 2.0*dx, v_texCoord.y - 2.0*dy)) * 0.12;
sum += texture2D(u_texture, vec2(v_texCoord.x - dx, v_texCoord.y - dy)) * 0.15;
sum += texture2D(u_texture, vec2(v_texCoord.x, v_texCoord.y)) * 0.16;
sum += texture2D(u_texture, vec2(v_texCoord.x + dx, v_texCoord.y + dy)) * 0.15;
sum += texture2D(u_texture, vec2(v_texCoord.x + 2.0*dx, v_texCoord.y + 2.0*dy)) * 0.12;
sum += texture2D(u_texture, vec2(v_texCoord.x + 3.0*dx, v_texCoord.y + 3.0*dy)) * 0.09;
sum += texture2D(u_texture, vec2(v_texCoord.x + 4.0*dx, v_texCoord.y + 4.0*dy)) * 0.05;
gl_FragColor = sum;
}
`;
var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentShaderSource);
gl.compileShader(fragmentShader);
// 创建着色器程序
var program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
gl.useProgram(program);
// 创建顶点缓冲区
var positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
var positions = [
-1, 1,
-1, -1,
1, 1,
1, -1,
];
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
var positionAttributeLocation = gl.getAttribLocation(program, 'a_position');
gl.enableVertexAttribArray(positionAttributeLocation);
gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);
// 创建纹理坐标缓冲