OpenGL中的纹理过滤GL_NEAREST和GL_LINEAR

一、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);
    /*************************************/

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值