这个算属于 WebGL 进阶吧, 因为这个属于优化, 运行效率, 如果你不了解 WebGL 的基本知识,你可以到这里先学习基础知识.
我会在下面放上几个比较好的学习链接.
涉及到的知识点如下
- 编程里面的位运算 中的(&)这个符号的运算法则
- WebGL vertexAttribPointer 这个接口中的 normalized 到底是怎么做的归一化
- 给 WebGL 传递一个值 为什么我们能拿到四个值(用于优化每次传递数据的尺寸)
如果先了解写这篇文章的意图话可以直接跳转到意图开始看. 啊哈
意图
在看一些引擎源码的时候总是在给 GUP 传递颜色的时候会看类似下面这样的代码. 下面我写一个伪代码.
1 | // 着色器伪代码 |
我只会解释 在代码后面 带 😄😄😄 这个标识的代码.我相信其他的代码,聪明的你自己看懂这个看随意😄.
总会出现,在传递的颜色的时候,使用 Uint32Array
这种类型,其他的依旧是 Float32Array
, 而且乍一看,还带了一堆位运算.
普通人表示看不懂. 有点强,这个三行代码.
于是乎这篇文章诞生了.
解决疑惑
首先你要做的就是,自己变成电脑,去执行代码.
那一堆位运算到底做了啥
&
这个运算符 就是
1 | 1 & 1 => 1 |
(a.tint >> 16) + (a.tint & 0xff00) + ((a.tint & 0xff) << 16) + (a.alpha * 255 << 24)
它既然是位运算,那我们就把他转成二进制看,毕竟自己依然是电脑了,这个才是你的母语.

好经过上面的推算得出最终的结果了. 就是 11111111 00000000 11111111 00000000
有Uint32Array 处理一下我的数据
因为的数据可能是负数 这个是不行的.
1 | uint32Array[5] = b; 😄😄😄 |
一个负数就变成正数了.
至于他是怎么变的, 你可以找度娘 问她 编程里的大小端是什么东西.
指定这些数据怎么用
1 | // void gl.vertexAttribPointer(index, size, type, normalized, stride, offset); |
解释上面的句子就是 ==> 我是以 无符号字节(unsigned byte) 传递 并给我传递这些数据归一化, 而且我的尺寸是4 那就说明你要给我传递的这个数字给我分割成 4个数字.
好我们就执行这行代码.
在传递给 GUP 的时候他到底做了啥, 我这个做一个 伪代码 模拟一下.
1 | 传递给 GPU 11111111 00000000 11111111 00000000 ===> 对应的十进制是 255 0 255 0 |
传递给着色器
1 | attribute vec4 a_tint; 😄😄😄 |
这个里 上一步输出的 数据类型简直就是
学习链接
这个里我给 能有幸看到这片文章的人 推送几个比较有价值的 学习网站吧. 这些都写的不错.
如果你感觉上面那个([WebGL(MDN)中文版)比较的简单,你可以浏览这个教程网站写的也很不错.
但是要注意这个都是入门教程,这个东西不足以支撑你写高效率的框架.
实践出真知,只有多磨多练才是硬道理.
有问题 QQ 讨论.
ヾ( ̄▽ ̄)Bye~Bye~