场景环境 QML 类型

允许您配置场景的渲染方式。更多...

导入语句import QtQuick3D
继承

Object3D

继承自

ExtendedSceneEnvironment

属性

详细描述

SceneEnvironment 定义了一组全局属性,用于指定场景应该如何渲染。

注意: QtQuick3D Helpers 模块提供了一个 QtQuick3D.Helpers 模块,它提供了一个从 SceneEnvironment 继承的类型 ExtendedSceneEnvironment,并在其之上添加了多个内置效果。

要使用 SceneEnvironment 或 ExtendedSceneEnvironment,请将 environment 属性View3D 与这些类型的实例关联。对象可以内联声明,例如如下

View3D {
    environment: SceneEnvironment {
        antialiasingMode: SceneEnvironment.MSAA
        tonemapMode: SceneEnvironment.TonemapModeFilmic
        backgroundMode: SceneEnvironment.SkyBox
        lightProbe: Texture {
            source: "panoramic_hdri_background.hdr"
        }
    }
}

或者,可以单独定义环境对象。它可以被一个或多个 View3D 对象引用。本次示例使用 ExtendedSceneEnvironment

ExtendedSceneEnvironment {
    id: myEnv
    vignetteEnabled: true
}

View3D {
    width: parent.width / 2
    environment: myEnv
}

View3D {
    width: parent.width / 2
    x: parent.width / 2
    environment: myEnv
}

功能概述

另请参阅 ExtendedSceneEnvironment

属性文档

antialiasingMode : 枚举

此属性控制渲染场景时应用的抗锯齿模式。

可能的值为

常量描述
SceneEnvironment.NoAA不应用抗锯齿。
SceneEnvironment.SSAA超采样抗锯齿被应用。
SceneEnvironment.MSAA多重采样抗锯齿被应用。
SceneEnvironment.ProgressiveAA逐步抗锯齿被应用。

默认值为 SceneEnvironment.NoAA

超采样

场景被渲染在一个更高的分辨率,然后缩小到实际分辨率。

优点:高质量。抗锯齿应用于所有场景内容,而不仅仅是几何图形轮廓。

缺点:通常比MSAA更昂贵。增加视频内存使用。通过带有所有renderMode除Inline之外的所有 View3D 项支持,但由于技术涉及首先渲染到纹理中,使用渲染模式为Underlay或Overlay的SSAA将导致使用本通常不需要的中间纹理和渲染通道,这意味着性能成本可能更明显。建议仅在渲染模式为默认的Offscreen时使用SSAA。

多重采样

几何图形的边缘进行超采样,从而产生更平滑的轮廓。然而,这种技术对几何图形内部的材料没有任何影响。

优点:与任何渲染模式(除了Inline)的 View3D 项一起工作。在几何图形轮廓上得到良好的结果,轮廓是锯齿最常出现的地方;与快速动画一起工作,没有问题。性能完全取决于系统的(GPU)能力。

缺点:对纹理或反射问题没有帮助。增加视频内存使用。在较不强大的图形硬件上使用可能很昂贵。可以根据renderMode进行控制,或者对于单个 View3D 项。当使用具有效果的Underlay/Overlay或Offscreen时,每个 View3D 项都可以控制MSAA。另一方面,使用没有效果的Underlay/Overlay或Inline将使MSAA按照窗口进行控制。

注意:对于具有非Underlay/Overlay带有效果或Offscreen的 View3D 项,只能通过 QQuickWindowQQuickViewQSurfaceFormat 启用多重采样。这将影响该窗口中所有内容,包括2D和3D内容。

逐步抗锯齿

此属性启用并设置应用于场景的逐步抗锯齿级别。

当场景中所有内容停止移动时,相机在帧之间轻微抖动,每个新帧的结果与前一帧混合。积累的帧越多,结果看起来越好。

优点:当场景中所有内容都静止时,效果非常好。

缺点:如果有任何视觉变化,则不起作用。由于需要累积和混合,因此成本高昂。增加视频内存使用量。

有关抗锯齿方法的进一步讨论,请参阅抗锯齿最佳实践


抗锯齿质量枚举

此属性设置应用于场景的抗锯齿级别。行为取决于使用的抗锯齿模式。当将抗锯齿模式属性设置为无AA时,此属性没有效果。

可能的值为

常量描述
SceneEnvironment.MediumSSAA: 抗锯齿使用1.2倍超采样分辨率。
MSAA: 抗锯齿使用每个像素2个样本。
ProgressiveAA: 抗锯齿使用2帧生成最终图像。
SceneEnvironment.HighSSAA: 抗锯齿使用1.5倍超采样分辨率。
MSAA: 抗锯齿使用每个像素4个样本。
ProgressiveAA: 抗锯齿使用4帧生成最终图像。
SceneEnvironment.VeryHighSSAA: 抗锯齿使用2.0倍超采样分辨率。
MSAA: 抗锯齿使用每个像素8个样本。
ProgressiveAA: 抗锯齿使用8帧生成最终图像。

默认值为SceneEnvironment.High


aoBiasfloat

此属性定义了一个截止距离,防止在近距离内物体表现出环境遮挡。更高的值会增加物体之间需要保持的距离,才能看到环境遮挡。

注意:如果您在没有阴影的地方看到环境遮挡阴影,请略微增加值以剪切掉近距离的结果。

默认值为0.0。


aoDistancefloat

此属性定义了环境遮挡阴影从物体扩散开来的大致距离。更大的距离会导致对性能的影响增加。

默认值为5.0。

此处所示为默认的aoSoftness和最大aoStrength

aoDistance为5aoDistance为1

注意:获得视觉上好的屏幕空间环境遮挡取决于仔细调整许多相关参数,例如aoStrengthaoSoftness、aoDistance、aoDitheraoBiasaoSampleRate

另请参阅:aoStrengthaoSoftness


aoDitherbool

当此属性启用时,它会将环境遮挡阴影带的边缘散布,以改善平滑度(有可能偶尔产生明显的图案伪影)。

注意:相机剪切平面的间距很大可能会导致环境遮挡出现问题。如果您在环境遮挡中看到奇特的带状图案,请尝试调整相机的clipFar属性,使其靠近内容。

默认值为false

另请参阅:PerspectiveCamera.clipFarOrthographicCamera.clipFar


aoEnabledbool [since 6.5]

启用或禁用环境遮挡。

默认值为false,表示环境遮挡已禁用。

注意: 如果 aoStrengthaoDistance 为 0,则将此属性设置为 true 也会适当地设置这些值,使环境光阻尼有效。

注意: 获得视觉效果良好的屏幕空间环境光阻尼取决于精心调整许多相关参数,例如 aoStrengthaoSoftnessaoDistanceaoDitheraoBiasaoSampleRate

此属性于 Qt 6.5 中引入。

另请参阅 aoStrengthaoDistance


aoSampleRate : int

此属性以性能为代价定义了环境光阻尼质量(更多灰度层)。

值必须是 2、3 或 4。默认值是 2。


aoSoftness : float

此属性定义了环境光阻尼着色的边缘平滑程度。

值必须在 0.0 到 50.0 之间。默认值是 50.0。

此处显示默认的 aoDistance 和最大的 aoStrength

aoSoftness 为 50aoSoftness 为 25

注意: 获得视觉效果良好的屏幕空间环境光阻尼取决于精心调整许多相关参数,例如 aoStrength、aoSoftness、aoDistanceaoDitheraoBiasaoSampleRate

另请参阅 aoStrengthaoDistance


aoStrength : float

此属性定义了应用的环境光阻尼量。环境光阻尼是一种近似全局光照的方法,在物体靠得很近时造成非方向性的自阴影。值为 100 则产生完全黑暗的阴影;值较低时阴影看起来更亮。值为 0 将完全禁用环境光阻尼,在牺牲场景中渲染的3D对象视觉真实感的同时提高性能。

除了 0 以外的所有值都会对性能有相同的影响。

默认值为 0.0。最大值为 100.0。

值为 0 等同于将 aoEnabled 设置为 false。

此处显示默认的 aoSoftnessaoDistance

aoStrength 为 0(禁用 AO)aoStrength 为 100aoStrength 为 50

注意: 获得视觉效果良好的屏幕空间环境光阻尼取决于精心调整许多相关参数,例如 aoStrength、aoSoftnessaoDistanceaoDitheraoBiasaoSampleRate

另请参阅 aoEnabledaoDistanceaoSoftness


backgroundMode : enumeration

此属性控制场景背景是否应该清除以及如何清除。

注意:View 3D 的颜色缓冲区清除不一定总是发生:依赖于 renderMode 属性,View3D 可能不会自行进行任何清除操作。在这种情况下,SceneEnvironment.TransparentSceneEnvironment.Color 没有作用。只有默认的 Offscreen 渲染模式(将渲染到纹理中)支持所有清除模式。使用 Underlay 模式时,请使用 QQuickWindow::setColor() 或 Window.color 来控制 Qt Quick 场景的清除颜色。SkyBox 的处理方式不同,因为它涉及到实际几何图形的绘制,所以它在所有渲染模式下工作方式相同。

常量描述
SceneEnvironment.Transparent场景被清除为透明。这用于在另一个项的顶部渲染 3D 内容。当 View3D 在未启用任何后期处理操作的情况下使用 Underlay 或 Overlay 渲染模式时,此模式没有效果。
SceneEnvironment.Color场景使用 clearColor 属性指定的颜色进行清除。当 View3D 在未启用任何后期处理操作的情况下使用 Underlay 或 Overlay 渲染模式时,此模式没有效果。
SceneEnvironment.SkyBox不会清除场景,而是渲染 SkyBox 或 Skydome。SkyBox 使用在 lightProbe 属性中定义的 HDRI 映射进行定义。
SceneEnvironment.SkyBoxCubeMap不会清除场景,而是渲染 SkyBox 或 Skydome。SkyBox 使用在 skyBoxCubeMap 属性中定义的立方图进行定义。

默认值是 SceneEnvironment.Transparent

以下是一个示例。Suzanne 模型预计将被 balsam 工具预处理,并从 glTF 样例模型 存储库中获取。

import QtQuick
import QtQuick3D
import QtQuick3D.Helpers

Item {
    width: 1280
    height: 720

    View3D {
        id: v3d
        anchors.fill: parent

        environment: ExtendedSceneEnvironment {
            backgroundMode: SceneEnvironment.SkyBox
            lightProbe: Texture { source: "00455_OpenfootageNET_field_low.hdr" }

            glowEnabled: true
            glowStrength: 1.25
            glowBloom: 0.25
            glowBlendMode: ExtendedSceneEnvironment.GlowBlendMode.Additive
        }

        DirectionalLight {
        }

        Suzanne {
            scale: Qt.vector3d(50, 50, 50)
            z: -500
        }

        PerspectiveCamera {
            id: camera
        }

        WasdController {
            controlledObject: camera
        }
    }
}

除了使用 DirectionalLight 和使用作为 Skybox 的光照探针纹理外,我们还使用了基于图像的照明,得到以下效果

如果没有光照探针会发生什么?

backgroundMode: SceneEnvironment.Transparent

在这里,背景由 View3D 提供,而不是由宿主 2D 和 3D 场景的 QQuickWindowQQuickView 提供。光照仅基于 DirectionalLight

使用固定的清除颜色

backgroundMode: SceneEnvironment.Color
clearColor: "green"

另请参阅lightProbeQQuickWindow::setColor()、Window::colorView3D


clearColor : color

此属性定义当使用 SceneEnvironment.Color 作为 backgroundMode 属性时将用于清除视口的哪种颜色。

默认值是 Qt::black

另请参阅backgroundMode


debugSettings : QtQuick3D::DebugSettings [since 6.5]

此属性指定一个 DebugSettings 对象,它用于配置渲染器调试工具。在构建期间,SceneEnvironment 会自动创建与自身关联的 DebugSettings 对象,因此通常不需要设置自定义的 DebugSettings 对象。

启用线框模式渲染场景的示例

渲染网格的法线向量

渲染镜面光照贡献

此属性于 Qt 6.5 中引入。

另见 DebugSettings.


depthPrePassEnabled : bool

当启用时,渲染器对不透明对象执行Z-预扫描,这意味着它会用简单的着色器和禁用颜色写入来渲染它们,以便在发出主渲染通道的绘制调用之前预填充深度缓冲区。

这可以根据场景内容提高性能。这通常是具有许多重叠对象和昂贵的片段着色的场景受益。同时,值得注意的是,渲染器对不透明对象执行从前到后的排序,这本身有助于减少不必要的片段着色,因此Z-预扫描并不总是带来显著的改进。

在采用瓦片渲染架构的GPU上,这在移动和嵌入式系统中很常见,建议将其设置为false

默认值为false

注意: 当禁用深度测试时,此属性无效果。


depthTestEnabled : bool

默认值为true。默认情况下,渲染器将场景中的对象分类为不透明半透明。在不透明列表中的对象首先渲染,启用深度测试和深度写入,为没有半透明区域的三维对象提供最佳Z剪裁。在半透明列表中的对象无深度写入(尽管仍启用深度测试,以测试不透明对象),按照从后到前的顺序(根据它们的中心点与相机的距离排序)进行渲染。这允许对具有表面透明区域的3D对象进行正确混合(“穿透”),无论是由于节点不透明度还是由于材料中的某些颜色或纹理图。

当此属性设置为false时,Z缓冲区不会被写入并测试,跳过深度测试,一次性渲染所有对象,从前到后排序。

将此属性设置为false很少需要。在知道在两轮方法中几乎没有收益的场景中可能很有用,因为要么不透明对象非常少,要么它们的变换方式使得单独的从前到后排序的通道表现更好。

注意: 将此属性设置为false可能会在某些场景中导致渲染错误。此外,一些功能,如阴影、环境遮挡、自定义材料和效果中的SCREEN_TEXTUREDEPTH_TEXTURE,在不启用深度缓冲区使用的情况下将无法正确运行。

注意: 此标志不控制深度或深度-模板缓冲区的存在。即使设置为false,此类缓冲区仍可能分配。


effects : List<QtQuick3D::Effect>

此属性包含一个列表,其中包含将应用于整个视口的后期处理效果。每个效果的输出都馈送到下一个效果,因此顺序很重要。

注意: 由于技术原因,将相同的Effect节点多次添加到列表中是不受支持的,并且将产生意外结果。


fog : QtQuick3D::Fog [since 6.5]

当此属性设置为有效的对象时,用于配置渲染器内建的雾支持。

默认值为null,表示无雾。这与将启用属性设置为false的Fog对象等效。

此属性于 Qt 6.5 中引入。

另请参阅


lightProbe : QtQuick3D::Texture

此属性定义了用于照亮场景的图像,可以是标准光源的替代品,也可以与标准光源一起使用。

该图像最好是高动态范围图像或预先生成的立方体贴图。预烘焙可以在运行时提供显著的性能提升,因为不需要花费时间在过滤和米泊生成上。如果源是.hdr或其他图像,基于GPU的预处理会在加载图像文件后运行时发生,这可能会非常耗时,尤其是在嵌入式和移动硬件上。因此,强烈建议应用程序在构建时最新地预处理.hdr图像,如此处所述。

注意:使用带有sourceItem的纹理在此属性组合中不受支持。对于动态Qt Quick内容,所有米泊级别的预过滤通常在实践上不合理,因为会对性能产生影响。

有关基于图像照明的更多信息,请参阅使用基于图像照明

注意:当属性设置为有效的纹理时,lightProbe纹理无论背景模式如何,都用于照明。但是,当将背景模式设置为SceneEnvironment.SkyBox时,该纹理还用于作为天空盒渲染场景背景。

以下示例使用以下场景环境中的不同的背景模式生成。该场景没有任何方向光、点光源聚光灯。所有照明均基于全景HDR图像。

import QtQuick
import QtQuick3D
import QtQuick3D.Helpers

Item {
    width: 1280
    height: 720

    View3D {
        id: v3d
        anchors.fill: parent

        environment: ExtendedSceneEnvironment {
            backgroundMode: SceneEnvironment.SkyBox
            lightProbe: Texture { source: "00455_OpenfootageNET_field_low.hdr" }

            tonemapMode: SceneEnvironment.TonemapModeFilmic
            sharpnessAmount: 0.4

            glowEnabled: true
            glowStrength: 1.25
            glowBloom: 0.25
            glowBlendMode: ExtendedSceneEnvironment.GlowBlendMode.Additive
        }

        Node {
            scale: Qt.vector3d(100, 100, 100)

            Sponza {
            }

            Suzanne {
                y: 1
                scale: Qt.vector3d(0.5, 0.5, 0.5)
                eulerRotation.y: -90
            }
        }

        PerspectiveCamera {
            id: camera
            y: 100
        }

        WasdController {
            controlledObject: camera
        }
    }
}

上述环境的结果

背景模式切换到SceneEnvironment.Transparent将给出

这里3D场景的照明与之前相同,意味着材质在照明计算中使用光探针的方式与之前相同,但未渲染天空盒。背景是白色,因为这是托管2D和3D场景的QQuickWindow的默认全局颜色。

将lightProbe属性值设置回默认null是有意义的。这将取消分配先前关联的纹理。例如,让我们使用Delete键动态地在带有天空盒的基于图像的照明和无图像照明之间切换,其中背景是固定的全局颜色

environment: ExtendedSceneEnvironment {
    id: env

    backgroundMode: SceneEnvironment.SkyBox
    lightProbe: iblTex

    tonemapMode: SceneEnvironment.TonemapModeFilmic
    sharpnessAmount: 0.4

    glowEnabled: true
    glowStrength: 1.25
    glowBloom: 0.25
    glowBlendMode: ExtendedSceneEnvironment.GlowBlendMode.Additive
}

Texture {
    id: iblTex
    source: "00455_OpenfootageNET_field_low.hdr"
}

focus: true
Keys.onDeletePressed: {
    if (env.backgroundMode == SceneEnvironment.SkyBox) {
        env.backgroundMode = SceneEnvironment.Color;
        env.clearColor = "green";
        env.lightProbe = null;
    } else {
        env.backgroundMode = SceneEnvironment.SkyBox;
        env.lightProbe = iblTex;
    }
}

按下Delete键给出以下结果。请记住,这里使用的场景没有光,因此所有3D模型都完全呈现为黑色。

虽然lightProbe通常与源自图像文件(通常是.hdr或.ktx)的Texture实例结合使用,但它也可以与使用内存中过程生成的图像数据的Texture相关联。这方面的主要例子是,图像数据由来自QtQuick3D.Helper模块的ProceduralSkyTextureData生成。

backgroundMode: SceneEnvironment.SkyBox
lightProbe: Texture {
    textureData: ProceduralSkyTextureData {
    }
}

这为我们提供了一个用于同时作为天空盒和图像照明使用的生成式HDR天空盒纹理。

参见 背景模式使用基于图像的照明预生成IBL立方图探测曝光探测地平线探测方向程序化天空纹理数据


lightmapper : 光采样器

当此属性设置为有效的光采样器对象时,在烘焙光照贴图时将考虑该对象指定的设置。

默认值为null,表示使用所有烘焙相关设置的默认值。

有关烘焙光照贴图的更多信息,请参阅光采样器文档。

当光照贴图对应用程序不相关,并且永远不会生成烘焙照明时,实际上这个属性及其相关对象没有用途。

参见 模型::usedInBakedLighting模型::bakedLightmap照明::bakeMode光采样器


probeExposure : float

此属性修改光探针发出的光量。色调映射的一部分是曝光映射,此属性调整光探针中的光值如何进行色调映射。

默认情况下,曝光设置为1.0

注意:当色调映射模式设置为SceneEnvironment.TonemapModeNone时,此属性没有效果。

参见 lightProbe探测地平线探测方向


probeHorizon : float

当定义此属性并使用递增的值时,会增加环境的底部(黑)部分的暗度,强迫照明主要来自图像的顶部(并从下半部分的图像中去除特定的反射)。此属性有助于考虑地平面的效应,它会使地面的光探针反射消失。这是必要的,因为光探针贡献直接来自图像,而不考虑场景的内容。

探测地平线属性的预期值范围在0.0到1.0之间。任何超出此范围的值都将被夹到预期范围内。

默认情况下,探测地平线设置为0.0,这意味着整个光探针被使用而不做任何调整。

注意:探测地平线属性仅影响材料照明,对天空盒的渲染没有影响。

参见 lightProbe探测曝光探测方向


probeOrientation : vector3d

当定义此属性时,此属性定义光探针的方向。方向是用x、y和z轴上的欧拉角度定义的。

注意:此值增强lightProbe纹理的采样,结合设置在lightProbe上的任何纹理旋转和偏移。

参见 lightProbe探测地平线探测曝光


scissorRect : rect [since 6.5]

此属性定义了视图坐标系中的裁剪矩形,左上角位于 [0, 0]

此属性于 Qt 6.5 中引入。


skyBoxCubeMap : QtQuick3D::CubeMapTexture [since 6.4]

此属性定义了一个用于当背景模式为 SkyBoxCubeMap 时作为天空盒使用的立方体贴图。

此属性是在 Qt 6.4 中引入的。


skyboxBlurAmount : float [since 6.4]

此属性确定当使用 SceneEnvironment.SkyBox 作为 backgroundMode 属性时,天空盒应该被模糊的程度。默认值为 0.0,这意味着没有模糊。

可接受的值范围在 0.0 到 1.0 之间,所有其他值都将被限制在这个范围内。

此属性是在 Qt 6.4 中引入的。


specularAAEnabled : bool [since 6.4]

当此属性被启用时,将减轻镜面伪影。镜面伪影通常以明亮的小点形式出现,在摄像机移动时可能会闪烁。

默认值为 false。

镜面 AA 未启用镜面 AA 已启用

此属性是在 Qt 6.4 中引入的。


temporalAAEnabled : bool [default: false]

当此属性被启用时,将使用时间抗锯齿。

相机在帧之间轻微抖动,并且每一个新帧的结果都将与前一帧混合。

注意:antialiasingMode 是 MSAA 时,时间抗锯齿没有效果。

注意:当与 ProgressiveAA antialiasingMode 结合使用时,当场景动画时使用时间AA,而当动画停止时使用 ProgressiveAA。

优点:由于相机抖动,它找到了之前丢失的细节;对性能影响低。

缺点:快速移动的物体会导致一帧幽灵般的残留。


temporalAAStrength : float [default: 0.3]

此属性修改时间移动量(抗锯齿)。这仅当 temporalAAEnabled 属性为 true 时才有效。

另请参阅temporalAAEnabled


tonemapMode : enumeration [since 6.0]

此属性定义了在渲染前如何对颜色进行调色映射。Qt Quick 3D 中所有渲染都是在线性颜色空间中执行的,并且在许多情况下会产生无法显示的颜色值。tonemapMode 确定用于将颜色重映射到可显示范围的技术。

默认值是 SceneEnvironment.TonemapModeLinear

常量描述
SceneEnvironment.TonemapModeNone跳过所有调色映射。此模式在执行后期处理效果时很有用。
SceneEnvironment.TonemapModeLinear应用线性调色映射。颜色经伽玛校正并返回到 sRGB 颜色空间。
SceneEnvironment.TonemapModeAces应用 Academy Color Encoding System 调色映射。
SceneEnvironment.TonemapModeHejlDawson应用 Hejl-Dawson 调色映射。
SceneEnvironment.TonemapModeFilmic应用 Filmic 调色映射。

有关这些不同模式的示例,请参阅 ExtendedSceneEnvironment

注意:在使用后处理效果时,大多数效果需要未调色的线性色彩数据。在使用通过 Effect 类型提供的自定义效果时,了解从 Qt 6.5 开始,效果可以安全地假设它们与线性色彩数据一起工作,并且色调映射会在链中最后一个效果的输出上自动执行。如果需要完全自定义色调映射,请考虑将 SceneEnvironment.TonemapModeNone 值设置为禁用内置色调映射器,并在链中最后一个效果的色彩值上进行适当的调整。这一点不适用于 ExtendedSceneEnvironment 的内置效果,因为这些会自动处理适当的色调映射,不受环境中启用的内置效果组合的影响。

此属性是在 Qt 6.0 中引入的。


© 2024 Qt 公司 Ltd. 本文档中包含的贡献归各自所有者所有。此处提供的文档是根据自由软件基金会发布的 GNU 自由文档许可版 1.3 的条款授予许可的。Qt 及相关标志是芬兰及/或全球其他国家的 The Qt Company Ltd. 的商标。所有其他商标均为其各自所有者的财产。