抗锯齿最佳实践
Qt Quick 3D 在渲染 3D 模型时,有多种方法可以消除锯齿(即边缘锯齿)。每种技术都有其独特的优势和局限性。可以结合使用多种技术,但这会带来额外的性能开销。
锯齿现象概述
当原始图像中包含的信息量超过屏幕像素所能呈现的范围时,就会产生锯齿现象。抗锯齿技术主要分为三类:
- 通过获取单个像素的额外信息,并将其全部同时呈现的技术。
- 试图找出画面质量不佳之处,并将问题“掩盖”起来的图像处理效果。
- 艺术家采用的技术,旨在绕过这些限制。
尽管抗锯齿是图形渲染中一项有用的工具,但如果使用不当,可能会影响应用程序的性能。以下各节介绍了几种可供选择的抗锯齿技术。了解哪种技术最能针对您的问题,将有助于在视觉质量与足够的渲染速度之间取得平衡。
几何锯齿
默认情况下,所有几何图形都是以屏幕像素为单位逐个渲染的。如下图左侧所示,这会产生生硬的边缘,在高对比度场景中很容易被察觉,在此黑白图像中尤为明显。

有效减少几何锯齿的技术
解决此问题的最正确方法是使用多采样抗锯齿,因为它仅在需要时才会采集更多的几何细节。使用时序抗锯齿或渐进式抗锯齿也能以正确的方式缓解该问题。
最后,在某些情况下,您可以使用轮廓不透明度贴图来平滑几何体的边缘。
纹理锯齿
当纹理被子采样时,显示的像素数量少于原始纹理,这会导致根据所选像素产生不理想的伪影。当模型移动时,由于不同时间点选择的像素不同,这种现象会更加严重。 在下图中,请注意:E3和F3之间的线条缺失,而在G3和H3之间则清晰可见,随后在接下来的5列中又消失,如此循环往复。

有效减少纹理锯齿的技术
解决此问题的最简单(且可以说是最佳)方法是在图像纹理本身中使用米普映射。其他解决方案包括使用时域抗锯齿(Temporal AA)或渐进式抗锯齿(Progressive AA)来从纹理中获取更多信息。
使用多采样抗锯齿无法解决此问题。
反射锯齿
与纹理锯齿类似,反射环境的材质会对图像进行子采样。在某些情况下,如下图左侧所示,当精细细节被省略时,这种现象会变得十分明显。

有效减少反射锯齿的技术
在此情况下,最正确的解决方案是使用时域抗锯齿(Temporal AA)或渐进式抗锯齿(Progressive AA)来获取额外信息。
另一种可能可接受的简易替代方案是降低材质的光泽度,增加其粗糙度。这样一来,系统会自动使用环境图的低分辨率Mipmap,从而将锐利的细节融合在一起。
抗锯齿技术在Qt Quick 3D
注意:请查看 “抗锯齿示例”和“场景效果示例”,以实时体验其中的一些功能。 但请注意,现代窗口系统通常配置为在连接高分辨率屏幕时执行高 DPI 缩放。这意味着屏幕上显示的任何窗口内容都会以更高分辨率渲染,然后由系统合成器或平台的其他组件进行缩放。这实际上是一种超采样抗锯齿形式。 因此,在Qt Quick 3D 中启用抗锯齿技术后,所显示的改善效果可能较微弱,甚至有时难以察觉,因为锯齿现象在一定程度上已被窗口系统的自动缩放功能消除。 然而,当在另一台系统上部署同一应用程序时,该系统所使用的平台或屏幕可能不支持此类缩放,因此开箱即用的情况下,锯齿现象会更加明显。 建议开发人员考虑目标环境中是否存在高DPI缩放功能,并在此基础上对抗锯齿设置进行测试和调整。
下文展示了启用多种抗锯齿方法后,Sponza场景的渲染示例。这些截图是在未对窗口应用任何系统缩放(即未启用高DPI缩放)的情况下拍摄的,因此各种方法的效果更为明显。
| 使用的抗锯齿技术 | 结果 |
|---|---|
| 无抗锯齿 |
|
| 超采样抗锯齿,高(1.5倍) |
|
| 多采样抗锯齿,高(4x) |
|
| FXAA |
|
| 时间抗锯齿,默认强度(0.3) |
|
多采样抗锯齿
多采样抗锯齿(MSAA)可在View3D 项的颜色缓冲区上运行(这是默认行为),或者,如果使用的renderMode 不是Offscreen ,则可在整个Qt Quick 窗口上运行(QQuickWindow 、QQuickView 、Window 、ApplicationWindow )。
几何体的边缘会进行超采样,从而呈现更平滑的轮廓。不过,此技术对几何体内部的材质并无影响。
- 优点:在几何体轮廓上效果良好,而锯齿现象通常在此处最为明显。可无缝处理高速动画。许多新款GPU支持2倍或4倍MSAA,且不会造成任何性能问题。
- 缺点:使用成本较高,特别是在较旧的移动设备和嵌入式硬件上。对纹理或反射问题无济于事。
当View3D 使用默认的renderMode (Offscreen )时,View3D 本身将完全控制多采样抗锯齿。应用程序可通过与View3D 关联的环境(SceneEnvironment 或ExtendedSceneEnvironment )中的antialiasingMode 和antialiasingQuality 属性进行配置。
以下示例请求常用的 4x MSAA,因为 antialiasingQuality 的默认值为SceneEnvironment.High 。
View3D {
environment: SceneEnvironment {
antialiasingMode: SceneEnvironment.MSAA
}
}MSAA 并非由 Qt 本身实现,而是由底层的 3D API 执行。因此,不同硬件及其 3D API 实现之间的性能和质量可能会有所不同。
时间抗锯齿
时间抗锯齿(Temporal AA)作用于View3D 的颜色缓冲区。相机在帧与帧之间会发生极微小的抖动,每个新帧的渲染结果会与上一帧进行混合。
- 优点:由于摄像机的微小抖动,它能够捕捉到原本会丢失的真实细节。对性能的影响较小。
- 缺点:快速移动的物体会导致单帧重影。
时间抗锯齿与多采样抗锯齿结合使用时无效。但可与渐进式抗锯齿结合使用。
要控制时间抗锯齿,请使用环境的temporalAAEnabled 和temporalAAStrength 属性。
View3D {
environment: SceneEnvironment {
temporalAAEnabled: true
}
}渐进式抗锯齿
渐进式抗锯齿(Progressive AA)作用于View3D 的颜色缓冲区。当View3D 渲染的场景中所有内容停止移动时,相邻帧之间会使摄像机发生微小的抖动,并将每帧的新结果与前几帧进行混合。积累的帧数越多,最终效果越佳。
- 优点:可在不牺牲性能的情况下提供细节丰富的静态图像。
- 缺点:若画面中存在任何视觉变化,则无法生效。8x PAA 需要八分之一秒才能完成渲染(以 60fps 计算),这可能会被察觉。
View3D {
environment: SceneEnvironment {
antialiasingMode: SceneEnvironment.ProgressiveAA
}
}使用antialiasingQuality 来控制要混合的帧数(2、4或8)。
超采样抗锯齿
超采样抗锯齿(Supersample AA)作用于View3D 的颜色缓冲区。这涉及创建一个比正常尺寸更大的颜色缓冲区(纹理),然后对其进行下采样。这意味着资源消耗会增加,且在较大尺寸下,缩放操作可能消耗大量资源。
- 优点:提供全场景抗锯齿效果,且对动画无任何限制。
- 缺点:当场景性能已受限于图形系统的填充率时(尤其是较旧的移动设备和嵌入式硬件),该方法可能会严重降低性能。
View3D {
environment: SceneEnvironment {
antialiasingMode: SceneEnvironment.SSAA
}
}使用antialiasingQuality 来控制缩放倍数(1.2、1.5 或 2.0)。
Mipmaps
Mipmap技术会将纹理与其预先计算好的低分辨率版本一同存储。每当纹理以较小的尺寸显示时,渲染系统会自动使用这些低分辨率图像(它们将大量细节合并到更少的像素中)。
- 优点:对性能影响较小。能显著提升纹理的图像质量。
- 缺点:可能需要耗费大量资源来生成 Mipmap 链;或者,对于某些图像容器格式,需要预先在图像资源本身中生成 Mipmap 图像。与未使用 Mipmap 的相同图像相比,额外占用 33% 的图形内存。
若要让 Qt 为Texture 生成Mipmap,并在图形着色器中进行纹理采样时启用Mipmap链,请设置mipFilter 和generateMipmaps 属性。
Texture {
source: "image.png"
mipFilter: Texture.Linear
generateMipmaps: true
}镜面抗锯齿
通过启用“镜面抗锯齿”,可以减少由镜面光照引起的图像瑕疵。这些瑕疵通常表现为亮点,有时还会伴有闪烁现象。
| 高光抗锯齿已禁用 | 启用镜面抗锯齿 |
|---|---|
|
|
View3D {
environment: SceneEnvironment {
specularAAEnabled: true
}
}注意: 当启用镜面抗锯齿时,外观非常平滑的材质 可能会出现外观变化,仿佛其表面具有more rough 效果。这是底层光照计算所导致的结果。
快速近似抗锯齿
ExtendedSceneEnvironment 提供了一种以后期处理效果形式呈现的另一种抗锯齿方法。要启用 FXAA,请将“fxaaEnabled ”设置为 true。
import QtQuick3D.Helpers
View3D {
environment: ExtendedSceneEnvironment {
fxaaEnabled: true
}
}艺术家常用的“取巧”技巧
剪影不透明度贴图
当模型轮廓线较为规整时,您可以应用不透明度贴图,使几何体的外部边缘变得透明。使用渐变来控制不透明度,可让物体的边缘平滑地消失。 然而,即使你的不透明度贴图在单个像素范围内直接从完全不透明过渡到完全透明,其结果仍会呈现如上例所示的抗锯齿边缘。这是因为图像贴图(包括不透明度贴图)使用双线性插值。
- 优点:能呈现比普通抗锯齿更柔和的过渡效果。可按模型而非按图层应用。
- 缺点:如果物体的轮廓会发生变化,则无法使用。多个采用透明效果且相互重叠的模型会消耗填充率性能,而填充率通常是宝贵的资源。
修改材质或几何体
如上文“反射锯齿”图所示,有时解决问题的最简单方法就是修改模型。如果模型边缘出现令人分心的镜面高光,请自问:能否让材质更柔和一些?能否修改几何体以平滑表面或改变反射角度?能否编辑环境贴图以减少锐利的过渡?
© 2026 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.






