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

如何解决纹理过滤是抗锯齿技术吗?

我知道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个仅用于锯齿锯齿边缘的抗锯齿的样本。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?