抗锯齿最佳实践

Qt Quick 3D 有多种方法可以在渲染 3D 模型时消除锯齿(边缘锯齿)。每种技术都有各自的优点和局限性。多种技术可以结合使用,但需要付出额外的性能代价。

一般的锯齿

当原始图像中的信息多于我们能在屏幕上用像素表示的信息时,就会出现混叠现象。抗混叠技术可分为三类:

  • 寻找单个像素的额外信息并同时将其全部呈现出来的技术。
  • 图像特效,试图找出问题所在,并将问题掩盖起来。
  • 艺术家使用的试图解决限制问题的技术。

虽然抗锯齿是渲染图形的有用工具,但如果使用不当,可能会影响应用程序的性能。下文将介绍几种不同的抗锯齿技术供您选择。了解哪种技术最适合解决您的问题,将有助于在视觉质量和足够的渲染速度之间取得平衡。

几何图形抗锯齿

默认情况下,所有几何图形都是以一个屏幕像素为单位进行渲染的。如下图左侧所示,在高对比度的情况下,这可能会留下刺眼的边缘,在黑白图像中最为明显。

减少几何图形混叠的有效技术

最正确的解决方法是使用多采样抗混叠,因为它只在需要时收集更多几何细节。使用时序抗混叠渐进抗混叠也能以正确的方式缓解这一问题。

最后,在某些情况下,您可以使用剪影不透明度贴图来平滑几何图形的边缘。

纹理抗混叠

当对纹理进行子采样时,显示的像素数会少于原始像素数,从而根据所选像素产生不理想的伪影。当模型移动时,由于在不同的时间选择了不同的像素,这种效果会更加明显。在下图中,请注意 E3 和 F3 之间的线条是如何消失的,G3 和 H3 之间的线条又是如何出现的,接下来的 5 列又是如何消失的,以此类推。

减少纹理混叠的有效技术

解决这一问题最简单(也可以说是最好)的方法是在图像纹理中使用mipmapping。其他的解决方法包括使用时空均衡(Temporal AA)或渐进均衡(Progressive AA)从纹理中收集更多信息。

使用多重采样抗锯齿不会解决这个问题。

反射混叠

"纹理混叠"类似,反射环境的材质也会对图像进行子采样。在某些情况下,如下图左侧所示,当跳过精细细节时就会很明显。

减少反射混叠的有效技术

在这种情况下,最正确的解决方法是使用时空均衡( Temporal AA)或渐进均衡(Progressive AA)来查找额外的信息。

另一种可以接受的简单解决方案是使材质不那么光滑、更粗糙。在这种情况下,会自动使用分辨率较低的环境贴图,将清晰的细节融合在一起。

Qt Quick 3D 中的抗锯齿技术

注: 请查看抗锯齿示例场景效果示例,实时使用其中的一些功能。但请记住,现代窗口系统通常配置为在连接高分辨率屏幕时执行高 DPI 缩放。这意味着屏幕上显示的任何窗口内容都是以较高分辨率渲染的,然后由系统合成器或平台的其他组件进行缩放。这实际上是一种超采样抗锯齿技术。在Qt Quick 3D 中启用抗锯齿技术可能会显示较小的改进,有时甚至难以察觉,因为窗口系统的自动缩放功能已经在一定程度上消除了锯齿。但是,当在另一个系统上部署相同的应用程序时,该系统使用的平台或屏幕很可能不存在这种缩放功能,因此开箱即可看到更多的锯齿和锯齿边缘。建议开发人员考虑目标环境中可能存在或不存在高 DPI 缩放,并在实验和调整抗锯齿设置时考虑到这一点。

下面是Sponza场景在启用了某些抗锯齿方法后的渲染示例。这些截图是在窗口没有应用任何系统缩放(没有高 DPI 缩放)的情况下拍摄的,因此各种方法的效果更加明显。

使用的 AA结果
无 AA

超采样 AA,高(1.5 倍)

多采样 AA,高(4 倍)

FXAA

时间 AA,默认强度 (0.3)

多采样抗锯齿

多采样抗锯齿(MSAA)在View3D 项目的色彩缓冲区上运行(默认值),如果使用的是Offscreen 以外的renderMode ,则在整个Qt Quick 窗口上运行 (QQuickWindow,QQuickView,Window,ApplicationWindow)。

几何图形的边缘会进行超级采样,从而使轮廓更加平滑。不过,这种技术对几何体内部的材质没有影响。

  • 优点对几何体轮廓的效果很好,因为在几何体轮廓中,混叠现象往往最明显。可顺利运行快速动画。许多最新的 GPU 都支持 2 倍或 4 倍 MSAA,不会出现任何性能问题。
  • 缺点:使用成本可能较高,尤其是在较旧的移动和嵌入式硬件上。无法解决纹理或反射问题。

View3D 使用Offscreen 的默认renderMode 时,View3D 本身可完全控制多重采样抗锯齿。应用程序可通过与View3D 关联的环境(SceneEnvironmentExtendedSceneEnvironment )的antialiasingModeantialiasingQuality 属性进行配置。

下面的示例请求使用常用的 4x MSAA,因为 antialiasingQuality 默认为SceneEnvironment.High

View3D {
    environment: SceneEnvironment {
        antialiasingMode: SceneEnvironment.MSAA
    }
}

MSAA 并非由 Qt 本身实现,而是由底层 3D API 执行。因此,不同硬件及其 3D API 实现的性能和质量可能会有所不同。

时间抗锯齿

时态抗锯齿对View3D 的色彩缓冲区进行操作。摄像机会在帧与帧之间轻微抖动,每一帧的结果都会与前一帧混合。

  • 优点由于摄像头的抖动,它能发现原本丢失的真实细节。对性能影响小。
  • 缺点:快速移动的物体会造成单帧重影。

时间 AA 与多采样 AA 结合使用时没有效果。但它可以与渐进 AA 结合使用。

要控制时间抗锯齿,请使用环境的temporalAAEnabledtemporalAAStrength 属性。

View3D {
    environment: SceneEnvironment {
        temporalAAEnabled: true
    }
}

渐进式抗锯齿

渐进式抗锯齿对View3D 的色彩缓冲区进行操作。当View3D 渲染的场景中的所有内容都停止移动后,摄像机会在帧与帧之间进行轻微抖动,然后将每一帧的效果与前一帧的效果混合在一起。帧数越多,效果越好。

  • 优点提供细致的静态图像,无性能代价。
  • 缺点:如果发生任何视觉变化,则不会生效。8 倍 PAA 需要八分之一秒的时间来完成渲染(60fps),这可能会引起注意。
View3D {
    environment: SceneEnvironment {
        antialiasingMode: SceneEnvironment.ProgressiveAA
    }
}

使用antialiasingQuality 控制混合在一起的帧数(2、4 或 8)。

超级采样抗锯齿

超级采样抗锯齿对View3D 的色彩缓冲区进行操作。这需要创建一个大于正常大小的色彩缓冲区(纹理),然后对其进行降采样。这意味着资源使用量的增加,而且在较大尺寸时,缩放操作的成本会很高。

  • 优点提供全场景抗锯齿,对动画没有限制。
  • 缺点:当你的场景已经受到图形系统填充率的限制时,特别是在较旧的移动和嵌入式硬件上,可能会严重降低性能。
View3D {
    environment: SceneEnvironment {
        antialiasingMode: SceneEnvironment.SSAA
    }
}

使用antialiasingQuality 控制大小乘数(1.2、1.5 或 2.0)。

贴图

Mipmapping 可存储纹理及其预先计算的低分辨率版本。每当以较小尺寸显示纹理时,渲染系统会自动使用这些低分辨率图像(将许多细节合并到较少的像素中)。

  • 优点对性能影响小。大大提高纹理的图像质量。
  • 缺点:需要花费大量成本生成 mipmap 链,或使用某些图像容器格式,在图像资产中预先生成 mipmap 图像。与不使用 mipmap 的相同图像相比,要多占用 33% 的显存。

要让 Qt 为Texture 生成 mipmaps 并在图形着色器中执行纹理采样时启用使用 mipmap 链,请设置mipFiltergenerateMipmaps 属性。

Texture {
    source: "image.png"
    mipFilter: Texture.Linear
    generateMipmaps: true
}

镜面抗锯齿

启用 "镜面抗锯齿 "可减少镜面光照产生的伪影。这些伪影通常表现为亮点状,可能会有闪烁的外观。

禁用镜面反射抗锯齿启用镜面反锯齿

View3D {
    environment: SceneEnvironment {
        specularAAEnabled: true
    }
}

注意: 外观非常光滑的材质在启用镜面反射 AA 后,其外观可能会发生变化,就好像其表面为more rough 。这是底层照明计算的结果。

快速近似抗锯齿

ExtendedSceneEnvironment 提供了另一种后处理效果形式的抗锯齿方法。要启用 FXAA,请将 设置为 true。fxaaEnabled

import QtQuick3D.Helpers

View3D {
    environment: ExtendedSceneEnvironment {
        fxaaEnabled: true
    }
}

艺术家就业作弊器

剪影不透明度贴图

当你的模型具有一致的轮廓时,你可以应用不透明度贴图,使几何体的外边缘透明。使用渐变的不透明度可以让物体的边缘平滑地消失。不过,即使您的不透明度贴图在一个像素的空间内从完全不透明直接过渡到完全透明,其结果仍会提供如上例所示的反锯齿边缘。这是因为图像贴图(包括不透明度贴图)使用了双线性插值。

  • 优点可以显示比普通 AA 更柔和的过渡。可按模型而不是按图层应用。
  • 缺点:如果对象的轮廓会发生变化,则无法使用。使用透明度的多个重叠模型会消耗填充率性能,而填充率性能通常是非常重要的。

修改材质或几何图形

如上图中的反射别离效果所示,有时最简单的解决问题的方法就是更改图样。如果你的模型角落出现了令人分心的镜面反射,不妨问问自己:我能让材质更柔和吗?能否修改几何形状以平滑或改变反射角度?能否编辑环境贴图以减少锐利的过渡?

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.