与人不求备,检身若不及。 ——《尚书·伊训》。
与人:对于别人。备:完备,十全十美。检身:检在自己。不及:不够。这两句大意是:对于别人不求全责备.检查自己总觉得像是有某些不足。这两句是说对待别人.不应过于苛求.要看到人家的长处,优点;而对待自己要严格.要经常认识自己的不足,这样才指保持谦虚、谨慎.既能学到别人的长处,又能克服自身的缺点。然而在现实生活中,人们往往过分地苛求别人,过高地估计自己。因此,熟记这个名句,常常对照检查自己,是会受益非浅的。可供论述严以律己、宽以待人时引用。
纹理过滤
什么是纹理过滤?
Direct3D将2D或者3D的图形,通过坐标变化映射到屏幕上,当使用纹理在渲染的时候,就是使用纹理为二维屏幕的每个像素进行着色,这里的每个像素都包含一个来自纹理的颜色值,而从纹理中为每个像素获取颜色的过程,就是纹理过滤(texture filtering)。
为什么需要纹理过滤?
一般情况,屏幕显示的图形大小与纹理贴图大小是不同的,也就是说,纹理会被映射到比它本身大或者小的图元上,这样就会导致纹理会放大或者缩小。
放大会导致一个纹理像素被映射到多个图元像素,这样会导致色块现场。
缩小会导致多个纹理像素被映射到一个图元像素,这样会导致闪烁失真或者锯齿。
为了解决这些问题,有四种纹理过滤方式。
-
最近点采样过滤 (nearst-point sampling)
选择中心点最接近纹理坐标的那个像素,也是最简单的纹理过滤方式,只需要一次采样,效率最高
-
线性纹理过滤(linear texture filtering)
选择中心点周围的4个纹素加权计算出来,需要4次采样。
-
三线性纹理过滤
在双线性过滤中只选取了 texel 和 pixel 之间大小最接近的一层 mipmap 进行采样,而三线性则是分别对texel 与 pixel 最接近的两层 mipmap 进行双线性采样然后再将这两层的结果进行线性插值。
-
各向异性过滤(anisotropic texture filtering)
之前的几种纹理过滤方式都是各向同性,也就是他们在纹理贴图时是默认贴图是平行于屏幕进行贴的,但实际是贴图会与屏幕有一定倾斜的。这个倾斜会导致投射到屏幕空间后U方向和V方向比例是不一样的,因此我们引入各向异性。与各向同性的mipmap中纹理都是正方形不同,各向异性过滤会按比例在各方向上采样不同数量的点来进行计算。
为了减小计算量,只有当屏幕空间与纹理空间的夹角到达一定程度时,才能进行各向异性过滤。
-
多级渐进过滤(texture filtering with mipmaps)
由一组分辨率主键降低的纹理序列组成,每一级纹理的宽度和高度都是上一级纹理的一般。纹理映射时,D3D自动选择衣服与物体大小相近的纹理进行渲染。
Tips
在D3D的API:CreateTexture中有一个参数levels,就是用于指定生成mipmap到哪个级别,当不指定时就一直生成到1X1
比较
各种过滤模式 采一个pixel需要sample的次数:
过滤模式 | 采样数 |
---|---|
Nearest Point Sampling | 1 |
Bilinear | 4 |
Trilinear | 8 |
Anisotropic Filtering 4X | 32 |
Anisotropic Filtering 16X | 128 |
最近点采样过滤
-
速度最快、效果最差
-
如果纹理和图元大小相近,采用最近点采样过滤对图像质量影响不大,如果相差太大,效果较差。
线性纹理过滤
- 使用最广泛
- 与最近点采样相比,有效的提高图像质量,资源消耗变动不大。
各向异性过滤
- 效果最好,计算量最大
多级渐进过滤
- 通常配合其他方式使用
多级渐进纹理过滤效果通常最好,与各向异性过滤联合使用效果更佳。但是资源最多,计算量最大。
API
SetSamplerState(DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value);
// 第一个参数:指定那一层纹理
// 第二个参数:用来指定对那种纹理采样属性来进行操作。
// 第三个参数:对第二个参数指定的属性进制设置。
Tips
各向同性
: 当需要贴图的三维表面 平行于屏幕, 则是各向同性的.
各向异性
: 当要贴图的三维表面与屏幕有一定角度的倾斜,则是各向异性的.也可以这样理解,当一个texture贴到三维表面上从Camera看来没有变形,投射到屏幕空间中后U方向和V方向比例仍然是一样的,便可以理解成各向同性。反之则认为是各向异性。
参考:
https://blog.csdn.net/sharp2wing/article/details/5683379
https://zhuanlan.zhihu.com/p/137242786