-
Notifications
You must be signed in to change notification settings - Fork 107
/
Copy pathlesson1.1.html
101 lines (96 loc) · 3.23 KB
/
lesson1.1.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>动态绘制点</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel = "stylesheet" href="../css/common.css" />
</head>
<body>
<canvas id="canvas"></canvas>
<div class="tips">点击屏幕试一下~</div>
<script type="shader-source" id="vertexShader">
//浮点数设置为中等精度
precision mediump float;
//接收 JavaScript 传递过来的点的坐标(X, Y)
attribute vec2 a_Position;
// 接收canvas的尺寸。
attribute vec2 a_Screen_Size;
void main(){
// 将 canvas 的坐标值 转换为 [-1.0, 1.0]的范围。
vec2 position = (a_Position / a_Screen_Size) * 2.0 - 1.0;
// canvas的 Y 轴坐标方向和 设备坐标系的相反。
position = position * vec2(1.0, -1.0);
// 最终的顶点坐标。
gl_Position = vec4(position, 0.0, 1.0);
// 点的大小。
gl_PointSize = 10.0;
}
</script>
<script type="shader-source" id="fragmentShader">
//浮点数设置为中等精度
precision mediump float;
//全局变量,用来接收 JavaScript传递过来的颜色。
uniform vec4 u_Color;
void main(){
// 将颜色处理成 GLSL 允许的范围[0, 1]。
vec4 color = u_Color / vec4(255, 255, 255, 1);
// 点的最终颜色。
gl_FragColor = color;
}
</script>
<script src="../utils/webgl-helper.js"></script>
<script>
//获取canvas
let canvas = getCanvas('#canvas');
//设置canvas尺寸为满屏
resizeCanvas(canvas);
//获取绘图上下文
let gl = getContext(canvas);
//创建定点着色器
let vertexShader = createShaderFromScript(gl, gl.VERTEX_SHADER, 'vertexShader');
//创建片元着色器
let fragmentShader = createShaderFromScript(gl, gl.FRAGMENT_SHADER, 'fragmentShader');
//创建着色器程序
let program = createSimpleProgram(gl, vertexShader, fragmentShader);
//使用该着色器程序
gl.useProgram(program);
//获取顶点着色器中的变量a_Position的位置。
let a_Position = gl.getAttribLocation(program, 'a_Position');
//获取顶点着色器中的变量a_Screen_Size的位置。
let a_Screen_Size = gl.getAttribLocation(program, 'a_Screen_Size');
//获取片元着色器中的变量u_Color的位置。
let u_Color = gl.getUniformLocation(program, 'u_Color');
//向顶点着色器的 a_Screen_Size 传递 canvas 尺寸信息。
gl.vertexAttrib2f(a_Screen_Size, canvas.width, canvas.height);
//存储区顶点信息的容器
let points = [];
canvas.addEventListener('click', e=>{
let x = e.pageX;
let y = e.pageY;
let color = randomColor();
//存储新的点的坐标和颜色。
points.push({x : x, y : y, color : color})
render(gl);
})
//绘制函数
function render(gl){
//清除屏幕
gl.clear(gl.COLOR_BUFFER_BIT);
for(let i = 0; i<points.length;i++){
let color = points[i].color;
//向片元着色器传递颜色信息
gl.uniform4f(u_Color, color.r, color.g, color.b, color.a);
//向顶点着色器传递坐标信息。
gl.vertexAttrib2f(a_Position, points[i].x, points[i].y);
//绘制点。
gl.drawArrays(gl.POINTS, 0, 1);
}
}
//设置屏幕清除颜色为黑色。
gl.clearColor(0,0,0,1.0);
//绘制
render(gl);
</script>
</body>
</html>