纹理过滤是抗锯齿技术吗?

问题描述

我知道MSAA的抗锯齿技术,但是MSAA只能处理边缘,而Shader采样可以处理内部像素。

纹理过滤和着色器采样之间有什么区别?它是否也是一种抗锯齿技术,例如Bilinear,Trilinear,它可以使图像看起来更平滑?

解决方法

Multisample Anti-aliasing MSAA )专为帧缓冲区设计并解决了一个问题-几何角(像素化/锯齿状三角形或线边界)上的混叠问题。无法将MSAA纹理(以直接方式)用于3D对象的纹理化。 jagged sharp edges

Texture filtering 是一种更通用的工具,旨在解决将2D图像映射到3D几何图形时的锯齿和模糊问题。 Trilinearanisotropic过滤器使用Mip贴图(一连串的降采样图像)。

Anisotropic texture filtering

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

除MSAA外,还可以通过 Super-Sampling Anti-aliasing SSAA )技术完成帧缓冲区的抗锯齿功能-该技术基本上将场景渲染到较大的屏幕外帧缓冲区中分辨率,然后使用双线性纹理过滤器(显然,三线性过滤对于拉伸2D矩形没有用)或其他下采样过滤器将其调整为屏幕分辨率。屏幕外缓冲区的分辨率也可能小于屏幕分辨率,在这种情况下,可以将双线性纹理滤镜用于放大图像(产生模糊结果)。

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

当将渲染到MSAA 帧缓冲区中时,现代API具有称为 Sample Shading (在Vulkan中为sampleShadingEnable,在OpenGL 4.0+中为GL_SAMPLE_SHADING)的选项。此选项要求渲染器在MSAA样本中真正执行Fragment Shader,实际上是从MSAA制作SSAA。 minSampleShadingFactor选项控制真实计算的样本与蒙版样本之间的比率,因此1.0表示所有计算的样本(如SSAA)和较小的比率将SSAA和MSAA技术混合使用-作为性能的折衷方案(例如8个MSAA,比率为0.5 =对多边形内部和外部进行抗锯齿的4个真正计算的样本,另外4个仅用于锯齿锯齿边缘的抗锯齿的样本。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...