多级纹理

纹理坐标

​ 如果为顶点指定的纹理坐标不在(0,1)的范围内,需要设置纹理环绕方式

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

​ 环绕方式使用glTexParameter*函数对每个坐标轴进行设置(s,t(如果是3d纹理还有一个r,他们和xyz等价))

1
2
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,  GL_MIRRORED_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);

纹理过滤

纹理坐标不是离散的,可以是任意浮点值,而纹理就是一个个像素点组成的图片,纹理像素是离散的。纹理过滤是纹理采样时纹理坐标和纹理像素之间的一种映射方式(它使得同一个纹理可以被用于不同的形状,尺寸和角度,同时尽可能减少显示时的模糊和闪烁)。 最常用的两种方式:

1.GL_NEAREST,邻近过滤,这是OpenGL默认的过滤方式,它是选择中心点即小正方形中心点距离纹理坐标最近的那个纹理像素作为采样结果。

2.GL_LINEAR,线性过滤,它会基于纹理坐标附近的纹理像素计算一个插值,而纹理像素中心距离纹理坐标越近,那么该纹理像素在采样结果中占有的权重就越大。

当进行放大缩小操作的时候,可以设置纹理过滤的选项。

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

多级渐远纹理

当要表示的物体很远的时候,如果我们用贴图的话就会造成纹理像素远远高于屏幕像素的情况,这个时候要从高分辨率的贴图中获取正确的颜色值就很困难。OpenGL使用多级渐远纹理(Mipmap)来解决这个问题,它就是一系列的纹理图像,后一个纹理是前一个纹理的1/2,依次类推。它的原理就是把摄像机到物体的距离与阙值作比较,在不同的距离空间内选用不同的纹理图像。(近距离的数据多更加细致)

image-20230103162452990

创建多级纹理:

1
2
3
4
5
6
7
//gluBuild2DMipmaps(GL_TEXTURE_2D, 4, imgWidth, imgHeight,imgFormat, GL_UNSIGNED_BYTE, image);
//用载入的图片生成纹理
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imgWidth, imgHeight, 0, imgFormat, GL_UNSIGNED_BYTE, image);
//创建多级纹理
glGenerateMipmap(GL_TEXTURE_2D);
//释放图像内存
free(image);

多级渐远过滤方式

过滤方式 描述
GL_NEAREST_MIPMAP_NEAREST 使用最邻近的多级渐远纹理来匹配像素大小,并使用邻近插值进行纹理采样
GL_LINEAR_MIPMAP_NEAREST 使用最邻近的多级渐远纹理级别,并使用线性插值进行采样
GL_NEAREST_MIPMAP_LINEAR 在两个最匹配像素大小的多级渐远纹理之间进行线性插值,使用邻近插值进行采样
GL_LINEAR_MIPMAP_LINEAR 在两个最匹配像素大小的多级渐远纹理之间进行线性插值,使用邻近插值进行采样

例子:

1
2
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

对比:

使用多级纹理

image-20230103165513744

不使用多级纹理

QQ图片20230104113400

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码

请我喝杯咖啡吧~

支付宝
微信