转载自 纹理基础知识和过滤模式详解
1. 为什么在纹理采样时候需要 texture filter (纹理过滤)
我们的纹理 要贴到三维图形表面,而三维图形上的pixel中心与纹理上的texel中心并不一致(pixel不一定对应texture上的采样中心texel).大小也不一定一致.
- 当纹理大于三维图形表面时,导致一个像素被映射到许多纹理像素上.
- 当纹理小于三维图形表面时,导致许多个像素都映射到相同纹理.
当这些情况发生时,贴图就会发生模糊或者发生错误.要解决此类问题.必须通过技术平滑texel和pixel之间的对应关系.这种技术叫做纹理滤波.
不同的过滤模式,计算复杂度不一样.会得到不同的效果.
过滤模式由简单到复杂包括:
- 最近邻插值采样 (Nearest Point Samplir)
- 双线性过滤 (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. 什么是各向同性 和 各向异性 ?
各向同性
: 当需要贴图的三维表面 平行于屏幕, 则是各向同性的.
各向异性
: 当要贴图的三维表面与屏幕有一定角度的倾斜,则是各向异性的.
也可以这样理解,当一个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。
8. 各过滤模式性能比较
下表是各种过滤模式 采一个pixel需要sample的次数:
一般而言,采样数越多,效果最好,但具体使用时要综合考虑性能。
过滤模式 | 采样数 |
---|---|
Nearest Point Sampling | 1 |
Bilinear | 4 |
Trilinear | 8 |
Anisotropic Filtering 4X | 32 |
Anisotropic Filtering 16X | 128 |