摘自《OpenGL游戏程序设计》
当一个纹理映射到一个多边形上时,纹理就将随着此多边形的变换而进行相应的变换。纹理映射可以被认为是赋给了3D物体或多边形的一种皮肤。可以在物体上移动、拉伸或者压缩这个皮肤,但无论何种情况下,这个皮肤或者说纹理图总是不会与其所应用的多边形分离的。
将纹理数据从一个文件中载入内存之后,需要将其定义为一个OpenGL纹理图,而纹理图的维数决定了应该使用哪个函数来完成此定义。
纹理对象是用来存储纹理数据的,使其随时准备被使用。包括纹理名字的生成和纹理对象的创建和使用。
由于纹理图被应用于变形多边形后,将会发生扭曲变形,一个单一像素可能仅仅代表此纹理图的一个纹素(texel)的一小部分,也可能代表多个纹素的集合。这时,就要使用纹理过滤来告诉OpenGL应该如何计算这些像素和纹素,以得到最后的图像。
在纹理过滤处理中,放大是指用一个像素来表示一个纹素的一小部分,而缩小则是指用一个像素表示多个纹素的集合。可以通过调用glTexParameteri()函数来通知OpenGL想要如何处理这两种过滤方式。
void glTexParameteri( GLenum target , GLenum pname , GLint param ) ;
相应于放大和缩小过滤处理,pname 参数分别等于GL_TEXTURE_MAG_FILTER和GL_TEXTURE_MIN_FILTER。
同颜色的混合一样,OpenGL也允许通过纹理模式来指定纹理图颜色的处理。对于每个纹理,可以调用glTexEnvi()函数从四个纹理模式中进行选择。
当实际绘制场景时,必须指定每个顶点的纹理坐标。纹理坐标用于确定纹理图的每个纹素对应于物体的哪个部分。纹理坐标(0,0)指的是一个纹理的左下角,而纹理坐标(1,1)则是指纹理的右上角。
当指定了0~1范围之外的纹理坐标时,可以告诉OpenGL对于纹理图或者重复其纹理坐标或者夹持其纹理坐标。如果将纹理坐标设置为(2.0,2.0),那么此纹理将会被重复四次。如果为(1.0,2.0),则在t方向上重复2次,在s方向上正常。
而夹持处理则将大于1.0的纹理坐标设为1.0,小于0.0的为0.0。那么又应该如何通知OpenGL是要进行重复处理还是夹持处理呢?可以调用glTexParameter()函数,不过这次函数中pname参数应取GL_TEXTURE_WRAP_S GL_TEXTURE_WRAP_T,前者s表示方向,后者表示t方向。
重复处理:GL_REPEAT
夹持处理:GL_CLAMP GL_CLAMP_TD_EDGE(当纹理存在边界并希望OpenGL忽略边界时,使用后者)