1 纹理环绕方式

纹理坐标的范围是 0-1,超出这一范围的坐标将被OpenGL根据 GL_TEXTURE_WRAP 参数的值进行处理:

环绕方式 描述
GL_REPEAT 对纹理的默认行为。重复纹理图像。
GL_MIRRORED_REPEAT 和GL_REPEAT一样,但每次重复图片是镜像放置的。
GL_CLAMP_TO_EDGE 纹理坐标会被约束在0到1之间,超出的部分会重复纹理坐标的边缘,产生一种边缘被拉伸的效果。
GL_CLAMP_TO_BORDER 超出的坐标为用户指定的边缘颜色。

加载图像的时候,需要翻转Y轴,因为正常图片(0,0)点是左上角,纹理坐标起始点是左下角。

/* 在加载图像之前设置翻转Y轴 */
stbi_set_flip_vertically_on_load(true);

1.1 示例

具体可以参考示例:06_texture_wrap.cpp

设定纹理坐标超出 0-1,可以是正的,也可以是负数,纹理原始图像是在 (0,0)到(1,1)

  1. 设定 (0,0)到(3,3),环绕方式GL_CLAMP_TO_EDGE,则原始图图像是在左下角。如下图所示:

    alt text

  2. 设定 (-2,-2)到(3,3),水平环绕方式GL_REPEAT,垂直环绕方式GL_MIRRORED_REPEAT。原始图像在正中间,如下图所示:

    alt text

    alt text

  3. 设定 T轴方向GL_TEXTURE_BORDER_COLOR 颜色

    alt text

2 纹理过滤

当纹理应用于几何图形表面时,纹理图像不是被拉伸就是被收缩(因为显示纹理的窗口肯定会比纹理图片大或者小)。

**纹理过滤**:纹理过滤是指决定纹理像素(纹理元)如何映射到屏幕像素(片元)的过程。这个过程肯定会发生拉伸或收缩(Texture Fililtering)。

2.1 大物体使用低分辨率纹理

使用276x182分辨率的纹理图像,创建一个1280x720的图像。

alt text

屏幕的每个像素需要一个纹理颜色的时候,OpenGL将查看该点对应的纹理坐标。它将找到该坐标对应的纹理像素(是哪个像素小方块)。

大物体坐标分割的就密集,对应到分辨率低的纹理上,(0.4532, 0.6432)(0.4533, 0.6432)可能就对应同一个像素。(只是举例说明,下面两张图不是真实对应关系)

alt text

alt text

运行程序:06_texture_filter.cpp

GL_NEAREST产生了颗粒状的图案,我们能够清晰看到组成纹理的像素,而GL_LINEAR能够产生更平滑的图案,很难看出单个的纹理像素。GL_LINEAR可以产生更真实的输出,但有些开发者更喜欢8-bit风格,所以他们会用GL_NEAREST选项。

alt text

当进行放大(Magnify)和缩小(Minify)操作的时候可以设置纹理过滤的选项,比如你可以在纹理被缩小的时候使用邻近过滤,被放大时使用线性过滤。我们需要使用glTexParameter*函数为放大和缩小指定过滤方式。这段代码看起来会和纹理环绕方式的设置很相似:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

3 多级渐远纹理