text: /**
   * 缓冲区核心方法
   * --------------------------------------------
   * 缓冲区分为两种：
   *  1.缓冲区中保存了包含顶点的数据
   *  2.缓冲区保存了包含顶点的索引值
   *
   */
  
  // 获取一个新的缓冲区
  // isElement默认false，创建第一种缓冲区，为true创建第二种
  export let newBuffer = function (gl, isElement) {
      let buffer = gl.createBuffer(),
          TYPE = isElement ? gl.ELEMENT_ARRAY_BUFFER : gl.ARRAY_BUFFER;
      // 把缓冲区对象绑定到目标
      gl.bindBuffer(TYPE, buffer);
      return buffer;
  };
  
  // 数据写入缓冲区
  // data是一个类型化数组，表示写入的数据
  // usage表示程序如何使用存储在缓冲区的数据
  export let writeBuffer = function (gl, data, usage, isElement) {
      let TYPE = isElement ? gl.ELEMENT_ARRAY_BUFFER : gl.ARRAY_BUFFER;
      gl.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]区间
  export let useBuffer = function (gl, location, size, type, stride, offset, normalized) {
      // 把缓冲区对象分配给目标变量
      gl.vertexAttribPointer(location, size, type, normalized || false, stride || 0, offset || 0);
      // 连接目标对象和缓冲区对象
      gl.enableVertexAttribArray(location);
  };
  