Skip to content

一、WebGl基础

1.什么是webgl

webgl是一种3D绘图协议**,**衍生于 OpenGL ES2.0,可以结合 Html5 和 JavaScript 在网页上绘制和渲染二/三维图形。

2.webgl的用途

可以用做数据可视化、图形/游戏引擎、VR、物品3d展示、地图等等...

3.与canvas api的区别

同样是使用canvas.getContext()获取绘制对象

  • canvas api绘制的是2D内容,主要通过CanvasRenderingContext2D接口来完成
  • webgl绘制的是3D内容,主要通过WebGLRenderingContext接口来完成
js
const canvas=document.querySelector('canvas')
// canvas api传入参数为 "2d"
const ctx=canvas.getContext('2d')
// webgl传入参数为 "webgl"
const gl=canvas.getContext('webgl')

4.基础语法

html
<html>
    <canvas width="800" height="500"></canvas>
</html>

<script>
    const canvas=document.querySelector('canvas')
	// 获取webgl绘制上下文
    const gl=canvas.getContext('webgl')
    
    // 指定将要用来清空绘图区的颜色
    gl.clearColor(0,0,0,1)  	// 参数为r,g,b,a
    // 使用之前指定的颜色,清空绘图区
    gl.clear(gl.COLOR_BUFFER_BIT)
</script>

5.清空缓冲

5.1 clearColor()

5.1.1 作用

指定将要用来清空绘图区的颜色,也就是给canvas设置背景色

5.1.2 语法

js
void gl.clearColor(red, green, blue, alpha);

5.1.3 参数

以下参数都为0.0-1.0的数字,默认值为0

  • red:红色值
  • green:绿色值
  • blue:蓝色值
  • alpha:透明度

要获取当前的清除颜色,传入 COLOR_CLEAR_VALUE 常量,返回 Float32Array

js
gl.getParameter(gl.COLOR_CLEAR_VALUE); // Float32Array[1, 0.5, 0.5, 1]

5.2 clearDepth()

5.2.1 作用

用于设置深度缓冲区的深度清除值

5.2.2 语法

js
void gl.clearDepth(depth);

5.2.3 参数

  • depth:当清除深度缓冲区的时候使用。范围在0.0-1.0,默认值为 1。

若要获取当前深度清除值,查询DEPTH_CLEAR_VALUE 常量。

js
gl.getParameter(gl.DEPTH_CLEAR_VALUE); // 0.5

5.3 clearStencil()

5.3.1 作用

指定了 模板缓冲区

5.3.2 语法

js
clearStencil(s)

5.3.3 参数

  • s:一个 GLint,指定清除模具缓冲区时使用的索引。 默认值:0。范围在0.0-1.0

若要获取当前模具清除值,请查询常量。STENCIL_CLEAR_VALUE

js
gl.getParameter(gl.STENCIL_CLEAR_VALUE); // 1

5.4 clear()

5.4.1 作用

使用预设值来清空缓冲

5.4.2 语法

js
void gl.clear(mask);

5.4.3 参数

mask:一个用于指定需要清除的缓冲区的 GLbitfield (en-US) 。可能的值有:

  • gl.COLOR_BUFFER_BIT //颜色缓冲区
  • gl.DEPTH_BUFFER_BIT //深度缓冲区
  • gl.STENCIL_BUFFER_BIT //模板缓冲区

clear() 方法可接受复合值

js
gl.clear(gl.DEPTH_BUFFER_BIT);
gl.clear(gl.DEPTH_BUFFER_BIT | gl.COLOR_BUFFER_BIT);

要获得当前的清除值,传入 COLOR_CLEAR_VALUEDEPTH_CLEAR_VALUESTENCIL_CLEAR_VALUE 常量。

gl.getParameter(gl.COLOR_CLEAR_VALUE);
gl.getParameter(gl.DEPTH_CLEAR_VALUE);
gl.getParameter(gl.STENCIL_CLEAR_VALUE);

MIT Licensed