原文

1.概念

纹理贴图之所以复杂是因为矩形的纹理数据需要被合理地映射到非矩形的区域上面,纹理就是数据的数组,例如颜色数据亮度数据alpha数据等,纹理的单个数据值 被叫做纹理元素 英文叫做texual,初学者会本能地把纹理当成二维图像,但是纹理也可以是一维和三维的数据。

2.纹理贴图的特点

在不进行纹理贴图时,每个图元的绘制或者使用一种颜色单调着色或者根据每个顶点的颜色插值着色。而纹理贴图则是允许把一副图像映射到指定的多边形表面上,纹理贴图能够保证当这个多边形进行变换或渲染时,映射到多边形上的图像也能够正确,改变相机的位置 纹理细节也会跟着变大变小,但实际上纹理图像的大小是没有变化的。纹理贴图也被称为是纹理映射,我们可以把纹理映射到由一组多边形构成的表面上,也可以映射到曲面上。
OpenGL纹理贴图相关基本概念 - 图1

3.纹理坐标

纹理映射时需要知道纹理的每个textual与渲染的3D物体的表面是如何对应的,这个映射的范围是由纹理坐标来指定,纹理坐标可以是一维二维和三维,与纹理本身的维度相关,如果使用一个二维的纹理图像,那么纹理坐标就是二维。纹理坐标需要从两个方面来理解,一个是基于纹理空间的坐标,这个坐标表示的是每一个纹理,这个坐标表示的是每一个纹理像素在纹理中的位置,这个位置可以被认为是一个列和一个行的值,它们分别由U和V来表示;另外一个坐标是3D物体的某个顶点与纹理的对应关系,这个坐标需要在输入顶点数据时指定,这个坐标不是使用纹理空间中的坐标值,而是一个从0.0~1.0的实数坐标,分别用S和T来表示,无论纹理本身宽高是多少,S和T的取值始终是在0.0到1.0之间。在pixel shader中执行纹理贴图时,会使用顶点插值后得到的s、t坐标,与纹理宽高来计算纹理空间中的具体UV坐标,最后根据UV坐标来抓取pixel
OpenGL纹理贴图相关基本概念 - 图2

4.纹理贴图过程

我们可以看到下图表示一个纹理坐标和多边形表面的映射,我们要给图中左边的像素确定一个颜色,那么像素四个角的位置被映射到了对象空间中的图元上,这时像素的形状会有一些变形,这是由图元的形状和观察的角度所照成的,与像素角相对应的图元上的四个角被映射到纹理空间中,这个映射的过程就是纹理坐标s、t转换到纹理空间里面的u、v坐标的过程,这一映射过程再次使像素的形状产生变形,像素最终的颜色值就由该像素最终映射到的区域的纹理像素计算而得到。
OpenGL纹理贴图相关基本概念 - 图3

5.纹理level

纹理的level与纹理的过滤相关。由前面的介绍知道,纹理的大小与实际需要贴图的多边形的大小是无法匹配的,如果多边形小于纹理的分辨率,那么需要在贴图时对纹理做缩放,缩放被称为过滤,其实就是用几个textural来混合生成一个textural提供给多边形对应的像素使用。如果只指定了顶层的纹理,那么不管多边形大小是多大,都用这个顶层纹理来生成,另外一种方法就是指定不同level的纹理,如下图所示,原始大小的纹理就是0层,每一层的宽高都是上一层纹理的一半,那么纹理level的层数是其宽高中最大值以2为底的对数,例如纹理宽高最大值是64*16,那么纹理level的最大层数就是8。指定好不同层次的纹理后,就会根据多边形大小来决定采用哪个纹理,越小的多边形就采用越小的纹理,这种提前准备好各层纹理,在3D物体缩放时,大大减小了纹理失真的现象。
OpenGL纹理贴图相关基本概念 - 图4

6.纹理target

另外一个纹理的概念就是纹理的target,在纹理对象创建时,需要指定纹理的target,它确定了纹理的维数,纹理的target有以下几种:
(1)GL_TEXTURE_1D
(2)GL_TEXTURE_2D
(3)GL_TEXTURE_3D
(4)GL_TEXTURE_CUBE_MAP
纹理的target的指定是在绑定纹理的时候去指定的,而不是在生产纹理对象的时候去指定的。

7.纹理的格式

纹理通常用来表示物体表面,一般使用二维的图像来表示,因此常用的纹理格式有以下几种:
(1)GL_ALPHA这个只是有alpha通道的值,一般用来做字体的显示等
(2)GL_LUMINANCE只有亮度值,
(3)GL_LUMINANCE_ALPHA既有亮度显示又有alpha值
(4)GL_RGB
(5)GL_RGBA

8.纹理像素数据类型

指定完纹理像素的格式以后,还需要知道其具体的每个颜色通道的数据类型,由以下几种类型:
(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:表示红色通道使用5个bit来组成,绿色通道使用6个bit,蓝色通道使用5个bit,加起来正好是16个bit两个字节,是一个unsigned short
(6)GL_UNSIGNED_SHORT_4_4_4_4:每个通道都有4个bit
(7)GL_UNSIGNED_SHORT_5_5_5_1:红绿蓝是5个bit,alpha通道是1个bit
OpenGL纹理贴图相关基本概念 - 图5