opengl es纹理
纹理单元:
OpenGL ES的一个状态,是个容器,用来装入纹理对象(表示当前要处理的该单元目标)
纹理对象:
缓存在GPU的内存中的数据对象,一个纹理贴图,可以创建一个纹理对象,可以同时有很多个纹理对象缓存在GPU中,以减少 CPU 与 GPU 之间的数据交换,提高效率。
纹理贴图:
纹理就是数据的数组, 纹理贴图就是贴图图片数据的数组,纹理的单个数据值 被叫做纹理元素 英文叫做texual.
纹理贴图过程:
与像素角相对应的图元上的四个角被映射到纹理空间中,这个映射的过程就是纹理坐标s、t转换到纹理空间里面的u、v坐标的过程
纹理目标:
确定纹理的维数,有以下几种:
GL_TEXTURE_1D
GL_TEXTURE_2D
GL_TEXTURE_3D
GL_TEXTURE_CUBE_MAP
纹理目标的指定是在glBindTexture()绑定纹理的时候指定
纹理格式:
即纹理像素的格式,纹理通常用来表示物体表面,一般使用二维的图像来表示,常用纹理格式:
纹理像素格式 返回值
GL_RGB (R,G,B,1.0) //alpha值固定
GL_RGBA (R,G,B,A) //
GL_LUMINANCE (L,L,L,1.0) //只有亮度值
GL_LUMINANCE_ALPHA (L,L,L,A) //既有亮度显示又有alpha值
GL_ALPHA (0.0, 0.0, 0.0, A) //只有alpha通道的值,一般用来做字体的显示等
纹理像素数据类型
即像素的每个颜色通道的数据类型:
(1)GL_UNSIGNED_BYTE / GL_BYTE
(2)GL_UNSIGNED_SHORT / GL_SHORT
(3)GL_UNSIGNED_INT / GL_INT
(4)GL_FLOAT
(5)GL_UNSIGNED_SHORT_5_6_5 //r:5(bits) g:6(bits) b:5(bits), 组合起来16bits(一个unsigned short)
(6)GL_UNSIGNED_SHORT_4_4_4_4 //rgba,每个通道4bits
(7)GL_UNSIGNED_SHORT_5_5_5_1 //rgb每个通道5bits,a通道1bit
纹理单元定义在OpenGLES/ES2/gl.h:
#define GL_TEXTURE0 0x84C0
...
#define GL_TEXTURE31 0x84DF
#define GL_ACTIVE_TEXTURE 0x84E0
纹理滤镜:Texture Filtering
在纹理映射的过程中,如果图元的大小不等于纹理的大小,OpenGL便会对纹理进行缩放以适应图元的尺寸。设置纹理滤镜来决定OpenGL对某个纹理采用的放大、缩小的算法。
调用glTexParameter来设置纹理滤镜。如:
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILETER, MagFilter);//设置放大滤镜
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, MinFilter); //设置缩小滤镜
第一个参数表明是针对何种纹理进行设置,
第二个参数表示要设置放大滤镜还是缩小滤镜。
第三个参数表示使用的滤镜方法:
可使用的纹理滤镜:
滤镜 描述
GL_NEAREST 取最邻近像素(有锯齿)
GL_LINEAR 线性内部插值(不会产生锯齿,显示更加平滑)
GL_NEAREST_MIPMAP_NEAREST 最近多贴图等级的最邻近像素
GL_NEAREST_MIPMAP_LINEAR 在最近多贴图等级的内部线性插值
GL_LINEAR_MIPMAP_NEAREST 在最近多贴图等级的外部线性插值
GL_LINEAR_MIPMAP_LINEAR 在最近多贴图等级的外部和内部线性插值
纹理缠绕:Texture Wrapping
纹理坐标应位于0-1之间, 当纹理坐标不位于这一区间时, 我们可以指定两种操作:GL_CLAMP和GL_REPEAT。
GL_CLAMP 超出纹理坐标的区域会使用纹理图像的边界颜色来代替
GL_REPEAT 对纹理坐标进行重置而得到重复的图像
GL_CLAMP_TO_EDGE:纹理坐标会在0到1之间。超出的部分会重复纹理坐标的边缘,就是边缘被拉伸。
GL_CLAMP_TO_BORDER:超出的部分是用户指定的边缘的颜色。
Bitmap需要以纹理(Texture)的形式载入到Opengl, 载入纹理步骤:
1、glGenTextures() 生成纹理对象
2、glActiveTexture() 激活纹理单元
3、glBindTexture() 绑定纹理对象到当前激活的纹理单元(绑定完成后,所有的的操作都是针对该纹理单元的)
4、glTexParameteri() 设置纹理属性,过滤方式,拉伸方式等
5、glTexImage2D() 给纹理对象填充贴图图片的数据(纹理对象装入纹理贴图)
多个纹理对象,当前渲染引擎处理某个片元时,装入(glBindTexture)哪个纹理单元就用那个。