这是Opengl ES入门系列的第17篇博文啦...
今天的内容比较简单,给大家介绍一下纹理数组,它是OpenGL ES 3.0引入的一个新特性,它能让我们以数组的方式往shader中传递纹理。
2D纹理数组是OpenGL ES 3.0开始支持的纹理类型。通过使用2D纹理数组,在同一个着色器中使用多个2D纹理的情况下可以简化开发。试想一下,如果没有2D纹理数组技术,当一个着色器中需要使用多个2D纹理时就需要声明多个采样器变量,而如果使用2D纹理数组则同样的功能只需声明一个sampler2DArray类型的变量即可,方便高效,而且扩展性更强。
如果是单单使用2D纹理的话,一旦着色器程序确定了,那么内部可使用的纹理个数就确定了,而如果使用2D纹理数组的话,即使着色器程序确定了,我们依然可以按照不同的需求使用不同个数的纹理,这就大大提高了我们编程的灵活性。
2D纹理数组的使用
2D纹理数组的使用和普通的纹理贴图步骤差不多,只是普通纹理使用绑定的是,而2D纹理数组绑定的类型是,同时2D纹理数组分配纹理空间时需要使用函数而不是。
另外在使用2D纹理数组进行采样时,需要提供的纹理坐标有3个分量也就是,前两个与普通2D纹理坐标含义相同,为S、T分量,第三个分量则为2D纹理数组中的索引。
下面是一个简单的使用2D纹理数组的片元着色器:
可以看到纹理坐标使用的是三个分量变量,而且需要声明精度类型。
以下是使用纹理数组绘制两张不同的图片的一个demo源码实例:
运行结果显示:
注意事项
查阅相关资料解说使用2D纹理数组时,一般会使数组中的纹理保持相同的尺寸。
但是笔者在某些机型上实测发现只要加载的纹理大小不要超过中声明的宽高也能正常加载使用,不知道如果尺寸不一只是否有兼容性问题,实际开发中还是建议大家尽量保存纹理数组的尺寸大小都一致。
系列教程源码
https://github.com/feiflyer/NDK_OpenglES_Tutorial
Opengl ES系列入门介绍
领取专属 10元无门槛券
私享最新 技术干货