jmgraph 3.2.16 → 3.2.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +251 -428
- package/build/gulpfile.js +142 -142
- package/build/package-lock.json +10666 -0
- package/build/package.json +71 -71
- package/dev.js +9 -9
- package/dist/jmgraph.core.min.js +1 -1
- package/dist/jmgraph.core.min.js.map +1 -1
- package/dist/jmgraph.js +3500 -2668
- package/dist/jmgraph.min.js +1 -1
- package/example/ball.html +216 -216
- package/example/base.html +111 -111
- package/example/canvas.html +53 -53
- package/example/cell.html +283 -283
- package/example/controls/arc.html +128 -128
- package/example/controls/arrowline.html +77 -77
- package/example/controls/bezier.html +298 -298
- package/example/controls/img.html +96 -96
- package/example/controls/label.html +86 -86
- package/example/controls/line.html +172 -172
- package/example/controls/prismatic.html +62 -62
- package/example/controls/rect.html +63 -63
- package/example/controls/resize.html +111 -111
- package/example/controls/test.html +359 -359
- package/example/es.html +69 -69
- package/example/es5module.html +62 -63
- package/example/heartarc.html +115 -115
- package/example/index.html +46 -46
- package/example/js/require.js +4 -4
- package/example/love/img/bling/bling.tps +265 -265
- package/example/love/img/bling.json +87 -87
- package/example/love/img/bling.tps +295 -295
- package/example/love/img/love.json +95 -95
- package/example/love/img/love.tps +315 -315
- package/example/love/img/qq/qq.tps +399 -399
- package/example/love/img/qq.json +242 -242
- package/example/love/index.html +40 -40
- package/example/love/js/game.js +558 -558
- package/example/music.html +210 -210
- package/example/node/test.js +137 -137
- package/example/pdf.html +186 -186
- package/example/progress.html +172 -172
- package/example/pso.html +147 -147
- package/example/sort.html +804 -815
- package/example/tweenjs.html +83 -83
- package/example/webgl.html +278 -278
- package/example/xfj/index.html +331 -331
- package/example/xfj/shake.js +48 -48
- package/example/xfj/testori.html +75 -75
- package/index.js +99 -99
- package/package.json +58 -56
- package/src/core/jmControl.js +1376 -1531
- package/src/core/jmEvents.js +240 -281
- package/src/core/jmGradient.js +231 -231
- package/src/core/jmGraph.js +569 -569
- package/src/core/jmList.js +92 -157
- package/src/core/jmObject.js +83 -103
- package/src/core/jmPath.js +35 -35
- package/src/core/jmProperty.js +71 -110
- package/src/core/jmShadow.js +65 -65
- package/src/core/jmUtils.js +906 -919
- package/src/lib/earcut.js +680 -680
- package/src/lib/earcut.md +73 -73
- package/src/lib/webgl/base.js +522 -452
- package/src/lib/webgl/core/buffer.js +48 -48
- package/src/lib/webgl/core/mapSize.js +40 -40
- package/src/lib/webgl/core/mapType.js +43 -43
- package/src/lib/webgl/core/program.js +138 -138
- package/src/lib/webgl/core/shader.js +13 -13
- package/src/lib/webgl/core/texture.js +60 -60
- package/src/lib/webgl/gradient.js +168 -168
- package/src/lib/webgl/index.js +137 -11
- package/src/lib/webgl/path.js +568 -561
- package/src/shapes/jmArrowLine.js +36 -36
- package/src/shapes/jmImage.js +244 -244
- package/src/shapes/jmLabel.js +271 -271
- package/src/shapes/jmResize.js +332 -330
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
|
|
2
|
-
// 创建缓冲区
|
|
3
|
-
function createBuffer(gl, data, type=gl.ARRAY_BUFFER, drawType=gl.STATIC_DRAW) {
|
|
4
|
-
//先创建一个缓存对象
|
|
5
|
-
const buffer = gl.createBuffer();
|
|
6
|
-
if(!buffer) {
|
|
7
|
-
throw Error('创建缓冲区对象失败');
|
|
8
|
-
}
|
|
9
|
-
//说明缓存对象保存的类型
|
|
10
|
-
gl.bindBuffer(type, buffer);
|
|
11
|
-
//写入坐标数据
|
|
12
|
-
// 因为会将数据发送到 GPU,为了省去数据解析,这里使用 Float32Array 直接传送数据
|
|
13
|
-
// data.buffer这里要使用data.buffer,否则在edge下可能导至数据发生较大的改变
|
|
14
|
-
gl.bufferData(type, data.buffer || data, drawType); // 表示缓冲区的内容不会经常更改
|
|
15
|
-
return {
|
|
16
|
-
type,
|
|
17
|
-
drawType,
|
|
18
|
-
buffer,
|
|
19
|
-
// 获取到数组中单个元素的字节数
|
|
20
|
-
unitSize: data.BYTES_PER_ELEMENT
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// 创建float32的buffer
|
|
25
|
-
function createFloat32Buffer(gl, data, type=gl.ARRAY_BUFFER, drawType=gl.STATIC_DRAW) {
|
|
26
|
-
const vertices = new Float32Array(data);
|
|
27
|
-
const buffer = createBuffer(gl, vertices, type, drawType);
|
|
28
|
-
return buffer;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// 创建uint16的bugger
|
|
32
|
-
function createUint16Buffer(gl, data, type=gl.ARRAY_BUFFER, drawType=gl.STATIC_DRAW) {
|
|
33
|
-
const vertices = new Uint16Array(data);
|
|
34
|
-
const buffer = createBuffer(gl, vertices, type, drawType);
|
|
35
|
-
return buffer;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// 释放
|
|
39
|
-
function deleteBuffer(gl, buffer) {
|
|
40
|
-
gl.deleteBuffer(buffer.buffer || buffer);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
export {
|
|
45
|
-
createBuffer,
|
|
46
|
-
createUint16Buffer,
|
|
47
|
-
createFloat32Buffer,
|
|
48
|
-
deleteBuffer,
|
|
1
|
+
|
|
2
|
+
// 创建缓冲区
|
|
3
|
+
function createBuffer(gl, data, type=gl.ARRAY_BUFFER, drawType=gl.STATIC_DRAW) {
|
|
4
|
+
//先创建一个缓存对象
|
|
5
|
+
const buffer = gl.createBuffer();
|
|
6
|
+
if(!buffer) {
|
|
7
|
+
throw Error('创建缓冲区对象失败');
|
|
8
|
+
}
|
|
9
|
+
//说明缓存对象保存的类型
|
|
10
|
+
gl.bindBuffer(type, buffer);
|
|
11
|
+
//写入坐标数据
|
|
12
|
+
// 因为会将数据发送到 GPU,为了省去数据解析,这里使用 Float32Array 直接传送数据
|
|
13
|
+
// data.buffer这里要使用data.buffer,否则在edge下可能导至数据发生较大的改变
|
|
14
|
+
gl.bufferData(type, data.buffer || data, drawType); // 表示缓冲区的内容不会经常更改
|
|
15
|
+
return {
|
|
16
|
+
type,
|
|
17
|
+
drawType,
|
|
18
|
+
buffer,
|
|
19
|
+
// 获取到数组中单个元素的字节数
|
|
20
|
+
unitSize: data.BYTES_PER_ELEMENT
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// 创建float32的buffer
|
|
25
|
+
function createFloat32Buffer(gl, data, type=gl.ARRAY_BUFFER, drawType=gl.STATIC_DRAW) {
|
|
26
|
+
const vertices = new Float32Array(data);
|
|
27
|
+
const buffer = createBuffer(gl, vertices, type, drawType);
|
|
28
|
+
return buffer;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// 创建uint16的bugger
|
|
32
|
+
function createUint16Buffer(gl, data, type=gl.ARRAY_BUFFER, drawType=gl.STATIC_DRAW) {
|
|
33
|
+
const vertices = new Uint16Array(data);
|
|
34
|
+
const buffer = createBuffer(gl, vertices, type, drawType);
|
|
35
|
+
return buffer;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// 释放
|
|
39
|
+
function deleteBuffer(gl, buffer) {
|
|
40
|
+
gl.deleteBuffer(buffer.buffer || buffer);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
export {
|
|
45
|
+
createBuffer,
|
|
46
|
+
createUint16Buffer,
|
|
47
|
+
createFloat32Buffer,
|
|
48
|
+
deleteBuffer,
|
|
49
49
|
}
|
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
|
|
2
|
-
const GLSL_TO_SIZE = {
|
|
3
|
-
'float': 1,
|
|
4
|
-
'vec2': 2,
|
|
5
|
-
'vec3': 3,
|
|
6
|
-
'vec4': 4,
|
|
7
|
-
|
|
8
|
-
'int': 1,
|
|
9
|
-
'ivec2': 2,
|
|
10
|
-
'ivec3': 3,
|
|
11
|
-
'ivec4': 4,
|
|
12
|
-
|
|
13
|
-
'bool': 1,
|
|
14
|
-
'bvec2': 2,
|
|
15
|
-
'bvec3': 3,
|
|
16
|
-
'bvec4': 4,
|
|
17
|
-
|
|
18
|
-
'mat2': 4,
|
|
19
|
-
'mat3': 9,
|
|
20
|
-
'mat4': 16,
|
|
21
|
-
|
|
22
|
-
'sampler2D': 1
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* @class
|
|
27
|
-
* @memberof PIXI.glCore.shader
|
|
28
|
-
* @param type {String}
|
|
29
|
-
* @return {Number}
|
|
30
|
-
*/
|
|
31
|
-
const mapSize = function(type) {
|
|
32
|
-
return GLSL_TO_SIZE[type];
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
export {
|
|
39
|
-
mapSize
|
|
40
|
-
}
|
|
1
|
+
|
|
2
|
+
const GLSL_TO_SIZE = {
|
|
3
|
+
'float': 1,
|
|
4
|
+
'vec2': 2,
|
|
5
|
+
'vec3': 3,
|
|
6
|
+
'vec4': 4,
|
|
7
|
+
|
|
8
|
+
'int': 1,
|
|
9
|
+
'ivec2': 2,
|
|
10
|
+
'ivec3': 3,
|
|
11
|
+
'ivec4': 4,
|
|
12
|
+
|
|
13
|
+
'bool': 1,
|
|
14
|
+
'bvec2': 2,
|
|
15
|
+
'bvec3': 3,
|
|
16
|
+
'bvec4': 4,
|
|
17
|
+
|
|
18
|
+
'mat2': 4,
|
|
19
|
+
'mat3': 9,
|
|
20
|
+
'mat4': 16,
|
|
21
|
+
|
|
22
|
+
'sampler2D': 1
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @class
|
|
27
|
+
* @memberof PIXI.glCore.shader
|
|
28
|
+
* @param type {String}
|
|
29
|
+
* @return {Number}
|
|
30
|
+
*/
|
|
31
|
+
const mapSize = function(type) {
|
|
32
|
+
return GLSL_TO_SIZE[type];
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
export {
|
|
39
|
+
mapSize
|
|
40
|
+
}
|
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
var GL_TABLE = null;
|
|
3
|
-
|
|
4
|
-
const GL_TO_GLSL_TYPES = {
|
|
5
|
-
'FLOAT': 'float',
|
|
6
|
-
'FLOAT_VEC2': 'vec2',
|
|
7
|
-
'FLOAT_VEC3': 'vec3',
|
|
8
|
-
'FLOAT_VEC4': 'vec4',
|
|
9
|
-
|
|
10
|
-
'INT': 'int',
|
|
11
|
-
'INT_VEC2': 'ivec2',
|
|
12
|
-
'INT_VEC3': 'ivec3',
|
|
13
|
-
'INT_VEC4': 'ivec4',
|
|
14
|
-
|
|
15
|
-
'BOOL': 'bool',
|
|
16
|
-
'BOOL_VEC2': 'bvec2',
|
|
17
|
-
'BOOL_VEC3': 'bvec3',
|
|
18
|
-
'BOOL_VEC4': 'bvec4',
|
|
19
|
-
|
|
20
|
-
'FLOAT_MAT2': 'mat2',
|
|
21
|
-
'FLOAT_MAT3': 'mat3',
|
|
22
|
-
'FLOAT_MAT4': 'mat4',
|
|
23
|
-
|
|
24
|
-
'SAMPLER_2D': 'sampler2D'
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
const mapType = function(gl, type) {
|
|
28
|
-
if(!GL_TABLE) {
|
|
29
|
-
const typeNames = Object.keys(GL_TO_GLSL_TYPES);
|
|
30
|
-
GL_TABLE = {};
|
|
31
|
-
for(let i = 0; i < typeNames.length; ++i) {
|
|
32
|
-
const tn = typeNames[i];
|
|
33
|
-
GL_TABLE[ gl[tn] ] = GL_TO_GLSL_TYPES[tn];
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
return GL_TABLE[type];
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
export {
|
|
42
|
-
mapType
|
|
43
|
-
}
|
|
1
|
+
|
|
2
|
+
var GL_TABLE = null;
|
|
3
|
+
|
|
4
|
+
const GL_TO_GLSL_TYPES = {
|
|
5
|
+
'FLOAT': 'float',
|
|
6
|
+
'FLOAT_VEC2': 'vec2',
|
|
7
|
+
'FLOAT_VEC3': 'vec3',
|
|
8
|
+
'FLOAT_VEC4': 'vec4',
|
|
9
|
+
|
|
10
|
+
'INT': 'int',
|
|
11
|
+
'INT_VEC2': 'ivec2',
|
|
12
|
+
'INT_VEC3': 'ivec3',
|
|
13
|
+
'INT_VEC4': 'ivec4',
|
|
14
|
+
|
|
15
|
+
'BOOL': 'bool',
|
|
16
|
+
'BOOL_VEC2': 'bvec2',
|
|
17
|
+
'BOOL_VEC3': 'bvec3',
|
|
18
|
+
'BOOL_VEC4': 'bvec4',
|
|
19
|
+
|
|
20
|
+
'FLOAT_MAT2': 'mat2',
|
|
21
|
+
'FLOAT_MAT3': 'mat3',
|
|
22
|
+
'FLOAT_MAT4': 'mat4',
|
|
23
|
+
|
|
24
|
+
'SAMPLER_2D': 'sampler2D'
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const mapType = function(gl, type) {
|
|
28
|
+
if(!GL_TABLE) {
|
|
29
|
+
const typeNames = Object.keys(GL_TO_GLSL_TYPES);
|
|
30
|
+
GL_TABLE = {};
|
|
31
|
+
for(let i = 0; i < typeNames.length; ++i) {
|
|
32
|
+
const tn = typeNames[i];
|
|
33
|
+
GL_TABLE[ gl[tn] ] = GL_TO_GLSL_TYPES[tn];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return GL_TABLE[type];
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
export {
|
|
42
|
+
mapType
|
|
43
|
+
}
|
|
@@ -1,139 +1,139 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createShader
|
|
3
|
-
} from './shader.js';
|
|
4
|
-
import {
|
|
5
|
-
mapSize
|
|
6
|
-
} from './mapSize.js';
|
|
7
|
-
import {
|
|
8
|
-
mapType
|
|
9
|
-
} from './mapType.js';
|
|
10
|
-
|
|
11
|
-
// 创建程序
|
|
12
|
-
function createProgram(gl, vertexSrc, fragmentSrc) {
|
|
13
|
-
// 创建顶点着色器
|
|
14
|
-
const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexSrc);
|
|
15
|
-
// 创建片段着色器
|
|
16
|
-
const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentSrc);
|
|
17
|
-
|
|
18
|
-
const program = gl.createProgram() // 创建一个程序
|
|
19
|
-
gl.attachShader(program, vertexShader) // 添加顶点着色器
|
|
20
|
-
gl.attachShader(program, fragmentShader) // 添加片元着色器
|
|
21
|
-
gl.linkProgram(program) // 连接 program 中的着色器
|
|
22
|
-
|
|
23
|
-
// 检查程序链接状态
|
|
24
|
-
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
25
|
-
console.error('PError: Could not initialize shader.');
|
|
26
|
-
console.error('gl.VALIDATE_STATUS', gl.getProgramParameter(program, gl.VALIDATE_STATUS));
|
|
27
|
-
console.error('gl.getError()', gl.getError());
|
|
28
|
-
|
|
29
|
-
// if there is a program info log, log it
|
|
30
|
-
if (gl.getProgramInfoLog(program) !== '') {
|
|
31
|
-
console.warn('Warning: gl.getProgramInfoLog()', gl.getProgramInfoLog(program));
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
gl.deleteProgram(program);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
useProgram(gl, program);
|
|
38
|
-
|
|
39
|
-
// clean up some shaders
|
|
40
|
-
gl.deleteShader(vertexShader);
|
|
41
|
-
gl.deleteShader(fragmentShader);
|
|
42
|
-
|
|
43
|
-
const attrs = extractAttributes(gl, program);
|
|
44
|
-
const uniforms = extractUniforms(gl, program);
|
|
45
|
-
|
|
46
|
-
return {
|
|
47
|
-
program,
|
|
48
|
-
attrs,
|
|
49
|
-
uniforms
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// 采用program
|
|
54
|
-
function useProgram(gl, program) {
|
|
55
|
-
return gl.useProgram(program); // 告诉 webgl 用这个 program 进行渲染
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
function extractAttributes(gl, program) {
|
|
59
|
-
const attributes = {};
|
|
60
|
-
|
|
61
|
-
const count = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
|
|
62
|
-
|
|
63
|
-
for (let i = 0; i < count; i++){
|
|
64
|
-
const attribData = gl.getActiveAttrib(program, i);
|
|
65
|
-
const type = mapType(gl, attribData.type);
|
|
66
|
-
attributes[attribData.name] = {
|
|
67
|
-
attribData,
|
|
68
|
-
size: mapSize(type),
|
|
69
|
-
type,
|
|
70
|
-
location: gl.getAttribLocation(program, attribData.name),
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return attributes;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
function extractUniforms(gl, program) {
|
|
78
|
-
const uniforms = {};
|
|
79
|
-
|
|
80
|
-
const count = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
|
|
81
|
-
|
|
82
|
-
for (let i = 0; i < count; i++) {
|
|
83
|
-
const uniformData = gl.getActiveUniform(program, i);
|
|
84
|
-
const name = uniformData.name.replace(/\[.*?\]/, "");
|
|
85
|
-
const type = mapType(gl, uniformData.type );
|
|
86
|
-
|
|
87
|
-
uniforms[name] = {
|
|
88
|
-
uniformData,
|
|
89
|
-
type: type,
|
|
90
|
-
size: uniformData.size,
|
|
91
|
-
location: gl.getUniformLocation(program, name),
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
return uniforms;
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
// 把缓冲区的值写入变量
|
|
100
|
-
// size: 组成数量,必须是1,2,3或4. 每个单元由多少个数组成
|
|
101
|
-
// strip: 步长 数组中一行长度,0 表示数据是紧密的没有空隙,让OpenGL决定具体步长
|
|
102
|
-
// offset: 字节偏移量,必须是类型的字节长度的倍数。
|
|
103
|
-
// dataType: 每个元素的数据类型
|
|
104
|
-
function writeVertexAttrib(gl, buffer, attr, size=2, strip=0, offset=0, dataType=gl.FLOAT) {
|
|
105
|
-
gl.bindBuffer(buffer.type, buffer.buffer);
|
|
106
|
-
gl.vertexAttribPointer( // 告诉 OpenGL 如何从 Buffer 中获取数据
|
|
107
|
-
attr.location, // 顶点属性的索引
|
|
108
|
-
size, // 组成数量,必须是1,2,3或4。我们只提供了 x 和 y
|
|
109
|
-
dataType,
|
|
110
|
-
false, // 是否归一化到特定的范围,对 FLOAT 类型数据设置无效
|
|
111
|
-
strip * buffer.unitSize,
|
|
112
|
-
offset
|
|
113
|
-
);
|
|
114
|
-
gl.enableVertexAttribArray(attr.location);
|
|
115
|
-
return buffer;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
function disableVertexAttribArray(gl, attr) {
|
|
119
|
-
return gl.disableVertexAttribArray(attr.location);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
function getAttribLocation(gl, program, name) {
|
|
123
|
-
return gl.getAttribLocation(program, name);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
function getUniformLocation(gl, program, name) {
|
|
127
|
-
return gl.getUniformLocation(program, name);
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
export {
|
|
131
|
-
createProgram,
|
|
132
|
-
useProgram,
|
|
133
|
-
getAttribLocation,
|
|
134
|
-
getUniformLocation,
|
|
135
|
-
extractAttributes,
|
|
136
|
-
extractUniforms,
|
|
137
|
-
writeVertexAttrib,
|
|
138
|
-
disableVertexAttribArray
|
|
1
|
+
import {
|
|
2
|
+
createShader
|
|
3
|
+
} from './shader.js';
|
|
4
|
+
import {
|
|
5
|
+
mapSize
|
|
6
|
+
} from './mapSize.js';
|
|
7
|
+
import {
|
|
8
|
+
mapType
|
|
9
|
+
} from './mapType.js';
|
|
10
|
+
|
|
11
|
+
// 创建程序
|
|
12
|
+
function createProgram(gl, vertexSrc, fragmentSrc) {
|
|
13
|
+
// 创建顶点着色器
|
|
14
|
+
const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexSrc);
|
|
15
|
+
// 创建片段着色器
|
|
16
|
+
const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentSrc);
|
|
17
|
+
|
|
18
|
+
const program = gl.createProgram() // 创建一个程序
|
|
19
|
+
gl.attachShader(program, vertexShader) // 添加顶点着色器
|
|
20
|
+
gl.attachShader(program, fragmentShader) // 添加片元着色器
|
|
21
|
+
gl.linkProgram(program) // 连接 program 中的着色器
|
|
22
|
+
|
|
23
|
+
// 检查程序链接状态
|
|
24
|
+
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
25
|
+
console.error('PError: Could not initialize shader.');
|
|
26
|
+
console.error('gl.VALIDATE_STATUS', gl.getProgramParameter(program, gl.VALIDATE_STATUS));
|
|
27
|
+
console.error('gl.getError()', gl.getError());
|
|
28
|
+
|
|
29
|
+
// if there is a program info log, log it
|
|
30
|
+
if (gl.getProgramInfoLog(program) !== '') {
|
|
31
|
+
console.warn('Warning: gl.getProgramInfoLog()', gl.getProgramInfoLog(program));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
gl.deleteProgram(program);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
useProgram(gl, program);
|
|
38
|
+
|
|
39
|
+
// clean up some shaders
|
|
40
|
+
gl.deleteShader(vertexShader);
|
|
41
|
+
gl.deleteShader(fragmentShader);
|
|
42
|
+
|
|
43
|
+
const attrs = extractAttributes(gl, program);
|
|
44
|
+
const uniforms = extractUniforms(gl, program);
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
program,
|
|
48
|
+
attrs,
|
|
49
|
+
uniforms
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// 采用program
|
|
54
|
+
function useProgram(gl, program) {
|
|
55
|
+
return gl.useProgram(program); // 告诉 webgl 用这个 program 进行渲染
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function extractAttributes(gl, program) {
|
|
59
|
+
const attributes = {};
|
|
60
|
+
|
|
61
|
+
const count = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
|
|
62
|
+
|
|
63
|
+
for (let i = 0; i < count; i++){
|
|
64
|
+
const attribData = gl.getActiveAttrib(program, i);
|
|
65
|
+
const type = mapType(gl, attribData.type);
|
|
66
|
+
attributes[attribData.name] = {
|
|
67
|
+
attribData,
|
|
68
|
+
size: mapSize(type),
|
|
69
|
+
type,
|
|
70
|
+
location: gl.getAttribLocation(program, attribData.name),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return attributes;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function extractUniforms(gl, program) {
|
|
78
|
+
const uniforms = {};
|
|
79
|
+
|
|
80
|
+
const count = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
|
|
81
|
+
|
|
82
|
+
for (let i = 0; i < count; i++) {
|
|
83
|
+
const uniformData = gl.getActiveUniform(program, i);
|
|
84
|
+
const name = uniformData.name.replace(/\[.*?\]/, "");
|
|
85
|
+
const type = mapType(gl, uniformData.type );
|
|
86
|
+
|
|
87
|
+
uniforms[name] = {
|
|
88
|
+
uniformData,
|
|
89
|
+
type: type,
|
|
90
|
+
size: uniformData.size,
|
|
91
|
+
location: gl.getUniformLocation(program, name),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return uniforms;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
// 把缓冲区的值写入变量
|
|
100
|
+
// size: 组成数量,必须是1,2,3或4. 每个单元由多少个数组成
|
|
101
|
+
// strip: 步长 数组中一行长度,0 表示数据是紧密的没有空隙,让OpenGL决定具体步长
|
|
102
|
+
// offset: 字节偏移量,必须是类型的字节长度的倍数。
|
|
103
|
+
// dataType: 每个元素的数据类型
|
|
104
|
+
function writeVertexAttrib(gl, buffer, attr, size=2, strip=0, offset=0, dataType=gl.FLOAT) {
|
|
105
|
+
gl.bindBuffer(buffer.type, buffer.buffer);
|
|
106
|
+
gl.vertexAttribPointer( // 告诉 OpenGL 如何从 Buffer 中获取数据
|
|
107
|
+
attr.location, // 顶点属性的索引
|
|
108
|
+
size, // 组成数量,必须是1,2,3或4。我们只提供了 x 和 y
|
|
109
|
+
dataType,
|
|
110
|
+
false, // 是否归一化到特定的范围,对 FLOAT 类型数据设置无效
|
|
111
|
+
strip * buffer.unitSize,
|
|
112
|
+
offset
|
|
113
|
+
);
|
|
114
|
+
gl.enableVertexAttribArray(attr.location);
|
|
115
|
+
return buffer;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function disableVertexAttribArray(gl, attr) {
|
|
119
|
+
return gl.disableVertexAttribArray(attr.location);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function getAttribLocation(gl, program, name) {
|
|
123
|
+
return gl.getAttribLocation(program, name);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function getUniformLocation(gl, program, name) {
|
|
127
|
+
return gl.getUniformLocation(program, name);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export {
|
|
131
|
+
createProgram,
|
|
132
|
+
useProgram,
|
|
133
|
+
getAttribLocation,
|
|
134
|
+
getUniformLocation,
|
|
135
|
+
extractAttributes,
|
|
136
|
+
extractUniforms,
|
|
137
|
+
writeVertexAttrib,
|
|
138
|
+
disableVertexAttribArray
|
|
139
139
|
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
// 生成着色器
|
|
2
|
-
// type: gl.VERTEX_SHADER 顶点着色器 , gl.FRAGMENT_SHADER 片段着色器
|
|
3
|
-
// src: 着色器代码
|
|
4
|
-
function createShader(gl, type, src) {
|
|
5
|
-
const shader = gl.createShader(type) // 创建一个顶点着色器
|
|
6
|
-
gl.shaderSource(shader, src); // 编写顶点着色器代码
|
|
7
|
-
gl.compileShader(shader); // 编译着色器
|
|
8
|
-
|
|
9
|
-
return shader;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export {
|
|
13
|
-
createShader
|
|
1
|
+
// 生成着色器
|
|
2
|
+
// type: gl.VERTEX_SHADER 顶点着色器 , gl.FRAGMENT_SHADER 片段着色器
|
|
3
|
+
// src: 着色器代码
|
|
4
|
+
function createShader(gl, type, src) {
|
|
5
|
+
const shader = gl.createShader(type) // 创建一个顶点着色器
|
|
6
|
+
gl.shaderSource(shader, src); // 编写顶点着色器代码
|
|
7
|
+
gl.compileShader(shader); // 编译着色器
|
|
8
|
+
|
|
9
|
+
return shader;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export {
|
|
13
|
+
createShader
|
|
14
14
|
}
|