Skip to content

Commit 90b0c2e

Browse files
authored
Update index.md
1 parent 7493571 commit 90b0c2e

File tree

1 file changed

+168
-0
lines changed

1 file changed

+168
-0
lines changed

docs/WebGL/index.md

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,3 +314,171 @@ attribute变量传输的是那些与顶点相关的数据,uniform变量传输
314314

315315

316316
![效果图](./images/17.34.42.png)
317+
318+
319+
- uniform变量
320+
321+
>`javascript`中向顶点着色器的`attribute`变量传数据。 只有顶点着色器才能使用`attribute`变量,使用片元着色器时,就需要使用`uniform`变量。或者
322+
使用`varying`变量。
323+
324+
`uniform`变量用来从`javascript`程序向顶点着色器和片元着色器传输”一致的“(不变的)数据。
325+
326+
327+
```js
328+
var VSHADER_SOURCE =
329+
'attribute vec4 a_Position;\n' +
330+
'attribute float a_PointSize;\n' +
331+
'void main() {\n' +
332+
'gl_Position = a_Position;\n' +
333+
'gl_PointSize = a_PointSize;\n' +
334+
'}\n'
335+
var FSHADER_SOURCE =
336+
'precision mediump float;\n' +
337+
'uniform vec4 u_FragColor;\n' +
338+
' void main() {\n'+
339+
'gl_FragColor = u_FragColor;\n'+
340+
'}\n'
341+
342+
343+
function main() {
344+
var canvas = document.getElementById('webgl')
345+
var gl = getWebGLContext(canvas)
346+
if(!gl) {
347+
console.error('Failed to get the rendering context for WebGL')
348+
return;
349+
}
350+
351+
// 初始化着色器
352+
if(!initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)) {
353+
console.error('Failed to initialize shaders.')
354+
return;
355+
}
356+
// 获取attribut变量的存储位置
357+
var a_Position = gl.getAttribLocation(gl.program, 'a_Position')
358+
359+
if(a_Position < 0) {
360+
console.error('Failed to get the storage location of a_Position')
361+
return;
362+
}
363+
var a_PointSize = gl.getAttribLocation(gl.program, 'a_PointSize')
364+
365+
var u_FragColor = gl.getUniformLocation(gl.program, 'u_FragColor')
366+
367+
gl.vertexAttrib3f(a_Position, 0.0, 0.0, 0.0)
368+
369+
gl.vertexAttrib1f(a_PointSize, 20.0)
370+
371+
canvas.onmousedown = function(event) {click(event, gl ,canvas, a_Position, u_FragColor)}
372+
373+
// 设置canvas背景色
374+
gl.clearColor(0.0,0.0,0.0,1.0)
375+
376+
// 清空canvas
377+
gl.clear(gl.COLOR_BUFFER_BIT);
378+
379+
// 绘制一个点
380+
gl.drawArrays(gl.POINTS, 0, 1)
381+
}
382+
383+
var g_points = []
384+
var g_colors = []
385+
function click(event, gl ,canvas, a_Position, u_FragColor) {
386+
var x = event.clientX
387+
var y = event.clientY
388+
var rect = event.target.getBoundingClientRect()
389+
x = ((x - rect.left) - canvas.height/2) / (canvas.height/2);
390+
y = (canvas.width/2 - (y - rect.top)) / (canvas.width/2);
391+
392+
g_points.push([x,y]);
393+
394+
if(x >= 0.0 && y >= 0.0) {
395+
g_colors.push([1.0, 0.0, 0.0, 1.0])
396+
} else if(x < 0.0 && y < 0.0) {
397+
g_colors.push([0.0, 1.0, 0.0, 1.0])
398+
}else {
399+
g_colors.push([1.0, 1.0, 1.0, 1.0])
400+
}
401+
402+
gl.clear(gl.COLOR_BUFFER_BIT); // 绘制点后,颜色缓冲区就被WebGL重置为默认的颜色(0.0, 0.0, 0.0, 0.0)
403+
var len = g_points.length;
404+
for(var j = 0; j < len; j++) {
405+
var xy = g_points[j];
406+
var rgba = g_colors[j];
407+
gl.vertexAttrib3f(a_Position, xy[0], xy[1], 0.0);
408+
409+
gl.uniform4f(u_FragColor, rgba[0], rgba[1], rgba[2], rgba[3] );
410+
gl.drawArrays(gl.POINTS, 0, 1)
411+
}
412+
}
413+
414+
```
415+
416+
![效果图](./images/172631.png)
417+
418+
419+
**精度限定词 (precision qualifier)** 指定变量的范围(最大值与最小值)和精度
420+
421+
1. 获取`uniform`变量的存储地址
422+
423+
**gl.getUniformLocation(program, name)**
424+
425+
| 参数 | 描述 |
426+
|-------------------|-------------------------------------|
427+
| program | 指定包含顶点着色器和片元着色器的程序对象 |
428+
| name | 指定想要获取其存储位置的uniform变量的名称 |
429+
430+
| 返回值 | 描述 |
431+
|-----------|-------------------------------------|
432+
| non-null | 指定uniform变量的位置 |
433+
| null | 指定的uniform变量不存在,或者其命名具有gl_或webgl_前缀 |
434+
435+
| 错误 | 描述 |
436+
|--------------------|-------------------------------------|
437+
| INVALID_OPERATION | 程序对象未能成功连接 |
438+
| INVALID_VALUE | name参数的长度大于uniform变量名的最大长度(默认256字节) |
439+
440+
2. 向uniform变量赋值
441+
442+
**gl.uniform4f(location, v0, v1, v2, v3)**
443+
444+
| 参数 | 描述 |
445+
|----------|-----------------------|
446+
| location | 指定将要修改的uniform变量的存储位置 |
447+
| v0 | 指定填充uniform变量的第一个分量的值 |
448+
| v1 | 指定填充uniform变量的第二个分量的值 |
449+
| v2 | 指定填充uniform变量的第三个分量的值 |
450+
| v3 | 指定填充uniform变量的第四个分量的值 |
451+
| 返回值 ||
452+
453+
| 错误 | 描述 |
454+
|--------------------|------------------------------------|
455+
| INVALID_OPERATION | 没有当前program对象,或者location是非法的变量存储位置 |
456+
457+
458+
### `gl.uniform4f()同族函数`
459+
460+
`gl.uniform1f(location, v0)`
461+
462+
`gl.uniform1f(location, v0, v1)`
463+
464+
`gl.uniform1f(location, v0, v1, v2)`
465+
466+
`gl.uniform1f(location, v0, v1, v2, v3)`
467+
468+
| 参数 | 描述 |
469+
|----------------|----------------------|
470+
| location | 指定uniform变量的存储位置 |
471+
| v0, v1, v2, v3 | 指定传输给uniform变量四个分量的值 |
472+
| 返回值 ||
473+
474+
| 错误 | 描述 |
475+
|-------------------|------------------------------------|
476+
| INVALID_OPERATION | 没有当前program对象,或者location是非法的变量存储位置 |
477+
478+
479+
480+
481+
**主要介绍了着色器的相关知识,它是WebGL绘制图像的基石。这里的着色器只能处理二维的点,但是WebGL核心函数以及着色器的知识,同样使用于更复杂的情形,如三维绘图。**
482+
483+
**顶点着色器进行的是逐顶点的操作,片元着色器进行的是逐片元的操作**
484+

0 commit comments

Comments
 (0)