Textures
纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节,我们不需要指定每个顶点的颜色。
纹理坐标(Texture coordinate):关联图形顶点坐标和纹理图片中坐标
纹理坐标在x和y轴上,范围为0到1之间(注意我们使用的是2D纹理图像)。使用纹理坐标获取纹理颜色叫做采样(Sampling)。纹理坐标起始于(0, 0),也就是纹理图片的左下角,终始于(1, 1),即纹理图片的右上角。下面的图片展示了我们是如何把纹理坐标映射到三角形上的。
纹理坐标设置在有效范围[0~1]之外时,根据设置的环绕方式决定纹理的处理(基本上忽略浮点纹理坐标的整数部分)。
每个选项都可以使用glTexParameter*函数对单独的一个坐标轴设置(s、t(如果是使用3D纹理那么还有一个r)它们和x、y、z是等价的):
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
如果我们选择GL_CLAMP_TO_BORDER选项,我们还需要指定一个边缘的颜色。这需要使用glTexParameter函数的fv后缀形式,用GL_TEXTURE_BORDER_COLOR作为它的选项,并且传递一个float数组作为边缘的颜色值:
GLfloat borderColor[] = {1.0f, 1.0f, 0.0f, 1.0f};
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
纹理过滤:
纹理坐标不依赖于分辨率(Resolution),它可以是任意浮点值,所以OpenGL需要知道怎样将纹理像素(Texture Pixel,也叫Texel,译注1)映射到纹理坐标。
OpenGL以顶点的纹理坐标数据去查找纹理图像上的像素,然后进行采样提取纹理像素的颜色。
邻近过滤(GL_NEAREST):默认纹理过滤方式,选择中心点最接近纹理坐标的像素。容易产生颗粒效果。
线性过滤(GL_LINEAR):基于纹理坐标附近的纹理像素,计算出插值。容易产生平滑的图案。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
多级渐远纹理:
图片中的物体有远有近,处理纹理的时候,远处的物体较小不太好从纹理中获取正确的颜色,OpenGL采用多级渐远纹理(Mipmap),一系列的纹理图像,后一个纹理图像是前一个的二分之一。当距观察者的距离超过一定的阈值,OpenGL会使用不同的多级渐远纹理,即最适合物体的距离的那个。由于距离远,解析度不高也不会被用户注意到。同时,多级渐远纹理另一加分之处是它的性能非常好。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
图片和一些文字来源于https://learnopengl-cn.github.io,本人收集作为笔记,如有侵权,望告知。