概述:
纹理时一个2D图片(也可以是1D或者3D),用来让图形看起来更真实。是一种很简单就能够模拟真实的方法,因为如果不使用纹理,那么我们就必须为所有细节构建顶点和图形,这样的开销会非常大,有了纹理后,我们就只需要少很多的顶点,然后把纹理贴上去就可以了,及时有些不真实,但是也看不出来。
纹理坐标:
- 纹理坐标的原点在左下角;
- S、T、R 对应 X、Y、Z
- 但是在存储图片的时候数据是从左上角开始存,这样导致读取的坐标Y轴被反转。
- OpenGL默认开启4字节对齐,如果在读取的数据不是4字节对齐的,在将图片数据转换到纹理对象后再使用会导致图像倾斜,因为数据使用一维数组存储,同时使用width和height查询像素的具体位置。可以使用glPixelStorei(GL_UNPACK_ALIGNMENT, 1)设置字节对齐方式。
纹理环绕方式:
- GL_REPEAT:纹理的默认行为,重复纹理图形
- GL_MIRRORED_REPEAT:镜像重复
- GL_CLAMP_TO_EDGE:约束到边缘
- GL_CLAMP_BORDER:约束到指定边框,可以通过 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor)设置边框颜色
eg: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);//设置X轴方向为镜像重复
纹理过滤:纹理过滤指的是在采样阶段,当需要采样的坐标不存在时,采用怎样的策略使用待采样坐标附近的颜色来推算待采样坐标的颜色(很显然,绝大部分情况下都是无法直接命中的)。
- GL_NEAREST:最近邻过滤,看起来锐利,使用靠近目标坐标的的纹理坐标处的颜色。建议用在当Minify(缩小)的情况下。
- GL_LINEAR:线性过滤,看起来模糊,使用目标坐标附近的纹理颜色线性插值。建议用在Magnify(放大)的情况下。
为了进一步让纹理再使用时看起来更真实,使用了多级渐远纹理(Mipmap)。Mipmap是一套纹理,他们从第0个纹理(原始纹理)开始,后面一个纹理的边长都为前一个的二分之一,用以模拟纹理在所有缩放尺寸的纹理。由于使用二分之一作为倍数,所以还是会出现不真实的边届,所以也可以对Mipmap使用多种纹理过滤方式,例如:
- GL_NEAREST_MIPMAP_NEAREST:使用最邻近的多级渐远纹理来匹配像素大小,并使用邻近插值进行纹理采样
- GL_LINEAR_MIPMAP_NEAREST:使用最邻近的多级渐远纹理级别,并使用线性插值进行采样
- GL_NEAREST_MIPMAP_LINEAR:在两个最匹配像素大小的多级渐远纹理之间进行线性插值,使用邻近插值进行采样
- GL_LINEAR_MIPMAP_LINEAR:在两个邻近的多级渐远纹理之间使用线性插值,并使用线性插值进行采样。
纹理单元:一个纹理的位置通常称为一个纹理单元。我们使用glActiveTexture激活指定纹理,后面的对纹理的操作都是在该激活的纹理上。