抗锯齿最佳实践

Qt Quick 3D 在渲染 3D 模型时提供多种对抗锯齿(即锯齿边缘)的方法。每种技术都有其自身的优点和局限性。可以组合多种技术,但会增加额外的性能开销。

一般抗锯齿

当原始信息中包含的信息多于我们可以在屏幕上的像素中表示时,就会发生抗锯齿。抗锯齿技术分为三个类别

  • 为单个像素查找附加信息并在同一时间表示它们的技术。
  • 尝试找到问题所在并掩盖问题的图像效果。
  • 艺术家使用的尝试解决局限性的技术。

虽然抗锯齿是渲染图形的有用工具,但如果使用不当可能会影响应用程序的性能。以下各节描述了一些不同的抗锯齿技术以供选择。了解哪种技术最能解决您的问题将有助于在视觉效果与足够的渲染速度之间取得平衡。

几何抗锯齿

默认情况下,所有几何形状都是一次渲染一个屏幕像素。如图像左边的图像所示,这会在高对比度情况下留下锐利的边缘,黑白图像最明显。

有效减少几何抗锯齿的技术

对此最正确的修复是使用 多采样抗锯齿,因为它仅当需要时收集更多的几何细节。使用 时间抗锯齿渐进抗锯齿 也可以正确地解决这个问题。

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

纹理抗锯齿

当纹理被低采样时,显示的像素少于原始像素,这会导致基于选定像素的不理想的伪影。当模型移动时,这种现象会恶化,因为在不同的时间选择了不同的像素。在下面的图像中,注意 E3 与 F3 之间的线条缺失,G3 与 H3 之间的线条非常强烈,然后在下一列中消失,依此类推。

有效减少纹理抗锯齿的技术

解决这个问题最简单(也许是最好的)的方法是使用 图像纹理中的米派映射。其他解决方案包括使用 时间抗锯齿渐进抗锯齿 从纹理中收集更多信息。

使用 多采样抗锯齿 不能修复这个问题。

反射混叠

类似于纹理混叠,反射环境的材质将对图像进行子采样。在某些情况下,如图像下左端所示,细小细节被跳过时会导致这种情况变得明显。

有效减少反射混叠的技术

在这种情况下,最正确的解决方案是使用时间抗锯齿进度抗锯齿来找到额外的信息。

一种简单的替代方案是将材质调得不太光滑、更粗糙。在这种情况下,将自动使用较低分辨率的纹理环境,将清晰的细节混合在一起。

在 Qt Quick 3D 中的抗锯齿技术

注意:请查看抗锯齿示例场景效果示例以现场练习这些功能。然而,请记住,现代窗口系统通常配置为配合高分辨率屏幕执行高DPI缩放。这意味着任何显示在屏幕上的窗口内容都是以更高分辨率渲染的,然后由系统合成器或其他平台组件进行缩放。这实际上是一种超采样抗锯齿的形式。启用 Qt Quick 3D 中的抗锯齿技术可能只会显示较小的或有时难以察觉的改善,因为抗锯齿已经通过窗口系统的自动缩放在一定程度上被消除。但是,当在其他系统上部署相同的应用程序时,可能那个特定系统使用的是平台或屏幕,其中没有此类缩放,因此混叠和锯齿边缘默认时更加明显。建议开发者在考虑目标环境中高DPI缩放的可能存在或不存在的情况下,实验和调整抗锯齿设置。

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

使用的AA结果
无AA

超采样AA,高(1.5x)

多采样AA,高(4x)

FXAA

时间AA,默认强度(0.3)

多采样抗锯齿

多采样AA(MSAA)要么在View3D项目的颜色缓冲区上操作(这是默认值),要么如果使用了除renderMode以外的Offscreen,在整个 Qt Quick 窗口(QQuickWindowQQuickViewWindowApplicationWindow)上。

几何形状的边缘超采样,从而得到更平滑的轮廓。然而,这种技术对几何形状内部的材质没有影响。

  • 优点:对几何形状轮廓有很好的效果,在那里混叠通常最明显。与快速动画一起使用没有问题。许多最近期的GPU没有性能问题地支持2x或4x MSAA。
  • 缺点:使用成本可能很高,尤其是在较老的移动和嵌入式硬件上。不会帮助解决纹理或反射问题。

View3D使用默认的渲染模式离屏)时,它本身完全控制着多采样抗锯齿。应用程序可以通过与View3D关联的环境(SceneEnvironmentExtendedSceneEnvironment)的抗锯齿模式抗锯齿质量属性来配置此设置。

以下示例请求常用的4x MSAA,因为抗锯齿质量默认为SceneEnvironment.High

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

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

时间抗锯齿

时间AA在View3D的颜色缓冲区上运行。摄像头在帧之间轻微震动,并将每个新帧的结果与前一帧混合。

  • 优点:由于摄像头轻微震动,它可以找到其他情况下丢失的真正细节。对性能影响较小。
  • 缺点:快速移动的物体会导致一帧的鬼影。

当与多采样AA结合使用时,时间AA没有效果。但它可以与逐帧AA结合使用。

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

View3D {
    environment: SceneEnvironment {
        temporalAAEnabled: true
    }
}

逐步抗锯齿

逐步AA在View3D的颜色缓冲区上运行。当View3D渲染的场景中所有内容都停止移动时,摄像头在帧之间轻微震动,并将每个新帧的结果与前一帧混合。积累的帧越多,结果看起来越好。

  • 优点:提供没有性能损耗的详细静态图像。
  • 缺点:如果有任何视觉变化发生,它不起作用。8x PAA完成渲染需要八分之一秒(在60fps下),这可能会引起注意。
View3D {
    environment: SceneEnvironment {
        antialiasingMode: SceneEnvironment.ProgressiveAA
    }
}

使用antialiasingQuality来控制要混合的帧数(2、4或8)。

超采样抗锯齿

超采样AA在View3D的颜色缓冲区上运行。这涉及到创建一个比其正常尺寸大的颜色缓冲区(纹理),然后对其进行下采样。这意味着增加了资源使用量,在较大尺寸下,缩放操作可能会很昂贵。

  • 优点:提供无限制动画的完整场景抗锯齿。
  • 缺点:如果您的场景已经受到图形系统填充率的限制,尤其是较旧的移动和嵌入式硬件,性能可能会严重下降。
View3D {
    environment: SceneEnvironment {
        antialiasingMode: SceneEnvironment.SSAA
    }
}

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

米制图

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

  • 优点:低性能影响。极大地提高了纹理的图像质量。
  • 缺点:可能需要生成米制链的成本很高,或者在某些图像容器格式中,在图像资产本身中预先生成米制图像。比没有米制的相同图像多使用33%的图形内存。

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

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

镜面抗锯齿

通过启用镜面抗锯齿可以减少来自镜面照明贡献的伪影。这些伪影通常表现为明亮的点,可能具有闪烁的外观。

镜面 AA 禁用镜面 AA 启用

View3D {
    environment: SceneEnvironment {
        specularAAEnabled: true
    }
}

注意:外观非常光滑的材料在启用镜面 AA 时可能会改变其外观,看起来好像有 更粗糙 的表面。这是底层光照计算的结果。

快速近似抗锯齿

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

import QtQuick3D.Helpers

View3D {
    environment: ExtendedSceneEnvironment {
        fxaaEnabled: true
    }
}

艺术家使用的技巧

轮廓透明度映射

当你的模型有一个一致的轮廓时,你可以应用一个透明度图,使几何形状的外边缘变得透明。使用渐变透明度将使对象边缘平滑消失。然而,即使你的透明度图在一个像素的空间内直接从完全不透明到完全透明过渡,结果仍然会提供如上例所见到的抗锯齿边缘。这是因为图像图,包括透明度图,都使用双线性插值。

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

修改材料和几何形状

如上图所示,对于 反射锯齿 的问题,最简单的解决方案有时是更改艺术品。如果你在你的模型角落得到引人注目的镜面闪光,问问自己:我能否使材料更柔软?我能修改几何形状来平滑或改变反射角度?我能编辑环境图以减少尖锐的过渡?

© 2024 The Qt Company Ltd. 本文档的贡献包括各自拥有者的版权。本提供的内容根据 Free Software Foundation 发布的 GNU 自由文档许可协议第 1.3 版 的条款进行许可。Qt 及其标志是 The Qt Company Ltd. 在芬兰和/或其他国家/地区的商标。所有其他商标均为其各自所有者的财产。