UNPKG

vislite

Version:

灵活、快速、简单的数据可视化交互式跨端前端库

80 lines (66 loc) 3.07 kB
// 缓冲区分为两种: // 1.缓冲区中保存了包含顶点的数据 // 2.缓冲区保存了包含顶点的索引值 // 获取一个新的缓冲区 // isElement默认false,创建第一种缓冲区,为true创建第二种 const newBuffer = (painter: WebGLRenderingContext) => { return painter.createBuffer() } // 数据写入缓冲区 // data是一个类型化数组,表示写入的数据 // usage表示程序如何使用存储在缓冲区的数据 const writeBuffer = (painter: WebGLRenderingContext, data: ArrayBuffer, isElement: boolean, usage: number) => { const TYPE = isElement ? painter.ELEMENT_ARRAY_BUFFER : painter.ARRAY_BUFFER painter.bufferData(TYPE, data, usage) } // 使用缓冲区数据 // location指定待分配的attribute变量的存储位置 // size每个分量个数 // type数据类型,应该是以下的某个: // gl.UNSIGNED_BYTE Uint8Array // gl.SHORT Int16Array // gl.UNSIGNED_SHORT Uint16Array // gl.INT Int32Array // gl.UNSIGNED_INT Uint32Array // gl.FLOAT Float32Array // stride相邻两个数据项的字节数 // offset数据的起点字节位置 // normalized是否把非浮点型的数据归一化到[0,1]或[-1,1]区间 const useBuffer = (painter: WebGLRenderingContext, location: number, size: number, type: number, stride: number, offset: number, normalized: boolean) => { // 把缓冲区对象分配给目标变量 painter.vertexAttribPointer(location, size, type, normalized, stride, offset) // 连接目标对象和缓冲区对象 painter.enableVertexAttribArray(location) } class BufferObject { private __painter: WebGLRenderingContext private __isElement: boolean private __buffer: WebGLBuffer private __type: number private __fsize: number constructor(painter: WebGLRenderingContext, isElement: boolean = false) { this.__painter = painter this.__isElement = isElement this.__buffer = newBuffer(painter) as WebGLBuffer this.__type = isElement ? painter.ELEMENT_ARRAY_BUFFER : painter.ARRAY_BUFFER } // 使用这个缓冲区对象 // (先于写入和分配) use() { this.__painter.bindBuffer(this.__type, this.__buffer) // 绑定到目标 return this } // 写入数据 write(data: Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array) { writeBuffer(this.__painter, data, this.__isElement, this.__painter.STATIC_DRAW) this.__fsize = data.BYTES_PER_ELEMENT return this } // 分配使用 // 第2~4位参数分别表示:一个完整数据的长度、一组数据的长度、读取位置偏移 divide(location: number, size: number, stride: number, offset: number = 0) { useBuffer(this.__painter, location, size, this.__painter.FLOAT, stride * this.__fsize, offset * this.__fsize, false) return this } } export default BufferObject