-1

我知道使用 MSAA 的抗锯齿技术,但 MSAA 只能处理边缘,但着色器采样可以处理内部像素。

纹理过滤和着色器采样有什么区别,是不是也是一种抗锯齿技术,比如Bilinear,Trilinear,让图像看起来更平滑?

4

1 回答 1

3

Multisample Anti-aliasing ( MSAA ) 专为帧缓冲区设计并解决一个问题 - 几何角上的锯齿问题(像素化/锯齿状三角形或线条边界)。MSAA 纹理不能(以直接的方式)用于纹理 3D 对象。 锯齿状锋利边缘

纹理过滤是一种更通用的东西,旨在解决将 2D 图像映射到 3D 几何图形时出现的锯齿和模糊问题。三线性各向异性过滤器使用 mip-maps(下采样图像的级联)。

各向异性纹理过滤

纹理过滤通常会在纹理几何体中产生抗锯齿结果,但几何角上的锯齿有不同的来源,无法通过使用更好的纹理过滤算法来消除 - 这就是为什么 MSAA 和纹理过滤在 3D 引擎中独立应用的原因。

除了 MSAA,帧缓冲区抗锯齿可以通过超级采样抗锯齿( SSAA ) 技术完成 - 它基本上将场景渲染到更高分辨率的屏幕外帧缓冲区,然后使用双线性纹理过滤器(显然,三线性过滤不适用于拉伸 2D 矩形)或其他下采样过滤器。屏幕外缓冲区的分辨率也可能比屏幕分辨率小,在这种情况下,可以应用双线性纹理过滤器来放大图像(产生模糊的结果)。

MSAA在性能上以一个令人讨厌的技巧胜过 SSAA - 虽然 SSAA 确实为每个片段计算多个样本,但 MSAA 每个片段仅评估片段着色器阶段一次。因此片段中的每个样本最初都具有相同的颜色(包括从片段着色器中的纹理检索的颜色),但是每个样本的深度值会有所不同,并且每个样本将单独测试/与 MSAA 帧中的相应样本混合缓冲。这就是为什么 MSAA 有助于多边形边缘的抗锯齿,但对多边形的内部没有影响。片段着色器discard关键字也不会从 MSAA 缓冲区中的额外样本中受益,因为所有样本都被丢弃或不立即丢弃(产生锯齿状边缘)。

渲染到 MSAA帧缓冲区时,现代 API 有一个称为样本着色的选项(Vulkan 中的sampleShadingEnable,OpenGL 4.0+ 中的 GL_SAMPLE_SHADING)此选项要求渲染器在 MSAA 样本中真正执行片段着色器,实际上是从 MSAA 生成 SSAA。选项控制真正计算的样本和掩码样本之间的比率,因此 1.0 意味着计算的所有样本(如 SSAA)和较小的比率将混合 SSAA 和 MSAA 技术 - 作为性能折衷(例如 8 MSAA 与 0.5 比率 = 4 个真正计算的样本多边形内部和外部的抗锯齿以及另外 4 个仅用于锯齿边缘抗锯齿的样本)。minSampleShadingFactor

于 2020-09-24T12:33:43.827 回答