应用抗锯齿功能

您可以对整个 Kanzi 应用程序应用抗锯齿,或仅对选定的节点应用:

  • 如果应用程序中的大部分内容需要抗锯齿,请对整个应用程序应用抗锯齿功能。请参阅 对整个应用程序应用抗锯齿。

  • 如果应用程序只有某些部分需要抗锯齿,请只对需要抗锯齿的那些部分使用采样功能:

    • 多重采样需要的计算更少,但并非所有硬件都支持功能。请参阅 使用多重采样。

    • 超级采样需要消耗更多的资源,但更多的硬件支持功能。请参阅 使用超级采样。

    • 时间性抗锯齿使用来自多个帧的信息来减少运动 3D 内容中的锯齿和闪烁。请参阅 使用时间性抗锯齿。

默认情况下,Windows 上的 Kanzi Studio Preview 和 Kanzi Application Player 使用 4 个样本应用抗锯齿。对于这两者,您可以配置要使用的抗锯齿数量。

请参阅 在 Preview 和 Application Player 中设置抗锯齿。。

您可以为您的 Kanzi 应用程序设置首选的多重采样方法。请参阅 设置多重采样方法。

对整个应用程序应用抗锯齿

当您为整个应用程序应用抗锯齿时,您需要设置要使用的抗锯齿表面样本数量。因为此值取决于您要运行 Kanzi 应用程序的设备,请查看该设备的文档以获取支持的值。如果您将抗锯齿表面样本的数量设置为设备不支持的值,Kanzi Engine 会将该值限制为设备驱动程序支持的最大值。

要对整个应用程序应用抗锯齿:

  • 在 application.cfg 配置文件中,将 SurfaceSamplesAntialiasing 参数设置为您要使用的抗锯齿表面采样数。请参阅 应用程序配置参考。

    例如,要使用四个抗锯齿样本,则将以下设置添加至 application.cfg。

    SurfaceSamplesAntialiasing = 4
    

或

  • 在 C++ 应用程序中的 Application::onConfigure 函数中,将 configuration.defaultSurfaceProperties.antiAliasing 参数设置为您要使用的抗锯齿表面样本数。

    例如,要使用四个抗锯齿样本,则将以下设置添加至 Application::onConfigure。

    configuration.defaultSurfaceProperties.antiAliasing = 4;
    

请参阅 SurfaceSamplesAntialiasing。

在 Preview 和 Application Player 中设置抗锯齿。

默认情况下,Windows 上的 Kanzi Studio Preview 和 Kanzi Application Player 使用 4 个样本应用抗锯齿。对于这两者,您可以配置要使用的抗锯齿数量。

如果您有一个 Kanzi 应用程序和一个 C++ 应用程序,要在 Kanzi Studio Preview 和 Kanzi Application Player 中以与在目标设备上运行 Kanzi 应用程序相同的方式查看您的内容,可以在 application.cfg 文件中设置抗锯齿。请参阅 对整个应用程序应用抗锯齿。

要在没有 C++ 应用程序的 Kanzi 应用程序中设置 Kanzi Studio Preview 的抗锯齿:

  1. 在 Kanzi Studio 主菜单中,选择 Project > Properties。在 Preview 部分的 Properties 中,将 Preview Working Directory 属性的值设置为您要存储 application.cfg 的目录,以配置 Preview。

    例如,将 Preview Working Directory 属性设置为 Application Player。这样,您可以将相同的抗锯齿设置应用于 Windows 上的 Preview 和 Kanzi Application Player。如果 <ProjectName>/Application Player 目录尚不存在,请选择 File > Export > Export as KZB Player for Windows。请参阅 从 Kanzi Studio 构建和部署 Kanzi 应用程序到 Windows。。

    ../../_images/project-properties-myproject.png ../../_images/preview-working-dir-application-player.png
  2. 在您在上一步中设置的目录中,创建或打开 application.cfg 文件。添加并将 SurfaceSamplesAntialiasing 参数设置为您希望 Preview 使用的抗锯齿采样数。

    例如,要在 Preview 中禁用抗锯齿,在 application.cfg 中添加:

    SurfaceSamplesAntialiasing = 0
    
  3. 在 Kanzi Studio 中,重启 Preview。

    ../../_images/preview-restart-button-gray.png

使用多重采样

使用多重采样 (MSAA) 来减少 Kanzi 应用程序中选定部分的锯齿。要使多重采样正常工作,您要运行 Kanzi 应用程序的硬件必须满足以下任一要求:

  • 如果在使用支持 OpenGL ES 2.0 的 Nvidia GPU,您需要有 GL_NV_framebuffer_blit 和 GL_NV_framebuffer_multisample 扩展。

  • 如果在使用 Imagination Technologies GPU OpenGL ES 2.0,您需要有 GL_IMG_multisampled_render_to_texture 扩展。

  • 对于其他的 OpenGL ES 2.0 硬件,您需要有 GL_EXT_multisampled_render_to_texture 扩展。

多重采样比超级采样需要更少的资源。当光栅化多边形时,多重采样仅为多边形边缘的片段生成额外的样本,而超级采样为多边形中的所有片段生成额外的样本。

当使用基于磁贴的多重采样时,通常在移动平台上,GPU 一次仅为一个 GPU 磁贴生成多个样本。GPU 在将该磁贴写回纹理内存时隐式地解析样本,从而节省内存和 GPU 带宽。

在第一张图像中,未应用抗锯齿。在第二张图像中,应用了具有 8 个样本的多重采样。

../../_images/anti-aliasing-off.png ../../_images/multisampling-8-samples.png

多重采样 3D 内容

要将多重采样抗锯齿应用于 Kanzi 渲染到合成目标的 3D 内容,在您用来渲染内容的 Composition Target Render Pass 中,将 Multisample Level 属性设置为您想要使用的抗锯齿样本数。

请参阅您要在其上运行 Kanzi 应用程序的设备文档以获取支持的值,因为抗锯齿样本的数量取决于设备。如果将 Multisample Level 属性设置为设备不支持的值,Kanzi Engine 会将该值限制为设备驱动程序支持的最大值。

例如:

  1. 在 Library 中,按 Alt 并右键单击 Rendering,并选择 Compose and Blit Pass。

    Compose and Blit Pass 包含渲染通道结构,使您能够使用特定材质将 Composition Target Render Pass 渲染通道或纹理传输到屏幕。

    Compose and Blit Pass 渲染通道预设包含以下渲染通道:

    • Composition Target Render Pass 将自身及其后代渲染通道渲染到一个或多个合成目标。

      • Clear Render Pass 清除当前渲染背景的若干或所有缓冲区。

        默认情况下,Compose and Blit Pass 中的 Clear Render Pass 使用透明黑色清除第一个颜色缓冲区,并使用值 1 清除深度缓冲区。

        例如,要使用不同的颜色清除第一个颜色缓冲区,请将 Clear Color 0 属性设置为您希望用作 Kanzi 渲染到 Composition Target Render Pass 的内容背景颜色的颜色。

      • Gather Lights Render Pass 收集您设置为使用 Compose and Blit Pass 的 Viewport 2D 节点中的 Light 节点,并将它们传递给其子 Draw Objects Render Pass 渲染通道。

        • Draw Objects Render Pass 名为 Draw Objects 允许您设置一个 Camera 节点来渲染特定的节点列表,过滤这些节点,并控制视锥体裁剪。默认情况下,Draw Objects Render Pass 使用其最近的祖先 Gather Lights Render Pass 提供的灯光来渲染节点。默认情况下,Draw Objects Render Pass 使用默认的 Camera 节点来渲染 Viewport 2D 节点中的所有节点。

    • Blit Render Pass 使用一种特定材质将一个或多个单一纹理或立方体贴图纹理位块传送到屏幕。

      默认情况下,该 Blit Render Pass 在屏幕上绘制 Composition Target Render Pass 渲染其内容的第一个颜色纹理。

      ../../_images/compose-and-blit-pass-create1.png ../../_images/compose-and-blit-pass-library1.png
  2. 在 Node Tree 或 Prefabs 中,选择要减少其内容锯齿的 Viewport 2D 节点。在 Properties 中,将 Render Pass Prefab 属性设置为 Compose and Blit Pass 渲染通道预设。

    Kanzi 现在在 Viewport 2D 节点中使用 Compose and Blit Pass 渲染通道预设渲染场景。

    ../../_images/viewport-2d-in-the-project.png ../../_images/render-pass-prefab-set-to-compose-and-blit-pass.png ../../_images/anti-aliasing-off.png
  3. 在 Library 中,选择 Compose and Blit Pass > Composition Target Render Pass。在 Properties 中,添加 Multisample Level 属性,并将其设置为您要使用的抗锯齿采样数。

    例如,将 Multisample Level 设为 8。

    请参阅您要在其上运行 Kanzi 应用程序的设备文档以获取支持的值,因为抗锯齿样本的数量取决于设备。如果将 Multisample Level 属性设置为设备不支持的值,Kanzi Engine 会将该值限制为设备驱动程序支持的最大值。

    ../../_images/multisample-level.png

Kanzi 现在对 Viewport 2D 节点的内容应用抗锯齿。

../../_images/multisampling-8-samples.png

多重采样 2D 内容

您可以对其内容 Kanzi 渲染到合成目标的 2D 节点应用多重采样抗锯齿。使用 Render Target > Multisample Level 属性设置要使用的抗锯齿样本数量。

请参阅您要在其上运行 Kanzi 应用程序的设备文档以获取支持的值,因为抗锯齿样本的数量取决于设备。如果将 Multisample Level 属性设置为设备不支持的值,Kanzi Engine 会将该值限制为设备驱动程序支持的最大值。

例如:

  1. 在 Node Tree 或 Prefabs 中,选择要减少其内容锯齿的 2D 节点。

    例如,创建一个包含 Image 节点的布局控制节点。将每个 Image 节点旋转几个度。

    ../../_images/node-tree-flow-layout.png ../../_images/preview-flow-layout-no-effect.png
  2. 要将 Kanzi 设置为将 2D 节点的内容渲染到合成目标,在 Properties 中,可以:

    • 添加并启用 Node 2D > Force Composition 属性。

      通过这种方式,您强制 Kanzi 将节点渲染到合成目标。

      ../../_images/properties-force-composition.png
    • 设置一个属性值,使 Kanzi 自动将节点渲染到合成目标。

      例如,当您调整不透明度或将效果应用于具有子节点的2D节点时,Kanzi 会将该节点渲染到一个临时合成目标。

      ../../_images/properties-opacity.png ../../_images/properties-effect-prefab.png
    ../../_images/preview-no-msaa.png
  3. 在 Properties 中,添加并设置 Render Target > Multisample Level 属性为您要使用的抗锯齿采样数。

    请参阅您要在其上运行 Kanzi 应用程序的设备文档以获取支持的值,因为抗锯齿样本的数量取决于设备。如果将 Multisample Level 属性设置为设备不支持的值,Kanzi Engine 会将该值限制为设备驱动程序支持的最大值。

    ../../_images/properties-multisample-level.png ../../_images/preview-4x-msaa.png

使用超级采样

如果您的硬件不支持多重采样,使用超采样 (SSAA) 来减少 Kanzi 应用程序中选定部分的锯齿。超采样比多重采样需要更多资源。在光栅化多边形时,超采样会为多边形中的所有片段生成额外的样本,而多重采样仅为多边形边缘的片段生成额外的样本。

对合成目标进行超级采样

当您使用 Composition Target Render Pass 渲染 3D 内容时,可以对合成目标纹理进行超采样。要对合成目标纹理进行超采样,您必须使用 Composition Target Render Pass 自动创建的合成目标。

要对合成目标进行超级采样:

  1. 在 Library 中,按 Alt 并右键单击 Rendering,并选择 Compose and Blit Pass。

    Compose and Blit Pass 包含渲染通道结构,使您能够使用特定材质将 Composition Target Render Pass 渲染通道或纹理传输到屏幕。

    Compose and Blit Pass 渲染通道预设包含以下渲染通道:

    • Composition Target Render Pass 将自身及其后代渲染通道渲染到一个或多个合成目标。

      • Clear Render Pass 清除当前渲染背景的若干或所有缓冲区。

        默认情况下,Compose and Blit Pass 中的 Clear Render Pass 使用透明黑色清除第一个颜色缓冲区,并使用值 1 清除深度缓冲区。

        例如,要使用不同的颜色清除第一个颜色缓冲区,请将 Clear Color 0 属性设置为您希望用作 Kanzi 渲染到 Composition Target Render Pass 的内容背景颜色的颜色。

      • Gather Lights Render Pass 收集您设置为使用 Compose and Blit Pass 的 Viewport 2D 节点中的 Light 节点,并将它们传递给其子 Draw Objects Render Pass 渲染通道。

        • Draw Objects Render Pass 名为 Draw Objects 允许您设置一个 Camera 节点来渲染特定的节点列表,过滤这些节点,并控制视锥体裁剪。默认情况下,Draw Objects Render Pass 使用其最近的祖先 Gather Lights Render Pass 提供的灯光来渲染节点。默认情况下,Draw Objects Render Pass 使用默认的 Camera 节点来渲染 Viewport 2D 节点中的所有节点。

    • Blit Render Pass 使用一种特定材质将一个或多个单一纹理或立方体贴图纹理位块传送到屏幕。

      默认情况下,该 Blit Render Pass 在屏幕上绘制 Composition Target Render Pass 渲染其内容的第一个颜色纹理。

      ../../_images/compose-and-blit-pass-create1.png ../../_images/compose-and-blit-pass-library1.png
  2. 在 Node Tree 中,选择您想要超级采样其内容的 Viewport 2D 节点,并在 Properties 中将 Render Pass Prefab 属性设置为 Compose and Blit Pass 渲染传递预设。

    Kanzi 现在在 Viewport 2D 节点中使用 Compose and Blit Pass 渲染通道预设渲染场景。

    ../../_images/viewport-2d-in-the-project.png ../../_images/render-pass-prefab-set-to-compose-and-blit-pass.png
  3. 在您用于渲染要超采样的节点的 Composition Target Render Pass 中,添加 Resolution Multiplier 属性,并将其设置为您希望用于乘以合成目标纹理分辨率的值。

    ../../_images/composition-target-render-pass-with-resolution-multiplier.png

对渲染目标纹理进行超级采样

您可以对在 Texture Brush 中使用的渲染目标纹理或在 Image 节点中用作图像的渲染目标纹理进行超采样。

要对渲染目标纹理进行超级采样:

  1. 在 Library 按 Alt 并右键单击 Materials and Textures 中,选择 Render Target Texture。请参阅 使用渲染目标纹理。

    这是您要渲染到节点内容上的纹理,希望减少节点锯齿。

    ../../_images/create-render-target-texture.png
  2. 在 Library 中选择您刚刚创建的 Render Target Texture,并在 Properties 中设置:

    • 将渲染目标纹理的 Height 和 Width 设置为您希望减少锯齿的内容最终大小的两倍。

      当您按比例缩小大纹理时,需要平滑化会导致锯齿的粗糙边缘。

    • Minification Filter 到 Linear

    • Mipmap Mode 到 Base

    • Format 到 RGBA 8-bit

    ../../_images/render-target-texture-properties-supersampling.png
  3. 在 Node Tree 中选择您要应用超采样的节点,并在 Properties 中添加并设置:

    • 将 Off-Screen Rendering 设置为 enabled。

    • 将您在第一步中创建的渲染目标纹理应用到 Render Target。

    ../../_images/render-target-properties.png
  4. 将您在第一步中创建的 Render Target Texture 应用于您希望显示上一步中选择的节点的超采样图像的节点。

    例如:

    1. 在 Node Tree 按 Alt 并右键单击 中选择 Empty Node 2D。

    2. 在 Node Tree 中选择 Empty Node 2D 节点,在 Properties 中添加 Background Brush 属性,并在下拉菜单中选择 + Texture Brush。

      ../../_images/select-create-texture-brush.png
    3. 在 Background Brush 属性旁边,点击 image0,并将 Texture Brush 的 Brush Texture 属性设置为您想在第一步中创建的 Empty Node 2D 中显示的 Render Target Texture。

      ../../_images/image-property-render-target-texture.png
    4. 在 Node Tree 中选择 Empty Node 2D,并在 Properties 中添加并设置 Layout Width 和 Layout Height 属性为您希望显示 Render Target Texture 内容的大小。

设置多重采样方法

当可用时,您可以设置您的 Kanzi 应用程序使用的多重采样方法:从渲染缓冲区进行位块传输或隐式多重采样。

当从渲染缓冲区 Kanzi 进行位块传输时,首先渲染到多重采样渲染缓冲区中。渲染完成后,Kanzi 通过将结果位块传输到常规纹理中来解析样本。从渲染缓冲区进行位块传输需要以下之一:

  • 您的平台支持 OpenGL (ES) 3 或更高版本。

  • GL_ARB_framebuffer_object 扩展可用。

  • GL_NV_framebuffer_blit 和 GL_NV_framebuffer_multisample 扩展可用。

隐式多重采样意味着 Kanzi 对纹理执行多重采样渲染,而不需要显式解析多重采样数据,即将数据降采样为每像素单个样本。隐式多重采样要求以下扩展之一可用:

  • GL_EXT_multisampled_render_to_texture

  • GL_IMG_multisampled_render_to_texture

默认情况下,Kanzi 选择其认为最佳的多重采样方法:

  • 在桌面平台上,Kanzi 从渲染缓冲区进行 blit 操作。

  • 在使用 OpenGL ES 的平台上,Kanzi 使用隐式多重采样。

要设置多重采样方法,可以:

  • 在 application.cfg 配置文件中,将 MultisamplePreference 参数设置为您希望 Kanzi 优先使用的多重采样方法:Blit 或 Implicit。请参阅 使用 application.cfg。

    例如,要优先从 renderbuffer 进行 blitting,请添加到 application.cfg。

    MultisamplePreference = Blit
    
  • 在 C++ 应用程序中的 Application::onConfigure 函数中,将 configuration.multisamplePreference 参数设置为您希望 Kanzi 优先使用的多重采样方法:MultisamplePreferenceBlit 或 MultisamplePreferenceImplicit。

    例如,要优先从渲染缓冲区进行位块传输,请添加到 Application::onConfigure。

    configuration.multisamplePreference = Renderer::RendererSettings::MultisamplePreferenceBlit;
    

请参阅 MultisamplePreference。

使用时间性抗锯齿

使用时间性抗锯齿 (TAA) 可减少运动中的 3D 内容的锯齿和闪烁。TAA 利用当前帧和之前帧的信息以及运动矢量来生成更平滑的边缘。

Quality TAA
MSAA×32
MSAA×32
Quality TAA

适合使用 TAA 的情况

  • 主要的 3D 透视场景,例如典型的汽车模型或展厅主摄像机。

  • 不使用 MSAA、颜色写入普通纹理的合成。

  • 整体运动的刚性物体或车身,包括平移、旋转和缩放。

  • 不透明材质或常见的半透明材质,例如典型的车漆、玻璃及类似的混合。

  • 如果某些对象不应生成运动矢量,请在这些节点上禁用 Generate TAA Motion Vectors,并为其余部分保持启用 TAA。

  • 对于大多数内容,请将 Default TAA 与 Clean Geometry 搭配使用。当静止的细微接缝或缓慢旋转的轮廓需要更好的稳定性时,请使用 Quality TAA。使用粒子时,请将 Default TAA 与 Fine Detail Friendly 搭配使用。

不适合使用 TAA 的情况

  • TAA 和 MSAA 互斥。请先禁用 MSAA,再启用 TAA。

  • 正交摄像机、阴影贴图、Cube/IBL 及类似的渲染通道本身不运行 TAA,因为这些路径不经过主视图 TAA。

  • 嵌套的内部 Composition 不会再次运行 TAA。只有最外层的 Composition 生效。

  • 当视觉效果主要依赖蒙皮角色或强烈的 Morph 变形时,无法准确计算运动。因此很可能出现重影和闪烁,TAA 的效果有限。

可以使用 TAA 但需要特别注意的情况

  • 附加光源和辉光被有意排除在运动矢量之外,以免覆盖其后方对象的速度。

  • 对于非常细的接缝、光隙边缘和强烈的镜面闪烁,TAA 通常能减少闪烁,但无法提供与 MSAA 一样锐利的边缘,也无法完全消除闪烁。

  • 当收集运动矢量的对象与不收集运动矢量的对象混合在同一个 Dynamic Batch 中时,整个批次可能最终没有速度数据。这会降低局部画质。请避免在同一批次中混合这些对象。

  • 启用 TAA、禁用后重新启用 TAA,或切换 TAA Mode 或 TAA Profile 后,最初几帧必须重建历史数据,可能会短暂出现不稳定。

  • 在快速大幅运动或强烈的透视缩放变化期间,新显露的像素没有历史数据。因此轮廓可能会出现短暂的锯齿。

如何使用 TAA

  1. 选择 Composition Target Render Pass。

    ../../_images/TAA-composition-target-render-pass-with-taa.png
  2. 在 Properties 中设置 TAA Mode:

    • Default TAA 针对大多数内容平衡画质与资源使用。

    • Performance TAA 将 TAA 的资源开销降至最低。

    • Quality TAA 可提高静止的细微接缝和缓慢旋转的轮廓的稳定性。

    • No TAA 禁用 TAA。

  3. 设置 TAA Profile:

    ../../_images/TAA-profile-selection.png
    • 对于包含粒子或细微镜面高光的内容,请使用 Fine Detail Friendly。

    • 与外部背景合成时,请使用包含 External Background 的配置。

    • 使用 TAA Debug Visualize MV 可视化生成运动矢量的内容。

    ../../_images/TAA-debug-visualize-MV-preview.png
  4. 要合成外部背景,请按照 Using an external background with TAA 中的说明配置 TAA Profile 和 TAA External Background。

    ../../_images/TAA-external-background.png

选择 TAA 模式

所有启用的 TAA 模式都会对每一帧应用子像素抖动,并使用运动矢量将上一帧与当前帧对齐。请根据所需的画质和可用的渲染资源选择模式。

../../_images/TAA_mode-selection.png

TAA 模式

适用情况

主要特性

No TAA

您不想使用 TAA。

禁用 TAA。

Performance TAA

优先考虑最大限度地减少资源使用。

使用五样本十字邻域和半分辨率运动矢量。不会累积静止的细微接缝,也不会为该累积分配额外的缓冲区。

Default TAA

需要在常规内容的图像质量与资源使用之间取得平衡。

在多帧之间稳定静止的细微接缝,并使用半分辨率运动矢量。运动期间,根据运动速度混合当前帧和历史,以减少旧轮廓留下的拖影。

Quality TAA

需要更干净的静止细微接缝,以及更稳定的缓慢旋转轮廓。

使用半精度历史、3×3 样本邻域、静止时的 Catmull-Rom 历史采样以及全分辨率运动矢量。在缓慢旋转期间短暂继续累积。

Default TAA 使用五样本十字邻域。当场景静止时,它会从邻域样本中去除当前帧的抖动,并在多帧之间累积细微接缝。孤立的高光不参与这种静止累积。对于靠近旋转轴且几乎不移动像素的高光,它使用当前帧,以避免留下持续的亮条纹。当图像开始移动时,Kanzi 停止静止累积,并根据运动速度混合当前帧和历史。

默认情况下,Default TAA 使用 8 位颜色存储历史。当 Composition 颜色目标使用浮点格式时,历史使用半精度颜色以匹配当前图像。其半分辨率运动矢量通过覆盖率加权进行上采样,以避免将未覆盖的像素扩散到对象轮廓中。

Performance TAA 将历史限制在五样本十字邻域的范围内,并将其与当前帧混合。它不使用静止接缝累积、3×3 邻域采样、Catmull-Rom 历史采样,也不在旋转期间进行短暂累积。使用此模式可以评估在不使用静止接缝累积的情况下剩余的抗锯齿质量和资源使用。

Quality TAA 使用 RGBA16F 历史,以免非常暗的接缝因 8 位颜色精度而丢失。更宽的 3×3 邻域包含对角边缘上的细微接缝。在缓慢旋转期间,它会短暂继续累积以稳定轮廓。在较快旋转期间,它会回到当前帧以减少重影。

备注

Quality TAA 比 Default TAA 使用更多的内存带宽和图形内存。它使用两个半精度历史缓冲区、更宽的样本邻域和全分辨率运动矢量。

选择 TAA 结果深度源

使用 TAA Result Depth Source 选择合成目标渲染通道 (Composition Target Render Pass) 通过 Result Depth Texture 提供的深度纹理。当基于深度的后期处理(例如景深 (DOF))出现由 TAA 抖动引起的边缘闪烁时,您可以使用不含该抖动的深度。

此属性仅影响 Result Depth Texture。Result Texture 0 继续提供 TAA 颜色结果。TAA Profile 不选择深度源。

TAA Result Depth Source

行为

Composition Target (默认值)

提供来自颜色通道的深度,该深度通过 Depth Texture Format 或 Depth Target 配置。此深度包含 TAA 子像素抖动。默认值保留现有行为,不会添加额外的深度纹理。

Unjittered From MV

当已启用 TAA 且有有效的深度配置时,提供不含 TAA 抖动的深度。该深度包含参与 TAA 运动矢量生成的不透明对象,包括符合条件的批次。它并不代表完整的场景深度。

当后期处理不采样 Result Depth Texture,或景深结果已可接受时,保留 Composition Target。

要使用不含 TAA 抖动的深度:

  1. 选择为主 3D 视图执行 TAA 并向后期处理提供深度的最外层合成目标渲染通道 (Composition Target Render Pass)。

    不要在嵌套的子 Composition 中再次启用 TAA 和无抖动深度。

  2. 在 Properties 中,配置以下任一属性:

    • 将 Depth Texture Format 设置为包含深度的格式。

    • 将 Depth Target 设置为维度匹配的深度纹理。

  3. 为 Composition 禁用 MSAA,并将 TAA Mode 设置为 Performance TAA、Default TAA 或 Quality TAA。

    TAA 和 MSAA 互斥。使用 No TAA 或没有有效的深度配置时,Unjittered From MV 不会生效。

  4. 将后期处理通道或材质的深度输入绑定到此通道的 Result Depth Texture。

    直接采样 Depth Target 或使用其他通道的深度时,不会使用所选的结果深度源。

  5. 首先使用 Composition Target 检查景深结果。如果边缘或焦平面随 TAA 抖动而闪烁,在 Properties 的 TAA 类别中,将 TAA Result Depth Source 设置为 Unjittered From MV。

  6. 将 TAA Profile 设置为 TAA Debug Visualize MV,以检查哪些对象生成运动矢量。

    不生成运动矢量的对象不会出现在无抖动深度中。检查完毕后,恢复场景所使用的剖析 (Profile)。

备注

属性标识符为 CompositionTargetRenderPass.TAADepthSource。Composition Target 的值为 1,Unjittered From MV 的值为 2。

深度覆盖与运动矢量

无抖动深度仅包含参与运动矢量生成的不透明对象。仅参与运动矢量生成并不会使半透明内容成为此深度的一部分。玻璃、半透明表面、粒子、附加效果,以及位于 3D 或批次绘制路径之外的对象,通常无法在此结果中提供正确的深度。

对于必须出现在无抖动深度中的对象,请保持 Generate TAA Motion Vectors 处于启用状态(默认值)。运动矢量生成还要求使用受支持的混合模式,例如 Opaque 或 Alpha over;附加混合不包括在内。如果批次中包含不满足运动矢量要求的对象,则整个批次都可能不出现在无抖动深度中。

对象可能在颜色中可见,却不存在于无抖动深度中。在景深效果中,该对象可能看起来无法遮挡其后方的对象,或者被模糊得像位于远平面一样。如果这些对象必须参与景深效果,请使用 Composition Target 保留颜色通道的深度,或者避免让这些对象依赖无抖动深度。

例如,如果透视视图为车身禁用了 Generate TAA Motion Vectors,则无抖动深度中将缺少该车身。在透视视图期间,请使用 Composition Target,或者禁用依赖无抖动深度的景深效果。恢复运动矢量生成后,您可以再次使用 Unjittered From MV。

检查结果

如果更改该属性没有可见效果,或者景深边缘仍然抖动,请检查以下各项:

  • 您更改的是为后期处理提供深度的 Composition Target Render Pass。

  • 后期处理输入采样的是该渲染通道的 Result Depth Texture。

  • TAA Mode 已启用,且 MSAA 已禁用。

  • Depth Texture Format 或 Depth Target 提供了有效的深度配置。

切换场景时,景深可能会短暂显示不正确的模糊范围或前景遮挡。在摄像机运动较小、结构相似的场景之间进行某些迁移时,结果可能会在一帧内保留上一个深度。

在深度源选项之间切换也可能导致景深或抗锯齿在 TAA 历史和深度重新对齐期间暂时不稳定。请等待一到两帧后再评估新设置。

性能注意事项

当摄像机或对象移动时,Unjittered From MV 会为参与运动矢量生成的不透明对象额外添加一次深度绘制。当场景静止且深度已稳定时,可以复用上一个深度以降低开销。

控制 TAA 运动矢量生成

使用 Generate TAA Motion Vectors 属性控制节点是否为 TAA 生成运动矢量。

要控制节点的运动矢量生成:

  1. 在 Node Tree 中,选择该节点。

  2. 在 Properties 中,打开 Add Properties 窗口。

  3. 在 Add Properties 窗口中的 Node 下,添加 Generate TAA Motion Vectors 属性。

  4. 设置 Generate TAA Motion Vectors:

    • 启用该属性可为节点生成 TAA 运动矢量。

    • 禁用该属性可阻止节点生成 TAA 运动矢量。

    ../../_images/TAA-add-property-TAA-debug-visualize-MV.png ../../_images/TAA-generate-taa-motion-vectors.png

备注

子节点不会继承 Generate TAA Motion Vectors。要控制子节点的运动矢量生成,请在该节点上添加并配置该属性。

在 TAA 中使用外部背景

当 3D 场景具有透明区域,且最终背景来自应用程序或其他 2D 层时,请在 TAA 中使用外部背景。

如果没有外部背景,TAA 会将 Composition 结果与 3D 场景后方透明或其他无效的像素进行累积。这可能导致 3D 对象的边缘不稳定。当您提供外部背景时,TAA 会在 Resolve 阶段使用该背景,从而使抗锯齿基于最终图像中可见的同一背景进行计算。

如果 3D 场景已经渲染了不透明背景,通常不需要此功能。解析后的输出的 alpha 值为 1,并覆盖整个 Viewport2D 区域。

使用外部背景

要在 TAA 中使用外部背景:

  1. 在 Composition Target Render Pass 中,将 TAA Profile 设置为以下值之一:

    • External Background

    • External Background + Fine Detail Friendly

    当场景包含粒子、精细高光或类似细节时,请使用 External Background + Fine Detail Friendly。

  2. 在 TAA External Background 中,设置包含应用程序或 2D 层所显示背景的纹理。

    请使用相同的资源或与其匹配的内容。纹理分辨率和裁剪区域也必须与最终图像中显示的背景一致。

    备注

    Kanzi 不会自动从 Android Surface 或其他系统层读取背景。应用程序负责提供匹配的纹理。

  3. 确保应用程序布局与 Composition 视口对齐。

    TAA 会自动将外部背景纹理映射到当前的 Composition 视口。通常无需单独配置视口。

    如果 3D 视口和 2D 背景使用不同的位置、尺寸或裁剪区域,背景可能会与 3D 场景的边缘错位。

备注

TAA 和 MSAA 互斥。在 TAA 中使用外部背景之前,请禁用 Composition MSAA。

注意事项

  • 建议使用静态外部背景。持续的动画或频繁的背景更改可能会降低边缘的稳定性。

  • 更改 TAA External Background、更改背景句柄,或者切换到外部背景 TAA 剖析或从外部背景 TAA 剖析切换出去时,TAA 会清除并重建其历史记录。最初几帧可能会暂时不稳定。

  • 如果未将 TAA Profile 设置为外部背景剖析,或者未分配 TAA External Background,Kanzi 在 TAA Resolve 期间不会使用外部背景。

TAA 性能示例

在一台运行 Android 12 的设备(SM8475 / Adreno 730)上进行的测试中,以 30 FPS 的固定帧率并在禁用 Idle 的情况下测量了 TAA 对性能的影响。该测试对同一场景分别在不使用抗锯齿、使用 MSAA 4x 和使用 TAA 时的表现进行了比较。

抗锯齿

应用程序 CPU

GPU Busy

图形内存

无 AA

23.3%

60.4%

1087 MB

MSAA 4x

24.7%

70.5%

1088 MB

TAA

26.6%

65.8%

1185 MB

TAA 与 MSAA 4x 及无抗锯齿的性能比较

与不使用抗锯齿相比,TAA 使应用程序 CPU 使用率增加了 3.3 个百分点,GPU Busy 增加了 5.4 个百分点,图形内存增加了 98 MB。

与 MSAA 4x 相比,TAA 使应用程序 CPU 使用率增加了 1.9 个百分点,图形内存增加了 97 MB,而 GPU Busy 低 4.7 个百分点。在此测试中,MSAA 4x 仅比不使用抗锯齿多占用 1 MB 图形内存。

在此测试中,TAA 的主要额外开销是应用程序 CPU 使用率和图形内存。GPU Busy 与其他配置大致处于同一范围,介于不使用抗锯齿和 MSAA 4x 之间。

结果取决于场景复杂度、TAA 设置和目标设备。请在目标硬件上剖析您的内容,以确定最合适的抗锯齿方法和 TAA 模式。

另请参阅

应用程序配置参考

使用渲染目标纹理

将内容渲染到合成目标

2D 节点的效果

渲染最佳实践