WebGL

webgl 是针对 canvas 的 3D上下文,与其它Web技术不同,WebGL并非是W3C制定的标准,而是由 Khronos Group 制定的。

类型化数组

WebGL所涉及的复杂运算需要提前知道数值的精度,但是标准的 JS 无法支持这一诉求。

因此WebGL引入了类型化数组这一概念,类型化数组也是数组,与一般的数组没有什么区别,只不过这种数组中所有元素的值都被指定为某一特定类型。

类型化数组的核心在于 ArrayBuffer 这一数据类型,每个 ArrayBuffer 对象表示内存中的指定字节数,相当于分配一个指定大小的内存供你使用。

通过 ArrayBuffer 的 byteLength 属性可以获取该对象的字节数。

然而要操作 ArrayBuffer 则需要使用 DataView(视图)。

DataView 视图是一个可以从 ArrayBuffer 对象中读写多种数值类型的底层接口,使用它时,不用考虑不同平台的字节序问题。(摘自MDN)

创建视图可以使用以下方式:

// 基于整个 ArrayBuffer 创建视图
let view = new DataView(buffer); // 创建一个从 ArrayBuffer 第九个字节开始的视图
let view = new DataView(buffer, 9); // 创建一个 ArrayBuffer 9~18字节的视图
let view = new DataView(buffer, 9, 10);

实例化的 DataView 会将字节偏移量以及字节长度信息分别保存在 byteOffset、byteLength 属性中。

通过 buffer 属性则可以获得原本的 ArrayBuffer。

数据类型 getter setter
有符号8位整数 getInt8(byteOffset) setInt8(byteOffset,value)
无符号8位整数 getUint8(byteOffset) setUint8(byteOffset,value)
有符号16位整数 getInt16(byteOffset,littleEndian) setInt16(byteOffset,value,littleEndian)
无符号16位整数 getUint16(byteOffset,littleEndian) setUint16(byteOffset,value,littleEndian)
有符号32位整数 getInt32(byteOffset,littleEndian) setInt32(byteOffset,value,littleEndian)
无符号32位整数 getUint32(byteOffset,littleEndian) setUint32(byteOffset,value,littleEndian)
32位浮点数 getFloat32(byteOffset,littleEndian) setFloat32(byteOffset,value,littleEndian)
64位浮点数 getFloat64(byteOffset,littleEndian) setFloat64(byteOffset,value,littleEndian)

上方表格中的方法函数的第一个参数都是字节的偏移量,表示从哪一个字节开始读取或者写入.

代码如下:

let buffer = new ArrayBuffer(20),
view = new DataView(buffer),
value; view.setUint16(0,25);
view.setUint16(2,50);// 不能从字节1 开始,因为16位整数需要使用两个字节
value = view.getInt16(0);

所以在使用DataView时需要自己把握这些细节

如果不注意就很容易出现错误,如下所示

let buffer = new ArrayBuffer(20),
view = new DataView(buffer),
value; view.setUint16(0,25);
alert(view.getUint8(0));// 0 因为16位表示的25前8位全为0

此外用于读写16位或更大数值的方法都有一个参数 littleEndian 该参数是一个布尔值

用于表示数值读写时是否采用小端字节序(即数据最低有效位保存在低字节位的地址中)

默认是 大端字节序,即该值为 false

Javascript高级编程学习笔记(95)—— WebGL(1) 类型化数组的更多相关文章

  1. Javascript高级编程学习笔记(97)—— WebGL(3) WebGL上下文(1)

    WebGL上下文 在支持WebGL的浏览器中,WebGL的名字为 "experimental-webgl",这是由于 webgl 的规范仍未制定完成 制定完成后名字就会改为简单的 ...

  2. Javascript高级编程学习笔记(96)—— WebGL(2) 类型化视图

    类型化视图 类型化视图一般也被认为是一种类型化数组. 因为其元素必须是某种特定的数据类型,类型化视图都继承自 Dataview Int8Array: 表示8位二补整数(即二进制补数) Uint8Arr ...

  3. Javascript高级编程学习笔记(99)—— WebGL(5) 绘图

    绘图 WebGL只能绘制三种形状: 点 线 三角 其它的形状都是由上面的三种形状合成之后绘制到三维空间中的 执行绘图操作 WebGL 提供了两种方法: gl.drawElements() gl.dra ...

  4. Javascript高级编程学习笔记(98)—— WebGL(4) WebGL上下文(2)

    错误 Javascript与WebGL之间的一个最大区别在于,WebGL的操作一般不会抛出错误 如果希望获取WebGL的错误信息,那么就需要手动调用  gl.getError() 方法 该方法会返回以 ...

  5. Javascript高级编程学习笔记(3)—— JS中的数据类型(1)

    前一段时间由于事情比较多,所以笔记耽搁了一段时间,从这一篇开始我会尽快写完这个系列. 文章中有什么不足之处,还望各位大佬指出. JS中的数据类型 上一篇中我写了有关JS引入的Script标签相关的东西 ...

  6. JavaScript高级编程学习笔记(第三章之一)

    继续记笔记,JavaScript越来越有意思了. 继续... 第三章:JavaScript基础 ECMAScript语法在很大程度上借鉴了C和其它类似于C的语言,比如Java和Perl. 大小写敏感: ...

  7. Javascript高级编程学习笔记(1)—— JS简介

    此系列文章,用于记录所学,如有错误欢迎指出. Javascript组成 1.核心(ECMAScript) 2.文档对象模型(DOM) 3.浏览器对象模型(BOM) 1.核心(ECMAScript) E ...

  8. Javascript高级编程学习笔记(57)—— 事件(1)事件流

    事件 JS与HTML的交互是通过事件实现的 而事件指的就是:文档或浏览器窗口特定的交互瞬间 可以通过侦听器来预定事件,以便在事件发生时执行相应的代码 这种模式也是设计模式中的观察者模式 事件流 有了事 ...

  9. Javascript高级编程学习笔记(84)—— Canvas(1)基本用法

    Canvas绘图 Canvas自HTML5引入后,由于其炫酷的效果成为HTML5新增功能中最受欢迎的部分 Canvas元素通过在页面中设定一个区域,然后就可以使用JS在其中绘制图形 <canva ...

随机推荐

  1. web优化(二)

    上次说到js的阻塞dom渲染可能出现的白屏现象,所以对于js我们需要一些优化.首先我们可以模仿通信中的时分的概念,使用 setTime()来执行一段js代码然后渲染页面然后再执行一段js代码,这样可以 ...

  2. 常见js特效的思路

    1.焦点轮播路 1.布局:父容器用overflow:hidden隐藏多余的图片 2:通过ID获取到重要的元素(父容器.图片列表.左右切换按钮等) 给左右按钮加上点击事件,通过JS更新图片的位置,判断边 ...

  3. [爬虫]BeautifulSoup4

    1.Beautiful Soup的简介 Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.python式的函 ...

  4. linux.go

    func LockFile(file *os.File) error { return syscall.Flock(int(file.Fd()), syscall.LOCK_EX) }

  5. bzoj5252 [2018多省省队联测]林克卡特树

    斜率优化树形dp?? 我们先将问题转化成在树上选K+1条互不相交路径,使其权值和最大. 然后我们考虑60分的dp,直接维护每个点子树内选了几条路径,然后该点和0/1/2条路径相连 然后我们会发现最后的 ...

  6. BZOJ_4004_[JLOI2015]装备购买_线性基

    BZOJ_4004_[JLOI2015]装备购买_线性基 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) ...

  7. SpringBoot(二)_项目属性配置

    修改端口 在main/resources/application.properties修改端口 server.port=8088 此时启动访问localhost:8088/hello 就会看到 Hel ...

  8. C++教程之初识编程

    突然想写一份C++教程,并且此教程会尽量使用通俗语言来描述,进入正题! 如果你从来没有接触过编程语言,希望我的教程能够帮助你! 一.代码示例 ​ 当然我希望你暂时不要纠结我在写什么,把代码贴在前面是想 ...

  9. 集群IPtables转发与防火墙

    子网集群通过接入公网的服务器Iptables转发上网 1. 对iptables进行初始化工作 清空filter表 iptables -F 清空nat表 iptables -t nat -F 默认禁止所 ...

  10. 从壹开始前后端分离 41 || Nginx+Github+PM2 快速部署项目(一)

    前言 哈喽大家周一好!今天是农历腊月二十三,小年开始,恭祝大家新年快乐(哈哈你五福了么