# 简单插值渲染纹理得到的效果

右图远处会产生摩尔纹,近处会产生锯齿 产生的原因:远处一个像素覆盖了纹理上很大一块区域 如果这时候还用类平均来计算,当然是不对的。但是如果每个像素里面的采样点增加到很大 (超采样), 也可以得到不错的结果.(当然不是好办法)

走样是怎么来的呢?

  • 信号变化速度过快
  • 很大的采样区域,但是采样点很少
  • 需要更高频的采样 (一个像素内取很多点进行采样)

但是上述方法消耗极大,为了避免采样,使用 MipMap 进行范围查询. MipMap 几个特性 (fast,approx (不准),squra), 只能用于近似正方形的范围查询 MipMap 就是从一张图生成一系列图,每层都是上层分辨率的一半 比原来多了 1/3 的内存

# 采样方法

先计算采样等级
计算采样等级,我们就需要计算在实际像素点上移动一段距离,对应在纹理上需要移动多少距离 如上图所示,fracdudx\\frac{du}{dx}fracdvdy\\frac{dv}{dy} 的计算来源是这样的:

  • 所以咋来的???感觉理解了又说不出来

但是一个最简单的计算这个范围的方法就是在 UV 坐标下计算出这个 L (以 L 作为边长), 公式和图中类似,但是需要先计算出像素点映射到贴图上的 UV 坐标 然后我们可以计算出 mipmap 等级 D=log_2LD = log\_{2}L 因为 mipmap 每层会降低四倍,所以对边长开方就等于最后计算得到的 mipmap 层数。为啥呢 因为 面积 S=L2S=L^2 如果 L=1, 那么只需要在第一层 mipmap 上查询即可,
如果 L=2, 那么 S=4, 当走到第二层 mipmap 时,S/4=1, 这时就在第二层上查找,即 D=log_4S=log_2LD = log\_{4}S=log\_{2}L 即求该区域在第几层查询时会变成一个像素大小 如果计算出 1.8 层之类的,那么在两层之间做两次双线性插值就可以了

# 但 mipmap 无法解决问题

即够远的地方会发生过度模糊,而且只能查询方块区域

# 各向异性过滤

各向异性

各个方向上的表现不同

各向异性会生成下面这些图,横向只有 x 轴压缩,纵向只有 y 轴压缩,取极限 无论开多少层 开销都是原来的三倍,又叫 (Ripmap) 为什么可以解决呢?因为从世界空间映射到纹理空间可能得到的实际范围是一个斜的长方形或者其它形状 各向异性过滤可以解决这些长条的问题,但是各向异性过滤没有办法解决那个斜的长方形.

# EWA 过滤

这会又拆成了圆形,但是需要多次查询.

更新于

请我喝[茶]~( ̄▽ ̄)~*

Solvarg 微信支付

微信支付

Solvarg 支付宝

支付宝

Solvarg 贝宝

贝宝