WebGL只能绘制三种形状: 数组
其它的形状都是由上面的三种形状合成以后绘制到三维空间中的spa
执行绘图操做 WebGL 提供了两种方法:code
这两个方法的第一个参数都是一个常量orm
常量的取值范围以下:blog
此外,gl.drawElement() 还接收两个参数索引
例如绘制三角形能够使用如下代码事件
// 已经完成了使用着色器清理窗口等初始化操做,具体操做参考前面的文章 // 定义三个顶点的坐标 let vertices = new Float32Array([0,1,1,-1,-1,-1]), buffer = gl.createBuffer(), vertexSetSize = 2, vertexSetCount = vertices.length/vertexSetSize, uColor, aVertexPosition; // 将数据放到缓冲区 gl.bindBuffer(gl.ARRAY_BUFFER, buffer); gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW); // 为片断着色器传入颜色值 uColor = gl.getUniformLocation(program, "uColor"); gl.uniform4fv(uColor, [0, 0, 0, 1]); // 为着色器传入顶点信息 aVertexPosition = gl.getAttribLocation(program, "aVertexPosition"); gl.enableVertexAttribArray(aVertexPosition); gl.vertexAttribPointer(aVertexPosition, vertexSetSize, gl.FLOAT, false, 0, 0); // 绘制 gl.drawArrays(gl.TRIANGLES, 0, vertexSetCount);
WebGL 的纹理能够使用DOM中的图像,建立纹理须要调用 gl.createTexture()get
图像加载完成前,纹理不会初始化,因此最好在load事件后设置纹理it
let image = new Image(), texture; image.src = "smile.gif"; image.onload = function(){ texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D,texture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA, gl.UNSIGNED_BYTE, image); gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.NEAREST); // 清除纹理 gl.bindTexture(gl.TEXTURE_2D,null); }
WebGL读取像素须要使用 readPixels()io
参数:
示例:
let pixels = new Uint8Array(25*25); gl.readPixels(0, 0, 25, 25, gl.RGBA, gl.UNSIGNED_BYTE, pixels);