一、概念

1. 纹理过滤

当纹理贴到具体像素上时,像素需要到纹理图像中进行采样,这个过程称为纹理过滤。

纹理过滤通常有两种情况:放大(GL_TEXTURE_MAG_FILTER)和缩小(GL_TEXTURE_MIN_FILTER)。

2. mip 贴图

mip 贴图只适用于纹理过滤缩小的场景,其原理是将纹理按照2的倍数进行缩放,直至图像1*1的大小。在贴图时,OpenGL 会自动选择合适大小的纹理进行采样。

所以,mip 贴图是一种使用空间提升性能的方式,它可以有效解决纹理贴图闪烁和性能问题。

二、纹理过滤方式

1. 最近点采样 (Nearest Point Sampling)

每个像素直接在最接近它的纹理单元进行采样。这种方式速度最快,但效果也最差。

2. 双线性插值 (Bilinear Interpolation)

每个像素在最接近它的四个纹理单元进行采样,并根据距离进行加权平均。

这种方法比之前的简单粗暴好不少,但仍无法提供最佳品质,特别是缩小场景,一旦超过某个度,太多的纹素将放到相同的像素上,OpenGL 仅使用最多4个纹素渲染一个像素,因此许多信息仍然会丢失,也不适合移动的场景,因为每帧都会选择不同的纹素。

3. 三线性插值 (Trilinear Interpolation)

双线性插值中,只使用到了一层 mipmap 进行采样。而三线性插值则是选取了大小最接近的两层 mipmap 进行双线性插值,然后再将两层的结果进行线性插值。

所以,三线性插值必须要先使用到 mip 贴图。它可以解决不同级别的 mip 贴图切换时,带来的跳跃或者线条问题。

三、OpenGL 中的纹理过滤模式

模式 描述
GL_NEAREST 最近点采样
GL_LINEAR 双线性插值
GL_NEAREST_MIPMAP_NEAREST 在大小最近的一个 mip 贴图中最近点采样
GL_LINEAR_MIPMAP_NEAREST 在大小最近的一个 mip 贴图中双线性插值
GL_NEAREST_MIPMAP_LINEAR 在大小最近的两个 mip 贴图中最近点采样并插值
GL_LINEAR_MIPMAP_LINEAR 三线性插值

值得注意的是,缩小(GL_TEXTURE_MIN_FILTER)场景可以使用上述值中的任意一个,但放大(GL_TEXTURE_MAG_FILTER)场景只能使用 GL_NEARESTGL_LINEAR

四、使用示例

// 纹理对象的句柄
GLuint textureId;
// 创建一个纹理对象
glGenTextures(1, &textureId);
// 绑定纹理对象
glBindTexture(GL_TEXTURE_2D, textureId);
// TODO 加载纹理
// glTexImage2D();// 生成mip贴图
glGenerateMipmap(GL_TEXTURE_2D);
// 设置缩小情况下,使用三线性过滤
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
// 设置放大情况下,使用双线性过滤
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);// 解绑纹理对象
glBindTexture(GL_TEXTURE_2D, 0);

OpenGL 纹理过滤和 mip 贴图相关推荐

  1. C++ Opengl纹理过滤和光照实例源码

    C++ Opengl纹理过滤和光照实例源码 项目开发环境 项目功能 项目演示 项目源码传送门 项目开发环境 开发语言:C++和IDE:VS2017,操作系统Windows版本windows SDK8. ...

  2. OpenGL纹理过滤以及纹理Wrapping mode

     在三维动态场景中,如果一个纹理对象迅速地远离观察点而去,此时纹理图像必须随被投影的图像一起缩小,否则很产生抖动或者闪烁的现象.为了避免产生抖动或者闪烁,OpenGL必须对纹理图像进行过滤,适当的 ...

  3. 初识OpenGL (-)纹理过滤(Texture Filtering)

    1. OpenGL需要知道怎样将纹理像素(Texture Pixel,也叫Texel)映射到纹理坐标. 纹理坐标 不依赖于分辨率(Resolution),它可以是任意浮点值, 给模型顶点设置的那个数组 ...

  4. C++ opengl 纹理过滤之GL_NEAREST

    源码还是这个博文里的 https://blog.csdn.net/qq78442761/article/details/81228557 GL_LINEAR过滤:表示给多边形进行着色的时候,它的颜色需 ...

  5. C++ opengl 纹理过滤之GL_REPEAT

    源码还是这个博文里面的 https://blog.csdn.net/qq78442761/article/details/81228557 程序运行截图如下: repeat犹如字面意思那样会重复,当几 ...

  6. OpenGL蓝宝书源码学习(十)第五章——纹理的应用、Mip贴图、各项异性过滤和纹理压缩基础

    一.纹理应用 1.纹理坐标 我们是通过为每个顶点指定一个纹理坐标而直接在几何图形上进行纹理贴图的.纹理坐标要么是指定为着色器的一个属性,要么通过算法计算出来.纹理贴图中的纹理单元是作为一个更加抽象的纹 ...

  7. android纹理缓存,Android OpenGLES(七) 理解纹理与纹理过滤

    1.理解纹理 OpenGL中的纹理可以用来表示图像,照片,甚至由一个数学算法生成的分形数据.每个二维的纹理都由许多小的纹理元素组成,它们是小块的数据,类似于我们前面讨论过的片段和像素.要使用纹理,最常 ...

  8. 纹理过滤函数glTexParameteri

    OpenGL--纹理过滤函数glTexParameteri() 图象从纹理图象空间映射到帧缓冲图象空间(映射需要重新构造纹理图像,这样就会造成应用到多边形上的图像失真),这时就可用glTexParme ...

  9. OpenGL Mip贴图、各向异性过滤(七)

    1.Mip贴图 Mip贴图简介: 纹理对象可以从不同的视点距离进行观察.在一个动态的场景中,当贴了纹理的物体远离视点运动时,屏幕像素与纹理纹素之间的比率会变得非常低(屏幕像素/纹理纹素),因此纹理的采 ...

最新文章

  1. c语言的发展8个过程,c语言发展过程.pptx
  2. 淘宝装修:第一日 —— 图片轮播
  3. poj 2063 Investment(01背包变形)
  4. 统计并输出某给定字符在给定字符串中出现的次数_查找常用字符
  5. 那天有个小孩跟我说LINQ(四)
  6. 解决/WEB-INF目录下的jsp页面引入webRoot下的Js、css和图片的问题
  7. c语言辗转相除法求最大公约数_趣味探究:妙法求“最大公因数”,比书上难一点,你敢挑战吗?(适合56年级)...
  8. 科研工作者结合实验与计算机模拟,理论物理前沿重点实验室
  9. java.util.list e_E remove()
  10. Selenium自动化测试WebDriver下载
  11. 如何手动触发onchange事件? [重复]
  12. oracle 同义词_详解Oracle视图V$、GV$、X$、V_$、GV_$之间的关系
  13. 同步手绘板——关于/dev/graphics/fb0权限的获取
  14. arcgis海岸带_需科学划定海岸带基准地理边界
  15. EasyCamera Android安卓移动视频监控单兵设备接入EasyDarwin开源流媒体云平台
  16. 平头哥RVB2601开发板开发环境CDK
  17. Android 仿支付宝搜索结果页,字符串部分文字显示高亮
  18. html 气泡上升效果,css气泡效果
  19. Java加密1-散列函数
  20. 电力系统故障点分析,短路类型分析,中性点小电流接地 不接地故障分析,故障点定位

热门文章

  1. 有一个棋盘,有64个方格,在第一个方格里面放1粒芝麻重量是0.00001kg,第二个里面放2粒,第三个里面放4,棋盘上放的所有芝麻的重量
  2. hutool 获取某月最后一天_Hutool使用指南
  3. 基于GPS\北斗、GIS、GPRS技术构建智能巡检系统
  4. Vue启动报错This is probably not a problem with npm. There is likely additional logging output above.
  5. 硕士阶段总结《科苑行》之工作习惯
  6. 【芯片驱动】SMG42630的固定步数实现
  7. Win10家庭版远程桌面 : 出现身份验证错误,要求的函数不受支持 可能是由于CredSSP加密Oracle修正
  8. IDEA断点无效问题解决办法
  9. 云主机是不是服务器?云主机和服务器有什么区别?
  10. go linux下进程守护,Linux系统进程管理-Go语言中文社区