当前位置: 首页 > news >正文

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

http://www.lryc.cn/news/339208.html

相关文章:

  • vue 性能优化
  • 互联网大厂ssp面经(操作系统:part1)
  • Android Activity 启动涉及几个进程
  • 说说你对链表的理解?常见的操作有哪些?
  • 每天五分钟深度学习:逻辑回归算法的损失函数和代价函数是什么?
  • llama-factory SFT系列教程 (二),大模型在自定义数据集 lora 训练与部署
  • C语言游戏实战(11):贪吃蛇大作战(多人对战)
  • 腾讯测试岗位的面试经历与经验分享【一面、二面与三面】
  • 手机移动端网卡信息获取原理分析
  • 无人新零售引领的创新浪潮
  • SD-WAN提升企业网络体验
  • Docker搭建Let‘s Encrypt
  • 单链表讲解
  • DFS算法系列 回溯
  • Linux C应用编程:MQTT物联网
  • 企业常用Linux文件命令相关知识+小案例
  • Istio介绍
  • 代码随想录算法训练营第四十七天|leetcode115、392题
  • 将Ubuntu18.04默认的python3.6升级到python3.8
  • Python和Java哪个更适合后端开发?
  • Python+pytest接口自动化之cookie绕过登录(保持登录状态)
  • 什么数据集成(Data Integration):如何将业务数据集成到云平台?
  • 国外EDM邮件群发多少钱?哪个软件好?
  • C语言入门算法——回文数
  • OceanBase—操作实践
  • 智慧用电安全管理系统
  • Rust语言入门第二篇-Cargo教程
  • 测试用例的编写方式
  • HarmonyOS实战开发-状态管理、通过使用页面级的状态变量 和应用级的状态变量 来实现应用的状态管理。
  • 【Java开发指南 | 第二篇】标识符、Java关键字及注释