» 您尚未登录:请 登录 | 注册 | 标签 | 帮助 | 小黑屋 |


发新话题
打印

[其他] 问个科学性问题,关于游戏多边形画面过滤的

过滤主要分临近点,双线性,三线性,各向异性几种。
其中,后两种都是和MIP-MAP连用才能达到完整效果的技术。而前两种,既可以和MIP-MAP连用,也可以只在一个纹理平面上使用。而tri-linear其实就是在相邻两个mipmap平面上做bi-linear然后在之间再做linear。
mip-map chain是一系列尺寸成倍缩小的贴图链,作用主要是两个,一个是避免闪烁,另一个是提高性能。
闪烁的发生是因为bi-linear只能在2x2个图素(texel)之间做low-pass filter过滤,所以不适应缩小比率低过1/2的情况,在这种情况下,属于采样点不足所以出现运动中闪烁现象。
而提高性能主要是指降低texture cache miss的概率,因为如果纹理分辨率大大高于像素间UV密度,说明相邻像素需要采样的texel在内存里距离很远,因此可能每个像素的texture fetch都会导致一次cache flush和cache fetch。自然性能降低。
而mip-map的运作原理在于根据uv的dda信息(即相邻像素间uv差值),选择合适的mip-map层进行纹理取样,这样就不会出现上面提到的情况。
我们假设dda=2,代表相邻像素在最大纹理层上跨2个像素,因此此时应该选择比最大纹理层低一级的层做texture fetch,也就是mipmap层的选择是和log2(dda)相关的。
而tri-linear与anisotropic的最大差别在于mip-map的选择逻辑。因为uv一般都有两个方向——u方向和v方向,而这两个方向的dda值往往是不同的,对于tri-linear来说,它会选择ddu,ddv两个值中的较大值作mipmap层次选择,比如dda(u) = 1,dda(v) = 4,那么它会选择4,也就是长宽为1/4的层来做纹理读取,但显而易见,这样一来,u方向就会发生欠采样现象,也就是常说的模糊出现了。
而对于anisotropic来说,它的选择公式是形如max((max(log2(ddu),log2(ddv))-log2(anisotropic_level)),0)这样的,也就是上面那种情况,如果max anisotropic level>=4,它就会选择最大尺寸的纹理层来做纹理读取,同时,它会以8x2个texel来做filter,这样一来同时也就避免了采样不足的闪烁现象。

简单归纳一下,如果只用bi-linear,而贴图尺寸又明显大于像素间uv密度(除了由模型自身制作的因素外,更由输出分辨率,摄像机远近等要素决定)则一动就闪烁。
如果用tri-linear而且mipmap又是完整的,那么如果uv两个方向密度不同,就会在一个方向上发生模糊的现象,这是因为选择了相对另一个方向解析度过低的贴图原因,如果强行调整mipmap_lod_bias使之选择高分辨率纹理层,则又在uv中密度较低的方向上发生闪烁。
只有使用anisotropic filter,同时把anisotropic level定得比较高,才能同时解决闪烁和模糊的现象。
当然,如果原始贴图分辨率就不足,那就怎么折腾都没辙了,或者模型拉得过近,或分辨率过高,那么除了使用完全编程化的像素空间过程纹理外,没有其他办法。

[ 本帖最后由 hourousha 于 2012-2-20 11:08 编辑 ]


本帖最近评分记录
  • dragonzet 激骚 +3 精品文章 2012-2-20 17:17

TOP

发新话题
     
官方公众号及微博