@@ -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