一、GL_NEAREST(最近邻插值)
1.1 原理
当需要从纹理中采样颜色时,GL_NEAREST模式会选择离采样点最近的纹理像素(通常是最接近采样点的纹理元素的中心),并直接使用该像素的颜色值作为输出。这种模式不进行任何插值计算。
1.2 特点
1、快速:由于无需进行复杂的插值计算,GL_NEAREST模式在性能上通常优于GL_LINEAR。
2、锯齿状边缘:由于直接使用单个像素的颜色,放大后的纹理会出现明显的锯齿边缘,尤 其是在大幅度缩放或以低分辨率纹理渲染高分辨率物体时。
3、清晰度:对于小尺寸、像素艺术风格或需要保持锐利边缘的纹理,GL_NEAREST模式可以保留原始像素的精确颜色,保持图像的清晰度和细节。
二、GL_LINEAR(双线性插值)
1.1 原理
当需要从纹理中采样颜色时,GL_LINEAR模式会考虑采样点周围最近的四个纹理像素(一个正方形区域内的像素),并对这四个像素的颜色值进行加权平均,以得到平滑过渡的颜色。对于三维纹理或更高维度的纹理,它会考虑更多的相邻像素并进行更高维的线性插值。
1.2 特点
1、平滑:GL_LINEAR模式产生的纹理放大效果更加平滑,边缘没有明显的锯齿,视觉效果更为柔和。
2、模糊:相较于GL_NEAREST,GL_LINEAR模式可能会引入轻微的模糊,特别是在大幅度缩放时。这种模糊是由于插值过程混合了多个像素的颜色造成的。
3、适用场景:对于需要平滑过渡、细节丰富、或对视觉质量要求较高的纹理(如照片、自然景观、高清图形等),GL_LINEAR模式通常能提供更好的视觉效果。
三、用途
3.1 GL_NEAREST通常适用情况
1、性能敏感的应用,需要快速渲染大量纹理,且对平滑度要求不高。
2、像素艺术风格的游戏或图形,需要保持原始像素的锐利边缘和清晰度。
3、对于某些特定的艺术效果或视觉风格,可能需要刻意保持锯齿边缘。
3.2 GL_LINEAR通常适用情况
1、需要高质量渲染效果的应用,如照片编辑软件、3D建模和渲染、高清游戏等。
2、大幅度缩放纹理或以非整数坐标采样的场景,为了消除锯齿并保持平滑过渡。
3、对于视觉质量要求较高的用户界面元素,如图标、背景图片等。
四、实际应用
//纹理
textureWall = new QOpenGLTexture(QImage(":/imags/imag/1.jpg").mirrored());
textureLe = new QOpenGLTexture(QImage(":/imags/imag/2.jpg").mirrored());
textureSmall = new QOpenGLTexture(QImage(":/imags/imag/3.jpg").mirrored());
//设置纹理单元,纹理单元有16个
m_shaderProgram.bind();
m_shaderProgram.setUniformValue("textureWall", 0);
m_shaderProgram.setUniformValue("textureLe", 1);
m_shaderProgram.setUniformValue("textureSmall", 2);
//纹理绑定
textureSmall->bind(2);
textureLe->bind(1);
textureWall->bind(0);
/**********在画之前设置纹理参数**********/
//复制,qt默认复制
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
//镜像,T和S对应X和Y轴
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
//纹理坐标约束到0到1,超出部分边缘拉伸
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
//超出坐标指定边缘色
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
// glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
//纹理像素(过滤),GL_NEAREST高新能低质量/GL_LINEAR高质量低性能,这里设置缩小像素,放大线性
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
/*************************************/