美文网首页
图形学自问自答3——反走样和纹理过滤

图形学自问自答3——反走样和纹理过滤

作者: 太刀 | 来源:发表于2020-12-28 21:59 被阅读0次
新长征路上的摇滚

1.多重采样MSAA和超SSAA采样有什么区别?

MSAA 和 SSAA 都是反走样(抗锯齿)的手段,具体实现原理有差别。

1.1 SSAA(Super-Sample Anti-Aliasing)原理:

以一个更大的分辨率来渲染场景,然后再把相邻像素值做一个过滤(比如平均等)得到最终的图像(Resolve)。以2倍SSAA 为例,在以 1024x1024 的像素渲染画面时,会以 2048x2048 的分辨率生成缓冲区,缓冲区中的每一个片元都会执行一遍片元着色器,最后再把原本属于一个片元的4个子片元的颜色进行计算得到实际片元的颜色。

  • 实际片元如何生成4个子片元?

最常用的一种方法是平均取4个点,也有很多其它的算法,包括随机生成等。如图:


子片元生成方法
  • 4个子片元的颜色如何得到实际片元的颜色
    最常用的是取平均值

1.2 MSAA(Multiple-Sample Anti-Aliasing)原理:

和SSAA类似,2倍MSAA为例,每个实际片元也生成4个子采样点,也需要使用一个更大分辨率的缓冲区来存放子采样点的颜色。与 SSAA 的差别在于,并不是每个子采样点都会执行片元着色器。而只有实际片元会执行片元着色器,若子采样点被覆盖,则该子采样点的颜色被设置为实际片元执行片元着色器得到的颜色,同时需要记录每个子采样点是否被覆盖,以及覆盖该子采样点的深度值。最终由硬件将子采样的的颜色值计算得到片元的实际颜色。


多重采样简单过程
  • 子片元生成和实际片元颜色计算
    基本和 SSAA 一样,有多种生成子片元的方法,颜色计算的方法通常是取平均值。

2. 纹理的 FilterType 选项是什么意思?

常用的引擎(Unity、Cocos Creator)等,纹理设置都有 FilterType 这个设置,通常的选项是以下几种:

  • Point
  • Bilinear
  • Triliner

我们知道,屏幕是由若干个像素组成,像素是一个有大小的“格子”。而纹理也是由若干个纹素组成,纹素同样是“格子”。当渲染一张纹理到屏幕时,最理想的情况是,渲染区域分辨率和纹理本身的分辨率一样,也就是说纹素正好和像素一一对应。这种理想情况下,纹理采样时,像素中心的 uv 坐标应该正好落在某一个纹素的中心,可以直接取这个纹素的颜色作为像素的颜色。
然而大部分情况下,纹理和渲染区域不具有相同分辨率,此时像素中心点的uv坐标不会落在纹素的中心,此时该如何确定像素的颜色会得到更好的显示效果呢?

  • 纹理尺寸过小
    纹理尺寸过小时,多个像素的纹理坐标会映射到同一个纹素,出现锯齿或模糊
  • 纹理尺寸过大
    一个像素覆盖了多个纹素,此时怎么根据多个纹素来确定像素的颜色呢?通常取距离uv坐标最近的纹素作为采样结果,这会出现摩尔纹现象。
    FilterType 的设置就是用来确定当渲染区域和纹理的分辨率不一样时,如何确定像素的颜色,选择合适到 FilterType 能够得到更好到显示效果。

2.1 Point 最近点采样

  • 采样策略:
    使用距离纹理坐标最近的纹素作为该像素的采样结果。
  • 优点:
    每个像素只需一次采样,速度快。
  • 缺点:
    显示区域与纹理尺寸不同时,采样结果就会变形或模糊。

2.2 Bilinear 双线性过滤

  • 采样策略:
    以纹理坐标为中心,取该纹理坐标周围4个纹素,再取平均作为该像素采样结果。
  • 优点:
    像素之间的过渡更加平滑,一定程度上改善模糊效果。
    *缺点:
    只作用于一个MipMap Level,选取但是纹素和像素大小最接近但那一层 MipMap 进行采样,当像素实际大小接近两层MipMap中间时,有些情况效果不太好。


    双线性采样示意

2.3 Trilinear 三线性过滤

  • 采样策略:
    选取与像素实际大小接近的两层 MipMap,分别进行一次双线性采样,针对两个采样结果进行线性差值,得到最终结果。
  • 优点:大部分情况下效果理想,特别是纹理尺寸比显示区域大的情况下,可以有效避免摩尔纹的产生。
  • 缺点:需要开启 MipMap,在未开启 MipMap 的情况下,将退化为双线性采样;
    采样次数较多,性能消耗大。
三线性过滤示意图

相关文章

网友评论

      本文标题:图形学自问自答3——反走样和纹理过滤

      本文链接:https://www.haomeiwen.com/subject/mvfxoktx.html