转载自:http://www.cnblogs.com/cxrs/archive/2009/10/18/JustAProgramer.html

1、 为什么在纹理采样时需要texture filter(纹理过滤)。

我们的纹理是要贴到三维图形表面的,而三维图形上的pixel中心和纹理上的texel中心并不一至(pixel不一定对应texture上的采样中心texel),大小也不一定一至。当纹理大于三维图形表面时,导至一个像素被映射到许多纹理像素上;当维理小于三维图形表面时,许多个象素都映射到同一纹理。

当这些情况发生时,贴图就会变得模糊或发生错位,马赛克。要解决此类问题,必须通过技术平滑texel和pixel之间的对应。这种技术就是纹理滤波。

不同的过滤模式,计算复杂度不一样,会得到不同的效果。过滤模式由简单到复杂包括:Nearest Point Sampling(最近点采样),Bilinear(双线性过滤)、Trilinear(三线性过滤)、Anisotropic Filtering(各向异性过滤)。

在了解这些之前,有必要了解什么是MipMap和什么时各向同性,各向异性。

2、 什么是MipMap?

Mipmap由Lance Williams 在1983的一篇文章“Pyramidal parametrics”中提出。Wiki中有很详细的介绍(http://en.wikipedia.org/wiki/Mipmap ) . 比如一张256X256的图,在长和宽方向每次减少一倍,生成:128X128,64X64,32X32,16X16,8X8,4X4,2X2,1X1,八张图,组成MipMap,如下图示。

Mipmap早已被硬件支持,硬件会自动为创建的Texture生成mipmap的各级。在D3D的API:CreateTexture中有一个参数levels,就是用于指定生成mipmap到哪个级别,当不指定时就一直生成到1X1。

3、 什么是各向同性和各向异性?

当需要贴图的三维表面平行于屏幕(viewport),则是各向同性的。当要贴图的三维表面与屏幕有一定角度的倾斜,则是各向异性的。

也可以这样理解,当一个texture贴到三维表面上从Camera看来没有变形,投射到屏幕空间中后U方向和V方向比例仍然是一样的,便可以理解成各向同性。反之则认为是各向异性。

4、 Nearest Point Sampling(最近点采样)

这个最简单,每个像素的纹理坐标,并不是刚好对应Texture上的一个采样点texel,怎么办呢?最近点采样取最接近的texel进行采样。

当纹理的大小与贴图的三维图形的大小差不多时,这种方法非常有效和快捷。如果大小不同,纹理就需要进行放大或缩小,这样,结果就会变得矮胖、变形或模糊。

5、 Bilinear(双线性过滤)

双线性过滤以pixel对应的纹理坐标为中心,采该纹理坐标周围4个texel的像素,再取平均,以平均值作为采样值。

双线性过滤像素之间的过渡更加平滑,但是它只作用于一个MipMap Level,它选取texel和pixel之间大小最接近的那一层MipMap进行采样。当和pixel大小匹配的texel大小在两层Mipmap level之间时,双线性过滤在有些情况效果就不太好。于是就有了三线性过滤。

6、 Trilinear(三线性过滤)

三线性过滤以双线性过滤为基础。会对pixel大小与texel大小最接近的两层Mipmap level分别进行双线性过滤,然后再对两层得到的结果进生线性插值。

三线性过滤在一般情况下效果非常理想了。但是到目前为止,我们均是假设是texture投射到屏幕空间是各向同性的。但是当各向异性的情况时,效果仍然不理想,于是产生了Anisotropic Filtering(各向异性过滤)。

7、 Anisotropic Filtering(各向异性过滤)

先看效果,左边的图采用三线性过滤,右边的图采用各向异性过滤。

各向同性的过滤在采样的时候,是对正方形区域里行采样。各向异性过滤把纹理与屏幕空间的角度这个因素考虑时去。简单地说,它会考滤一个pixel(x:y=1:1)对应到纹理空间中在u和v方向上u和v的比例关系,当u:v不是1:1时,将会按比例在各方向上采样不同数量的点来计算最终的结果(这时采样就有可能是长方形区域)。

我们一般指的Anisotropic Filtering(AF)均是基于三线过滤的Anisotropic Filtering,因此当u:v不为1:1时,则Anisotropic Filtering比Trilinear需要采样更多的点,具体要采多少,取决于是多少X的AF,现在的显卡最多技持到16X AF。

当开启16X AF的时候,硬件并不是对所有的texture采样都用16X AF,而是需要先计算屏幕空间与纹理空间的夹角(量化后便是上面所说的u:v),只有当夹角大到需要16X时,才会真正使用16X.

如果想了解AF的实现原理,可以查阅此篇Paper: “Implementing an anisotropic texture filter”. 现在AF都是硬件实现,因此只有少数人才清楚AF就尽是怎样实现了(其实细节我也没搞清楚),其实完全可以由Pixel Shader来实现AF,当然性能和由硬件做是没得比的。

8、 各过滤模式性能比较。

下表是各种过滤模式采一个pixel需要sample的次数:

Sample Number

Nearest Point Sampling

1

Bilinear

4

Trilinear

8

Anisotropic Filtering 4X

32

Anisotropic Filtering 16X

128

Anisotropic Filtering 16X效果最好,但是显卡Performance会下降很多,当然也是测试你手中显卡Texture Unit的好方法。如果你觉得你的显卡够牛,那么就把AA和AF都打到最高再试试吧:)

转载于:https://www.cnblogs.com/zengqh/archive/2012/12/30/2840009.html

纹理过滤模式中的Bilinear、Trilinear以及Anistropic Filtering相关推荐

  1. 【杂记】过滤模式中的Bilinear、Trilinear以及Anistropic Filtering 以及比较

    设置纹理采样模式主要是通过SetSamplerState函数来实现,这个函数有三个参数,第一个参数代表着定点中的不同采样单元,(顶点着色器中的对多个纹理单元的使用,一般demo只用一个纹理,所以这个参 ...

  2. OpenGL 纹理过滤和 mip 贴图

    一.概念 1. 纹理过滤 当纹理贴到具体像素上时,像素需要到纹理图像中进行采样,这个过程称为纹理过滤. 纹理过滤通常有两种情况:放大(GL_TEXTURE_MAG_FILTER)和缩小(GL_TEXT ...

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

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

  4. 图形学常见概念与算法-纹理过滤

    目录 什么是纹理过滤 OpenGL中如何设置 多级渐远纹理 什么是纹理过滤 缩小或放大纹理时,一个像素会被放到几个像素的位置,或者几个像素放到一个位置,怎样去融合就是texture filtering ...

  5. 纹理基础知识和过滤模式详解

    转载自 纹理基础知识和过滤模式详解 1. 为什么在纹理采样时候需要 texture filter (纹理过滤) 我们的纹理 要贴到三维图形表面,而三维图形上的pixel中心与纹理上的texel中心并不 ...

  6. 纹理过滤中的双线,三线过滤

    2019独角兽企业重金招聘Python工程师标准>>> 为什么在纹理采样时需要texture filter(纹理过滤). 我们的纹理是要贴到三维图形表面的,而三维图形上的pixel中 ...

  7. OpenGL之纹理过滤的四种方式

    I.纹理过滤: 当三维空间里面的多边形经过坐标变换.投影.光栅化等过程,变成二维屏幕上的一组象素的时候,对每个象素需要到相应纹理图像中进行采样,这个过程就称为纹理过滤. II.纹理过滤通常分为2种情况 ...

  8. 【转】glTexImage2D()和gluBuild2DMipmaps() [将载入的位图文件(*.bmp)转换成纹理贴图]+glTexParameteri()纹理过滤函数...

    glTexImage2D()和gluBuild2DMipmaps() 说明:两者的都是生成纹理,即:将载入的位图文件(*.bmp)转换成纹理贴图. glTexImage2D()的用法举例 glTexI ...

  9. OpenGL之纹理过滤(Texture Filtering)、MipMap方法、纹理坐标

    1.1 纹理过滤 像素.片元都是具有面积的,一个像素可能对应物体上的一小块区域,而物体上这个小区域对应于纹理图像上的一个小区域,因此一个像素的颜色可能来自于纹理中的一小个不规则区域,如果纹理的分辨率比 ...

最新文章

  1. python中的re模块——正则表达式
  2. python生成指定位数随机数_python生成指定长度的随机数密码
  3. 设计模式C++实现(3)——装饰模式
  4. c语言limits.h_ (limits.h)C ++中(整数类型的大小)的宏常量
  5. 向窗口发送ctrl c复制 消息
  6. Ubuntu 安装MySQL报共享库找不到
  7. 如何用python完成基本统计信息计算_如何用python计算基本统计值?
  8. 概率论与数理统计(3)--指数分布函数及其期望、方差
  9. 深圳大学使用路由器登陆校园网,openwrt登陆drcom,d版教程
  10. matlab 投票法_二维解析张量投票算法研究
  11. 让你秒读懂阿里云数据库架构与选型
  12. WebAssembly 实践:如何写代码
  13. 对于服务治理概念的一些总结和理解,我们应该如何实践服务治理
  14. 阿里云视频点播视频播放出现network timeout问题处理
  15. Python实战采集全球疫情数据
  16. 超级总结:vs2008/2005 sp1 C++ 发布程序 .
  17. 【INDEMIND相机运行SLAM】
  18. mlag 堆叠_三分钟了解VRRP、堆叠、M-LAG这三大虚拟化技术
  19. 【python与数据分析】Pandas统计分析基础
  20. comsol和java_Comsol Java API

热门文章

  1. 深度学习:推动NLP领域发展的新引擎
  2. 几款开源的数据挖掘工具
  3. Android Jetpack - Emoji表情符号初探
  4. Spring Security(一):整合JWT
  5. bzoj千题计划237:bzoj1492: [NOI2007]货币兑换Cash
  6. JSPDF运用实例(解决图片跨域问题)
  7. Proguard混淆代码(1)
  8. lvs在nat dr tun 模型的实现
  9. c++仪表盘。。。附源码
  10. IPv6的脚步声近了!