该原创文章首发于微信公众号:字节流动
如何传输一个超大数组给着色器程序?
在 OpenGL ES 图形图像处理中,会经常遇到一种情况:将一个超大的数组传给着色器程序。
目前常用的有三种方式:
- 使用将数组加载到 2D 纹理的方式,然后使用 texelFetch 取数据;
- 使用 uniform 缓冲区对象,即 UBO ;
- 使用纹理缓冲区对象,即 TBO 。
将数组加载到纹理
使用将数组加载到纹理的方式来传输大数组,是最容易想到的一种方式。
要想精确地换取每个像素的值,这个时候就不能使用采样函数 texture ,因为采样函数会涉及归一化、过滤以及插值等复杂操作,基本无法得到某一确切像素的值。
这个时候就需要使用纹素获取函数 texlFetch ,texlFetch 是 OpenGL ES 3.0 引入的 API ,它将纹理视为图像,可以精确访问像素的内容,我们可以类比通过索引来获取数组某个元素的值。
vec4