MipMap与三线性过滤
现代计算机图形管线渲染图像的方法是处理这两个问题:
1 3D世界的几何图元如何投影成2D图元,进而对应到屏幕的哪些像素
2 根据已有的信息(光照,法向量,贴图),每个像素点应该怎样设置颜色
根据这两个问题,我们有了顶点着色器和片段着色器。
本次研究的内容,是第2个问题中的一个问题。这个问题出现在我们有了贴图,我们有了uv,我们有了片段的位置(并非是像素位置,而是有一定精度的浮点位置),如何根据这部分信息选择颜色。
一切技术都起始于对现有不完美部分的改造,MipMap的概念就是这么来的。任何人从事计算机图形学,必然会遇到这个问题,如果不学习MipMap,不学习三线性过滤,也必然会想出一个类似的解决办法,因此,这两个东西是技术发展的必然,是自然而然的出现,而并非是为了技术而技术的Geek玩意。
首先,根据当前片段的位置和相邻3个顶点的uv值(认为是三角形),我们可以计算出该片段所在位置的插值uv。根据这个uv,映射到贴图的像素坐标空间,必然得到一个带浮点的小数二维坐标。想当然的,我们认为离这个坐标最近的像素颜色,就是这个片段的颜色。这样,我们就有了点采样。
然而这样的效果并不完美,因为凡是计算出来的二维坐标在该像素+-0.5范围内的一切片段,都会使用这同一个颜色,当三角形被放大(也就是摄像机比较近或摄像机fov比较小),屏幕上会有多个像素点取到同一个贴图颜色,产生销魂的马赛克效果,这便是ps主机和许多老游戏机(任天堂直到nds)全部都有的问题。它们只能使用点采样。
这显然太粗糙了,于是聪明人想了一个办法,将计算出来的浮点贴图坐标空间的位置,取周围4个像素,并按照距离的加权计算一个混合颜色(这就是传说中不明觉厉的图像卷积)。于是,图像没那么粗糙了,过渡变得更加平滑,这就叫做线性采样。
看起来已经没有什么可以优化的了,毕竟贴图分辨率在那摆着。然而,线性过滤在三角形较小的时候会展现的不完美。当三角形较小时(也就是贴图被缩小了),这种方式计算出来的颜色会跳动,因为贴图较大,信息过大,同时大量信息被压缩在相对比较小的空间中,则像素变化微小时,色彩变化会剧烈,参考示波器,如果扩大坐标轴的时间范围,波就会变得密集,从而在绝对的屏幕距离内变化会更加剧烈。这样就会产生下面的效果,在远处的图像事实上已经看不到任何有用信息,被剧烈的过渡掩盖了:
这点上,低像素图像有优势。因为像素低,信息量没有那么大,在有限空间的过渡就不会那么剧烈(事实上可以把一个低分辨率的图像放大,在参考大分辨率的同类图像,在任何方向上,低分辨率图放大以后的色彩变化都要更加柔和)。
于是聪明人又想出来一个办法,保存同一个图像的不同分辨率版本,当三角形在屏幕上的大小相对于图像远远要小,则使用低分辨率版本,具体使用多低的分辨率,取决于三角形在屏幕上映射的尺寸和它所用到的uv范围。由于计算机处理2倍关系时速度更快,一般使用成两倍关系的图像,于是,必须规定图像的长和宽是2的幂。
这就是MipMap的由来,它在远距离能达到如下效果,完美解决色彩的剧烈震荡:
MipMap,双线性都有了,这个画面静态的看,也没有太多可以挑剔的。
然而,当摄像机运动,同一个三角形越来越大或越来越小的做渐变缩放时,在MipMap切换不同分辨率图像的临点处由于切换了图像,会有非常明显的变化:
上面标红的地方,当摄像机往前移动,它会突然变清晰,这个过程很明显,看起来很违和。
于是,我们有了最后的三线性过滤:
计算出来选择MipMap的凭据,必然是一个浮点数(不可能那么凑巧是一个整数,即便是整数,也能看成小数很小的浮点数),那么我们对前一个MipMap和后一个分辨率的MipMap都进行双线性插值,然后根据这个MipMap凭据,再将两个插值结果进行一个插值,得到一个中间数。
这样,就解决了动态情况下突变的问题,摄像机接近的时候,它是慢慢的变清晰的。
综上所述:
点采样,马赛克
线性采样,远距离麻麻点点
MipMap的线性采样和三线性静态图是没有区别的,区别在于动起来,三线性能够渐变。
MipMap与三线性过滤的更多相关文章
- 深入学习jQuery选择器系列第三篇——过滤选择器之索引选择器
× 目录 [1]通用形式 [2]首尾索引 [3]奇偶索引[4]范围索引 前面的话 上一篇介绍了过滤选择器中的子元素选择器部分,本文开始介绍极易与之混淆的索引选择器 通用形式 $(':eq(index) ...
- Liunx运维(三)-文件过滤及内容编辑处理
文档目录: 一.cat:合并文件或查看文件内容 二.tac:反向显示文件内容 三.more:分页显示文件内容 四.less:分页显示文件内容 五.head:显示文件头部内容 六.tail:显示文件尾部 ...
- Python 三种过滤去重方法
SET集合去重 set(1,1,2) REDIS去重 布隆过滤器
- SVM(三)线性支持向量机
本文是在微信公众号发表的原创~ 额,图片粘不过来~就把链接给你们吧 http://mp.weixin.qq.com/s?__biz=MjM5MzM5NDAzMg==&mid=400740076 ...
- 【转】MipMap
原文地址http://www.cppblog.com/wc250en007/archive/2011/08/06/152653.html 首先从MIPMAP的原理说起,它是把一张贴图按照2的倍数进行缩 ...
- MipMap
MipMap 首先从MIPMAP的原理说起,它是把一张贴图按照2的倍数进行缩小.直到1X1.把缩小的图都存储起来.在渲染时,根据一个像素离眼睛为之的距离,来判断从一个合适的图层中取出texel颜色赋值 ...
- opengl的mipmap
压缩纹理是不能调用glGenerateMipmap生成mipmap的. DDS和PVR都不行. 强行调用会产生GL_INVALID_OPERATION的错误. PNG格式试验了glGenerateMi ...
- 纹理过滤模式中的Bilinear、Trilinear以及Anistropic Filtering
1. 为什么在纹理采样时需要texture filter(纹理过滤). 我们的纹理是要贴到三维图形表面的,而三维图形上的pixel中心和纹理上的texel中心并不一至(pixel不一定对应textur ...
- OpenGL ES学习笔记(三)——纹理
首先申明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. <OpenGL ES学习笔记( ...
随机推荐
- 餐厅点餐系统app第二天
队友: 郭志豪:http://www.cnblogs.com/gzh13692021053/ 杨子健:http://www.cnblogs.com/yzj666/ 刘森松:http://www.cnb ...
- Singleton模式——对象创建型模式
Singleton模式即为单例模式/单件模式. (一)意图--保证一个类仅有一个实例,并提供一个访问它的全局访问点. 如一台计算机可以有多个端口,但是应该统一管理这些端口,避免访问冲突.--选择Sin ...
- Start_Learning_Python 03 条件、循环
if循环 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 条件语句和循环语句可以有 else 子句,它在穷尽列表(以for循环)或条件变为 false ...
- BZOJ1082: [SCOI2005]栅栏 题解
题目大意: 有一些木材,可以没有浪费地将一根木材分成几块木板(比如长度为10的木板可以切成长度为8和2的两块木板).现在你希望得到一些长度的木板,问通过分割木材最多能得到几块想要的木板. 思路: 首先 ...
- 如何提升 service 等级,不被kill(整合)
(1)在应用退到后台后,另起一个只有1像素的页面停留在桌面上,让自己保持前台状态,保护自己不被后台清理工具杀死. (2)用Foreground Service. 参考地址:Android Servic ...
- BZOJ1443: [JSOI2009]游戏Game
如果没有不能走的格子的话,和BZOJ2463一样,直接判断是否能二分图匹配 现在有了一些不能走的格子 黑白染色后求出最大匹配 如果是完备匹配,则无论如何后手都能转移到1*2的另一端,故先手必输 否则的 ...
- BZOJ2190: [SDOI2008]仪仗队
Description 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是 ...
- Node.js的DES加解密和MD5加密
最基本的就是经常用的md5加密算法 代码如下 var MD5=function (data) { var _encrymd5 = require('crypto').createHas ...
- js正则验证之不能使用相同字符
在我们的前端开发中,为了不让用户输入相同的密码字符以提高其安全性,我们会写一个js方法来实现这个功能.接下来,我就来实现这个方法,有其他好的解决办法,敬请留言,博主必定向其学习. function _ ...
- CSS的class、id、css文件名的常用命名规则
CSS的class.id.css文件名的常用命名规则 (一)常用的CSS命名规则 头:header 内容:content/container 尾:footer ...