-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathlesson05.html
executable file
·149 lines (141 loc) · 5.53 KB
/
lesson05.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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>极光</title>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
html,
body {
width: 100%;
height: 100%;
background-color: #000;
}
.panel {
overflow: hidden;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
z-index: 0;
}
canvas {
position: absolute;
}
</style>
</head>
<body>
<div class="panel">
<canvas width="100%" height="100%"></canvas>
</div>
<script src="../js/Utils.js"></script>
<script type="text/javascript">
(function (exports) {
const clientrect = document.documentElement.getBoundingClientRect();
document.addEventListener('touchmove', function (event) {
event.preventDefault();
});
exports.config = {
width: clientrect.width,
height: clientrect.height
};
})(typeof exports === 'object' ? exports : window);
</script>
<script src="../js/axios.min.js"></script>
<script src="../js/stats.js"></script>
<script>
const stats = new Stats();
stats.showPanel(1); // 0: fps, 1: ms, 2: mb, 3+: custom
document.body.appendChild(stats.dom);
function getFrag() {
return axios.get('./shader/10.frag');
}
function getVert() {
return axios.get('./shader/01.vert');
}
axios.all([getVert(), getFrag()]).then(axios.spread((vert, frag) => {
let indexs;
let vertexs;
let vertexbuffer;
let indexsbuffer;
let v3Position;
let u_resolution;//进行变化时间
let u_time;
let timeLoad = performance.now();
let gl, ctx, program, vertexShader, fragmentShader;
let canvas = document.querySelector('canvas');
canvas.setAttribute('width', config.width);
canvas.setAttribute('height', config.height);
canvas.addEventListener("webglcontextcreationerror", ev => {
console.log(ev.statusMessage || "Unknown");
}, false);
//获取webgl上下文
gl = Utils.WebGlContext(canvas, true);
//创建gl着色器引用
vertexShader = Utils.WebGLShader(gl, "x-vertex", vert.data);
fragmentShader = Utils.WebGLShader(gl, "x-fragment", frag.data);
//创建一个渲染可执行程序
program = Utils.WebProgram(gl, vertexShader, fragmentShader);
//只可以链接之后读取使用 优先使用
v3Position = gl.getAttribLocation(program, "v3Position");
u_resolution = gl.getUniformLocation(program, "u_resolution");
u_time = gl.getUniformLocation(program, "u_time");
gl.uniform2f(u_resolution, config.width, config.height);
// 也可以使用数组模式
//gl.uniform2fv(u_resolution, new Float32Array([config.width, config.height]));
//顶点数据
vertexs = new Float32Array([
// x y z nx ny nz
-1.0, 1.0, 0.0, 0.0, 0.0, 0.0,
1.0, 1.0, 0.0, 0.0, 0.0, 0.0,
1.0, -1.0, 0.0, 0.0, 0.0, 0.0,
-1.0, 1.0, 0.0, 0.0, 0.0, 0.0,
-1.0, -1.0, 0.0, 0.0, 0.0, 0.0,
1.0, -1.0, 0.0, 0.0, 0.0, 0.0
]);
//创建数据缓冲区
vertexbuffer = gl.createBuffer();
/**
* 将创建的缓冲区设置为顶点缓冲区
* webgl. ARRAY_BUFFER 表示缓冲区对象中包含了顶点的数据。
* webgl.ELEMENT_ARRAY_BUFFER 表示缓冲区包含了顶点的索引值。
*/
gl.bindBuffer(gl.ARRAY_BUFFER, vertexbuffer);
/**
* 创建指定大小显卡缓冲区 ps STATIC_DRAW 告诉显卡为静态数据不修改
* webgl.STATIC_DRAW 向缓冲区中写入一次数据, 但需要绘制很多次
* webgl.STREAM_DRAW 写入一次数据,绘制若干次
* webgl.DYNAMIC_DRAW 向缓冲区中多次写入数据, 绘制多次
*/
gl.bufferData(gl.ARRAY_BUFFER, vertexs, gl.STATIC_DRAW);
//指定从重第几个字节开始更新 第一次全部写入缓冲区
//gl.bufferSubData(gl.ARRAY_BUFFER,0,indices);
//绘制背景颜色
gl.clear(gl.COLOR_BUFFER_BIT);
//清除背景指定使用哪一个缓冲区
gl.bindBuffer(gl.ARRAY_BUFFER, vertexbuffer);
//顶点属性指针进行绑定
gl.vertexAttribPointer(v3Position, 3, gl.FLOAT, false, 4 * 6, 0);
//启用顶点属性数组并且使用上一个状态绑定的缓冲区
gl.enableVertexAttribArray(v3Position);
gl.clear(gl.COLOR_BUFFER_BIT);
//开始绘制
gl.drawArrays(gl.TRIANGLES, 0, 6);
function upFrame() {
stats.begin();
//开始绘制
let now = performance.now();
gl.uniform1f(u_time, (now - timeLoad) / 1000.0);
gl.drawArrays(gl.TRIANGLES, 0, 6);
stats.end();
window.requestAnimationFrame(upFrame);
}
window.requestAnimationFrame(upFrame);
}));
</script>
</body>
</html>