一、 简介
现实生活中,纹理最通常的作用是装饰我们的物体模型,它就像是贴纸一样贴在物体表面,使得物体表面拥有图案。但实际上在OpenGL中,纹理的作用不仅限于此,它可以用来存储大量的数据。
现代OpenGL中,纹理对象和顶点数组对象(VAO)及缓存对象(VBO)一样,需要调用glGenTextures函数生成。
同样的,纹理对象需要进行绑定。OpenGL中纹理可以分为1D,2D和3D纹理,我们在绑定纹理对象的时候需要指定纹理的种类。
二、OpenGL纹理介绍
在OpenGL中,我们通常将纹理中的像素将按照纹理坐标进行编址,纹理坐标系是一个空间直角坐标系,横轴为S轴,纵轴为T轴,垂直于屏幕的坐标轴为R轴。在我们的2D纹理中,由于没有R轴,我们也可以将横轴称为U 纵轴称为V轴,也就是我们所说的UV坐标系。但和OpenGL坐标系所不同的是:纹理坐标系的(0,0)点位于纹理的左下角,而(1,1)点位于纹理的右上角。
通过纹理坐标获取像素颜色信息的过程称为采样,而采样的结果会根据纹理参数设置的不同而千差万别。OpenGL中设置纹理参数的API接口为glTextureParameter,我们所有的纹理参数都由这个接口设置,下面我们介绍几种常用的纹理参数的配置。
Warpping:
纹理坐标的范围与OpenGL的屏幕坐标范围一样,是0-1。超出这一范围的坐标将被OpenGL根据GL_TEXTURE_WRAP参数的值进行处理:
GL_REPEAT: 超出纹理范围的坐标整数部分被忽略,形成重复效果。
GL_MIRRORED_REPEAT: 超出纹理范围的坐标整数部分被忽略,但当整数部分为奇数时进行取反,形成镜像效果。
GL_CLAMP_TO_EDGE:超出纹理范围的坐标被截取成0和1,形成纹理边缘延伸的效果。
GL_CLAMP_TO_BORDER: 超出纹理范围的部分被设置为边缘色。
过滤
由于纹理坐标和我们当前的屏幕分辨率是无关的,所以当我们为一个模型贴纹理时,往往会遇到纹理尺寸与模型尺寸不符的情况,这时,纹理会因为缩放而失真。处理这一失真的过程我们称为过滤,在OpenGL中我们有如下几种常用的过滤手段:
GL_NEAREST: 最临近过滤,获得最靠近纹理坐标点的像素。
GL_LINEAR: 线性插值过滤,获取坐标点附近4个像素的加权平均值。
GL_NEAREST_MIPMAP_NEAREST:用于mipmap,下节将详细介绍。
GL_LINEAR_MIPMAP_NEAREST:
GL_NEAREST_MIPMAP_LINEAR:
GL_LINEAR_MIPMAP_LINEAR:
纹理的加载
当我们设置好纹理对象后,就可以加载我们的纹理数据了。
使用以下函数:
Void glTexImage2D(GLenum
target,Glint level,Glint internalformat,GLsize width,GLsize height,Glint size,GLenum
format,GLenum type,const GLvoid* data);
这个函数非常重要,下面我们来看一下每个参数所表示的意义:
第一个参数很简单,表示绑定纹理对象的种类,这里我们依然以GL_TEXTURE_2D的纹理为例。
第二个参数表示该纹理对应的mipmaps的等级,0表示没有进行缩小的原始图片等级。
第三个参数表示了纹理所采用的内部格式,内部格式是我们的像素数据在显卡中存储的格式,这里的GL_RGB显然就表示纹理中像素的颜色值是以RGB的格式存储的。
第四个和第五个参数表示了纹理的宽和高,这里我们采用的是2*2像素宽度的纹理,因此这两个参数都是2。
第六个参数通常为0.
第七和第八个参数描述了像素在内存中的存储格式和数据类型。
第九个参数是存放纹理数据的指针。
使用纹理
我们知道纹理是采用纹理坐标进行采样的,我们在使用纹理时,需要将顶点对应的纹理坐标输入OpenGL。这里我们创建一个矩形区域的顶点数组,数组里每个顶点所包含的数据除位置、颜色外,还有纹理坐标的s和t值。
纹理单元
纹理单元是能够被着色器采样的纹理对象的引用, 纹理通过调用glBindTexture函数绑定到指定的纹理单元。由于你没有明确指定使用哪个纹理单元,所以纹理被默认绑定到了GL_TEXTURE0,这就是为什么我们在片段着色器中给我们的采样器对象传入一个0它依然能够正常工作的原因。
那么我们怎么指定当前我们使用的纹理单元呢?OpenGL提供了一个叫做glActiveTexture的API来让我们选择用来绑定纹理的纹理单元ID。
OpenGL中最大支持的纹理单元数量根据显卡不同而有所区别,最少支持48个。不过基本上你同时用完所有纹理单元的几率为0。
三、总结
本篇文章中,我们介绍了OpenGL纹理的相关内容,包括其实现的流程及部分主要信息,接下来我们将会对纹理的加载过程进行更为细致的分析。