Qt Quick 3D 级别细节

级别细节 (LoD)

级别细节 (LoD) 指的是在不同的距离处使用 3D 模型的不同版本的技术。这样做是为了通过在模型远离或占屏幕很小一部分时使用模型的简化版本,而在靠近或占屏幕空间较大一部分时使用更详细的版本来优化资源使用。这种方法可以在保持视觉保真的同时,有效地使用 GPU 资源。

Qt Quick 3D 提供了自动和显式的级别细节系统。自动系统是基于使用存储在网格文件中具有多个水平细节的单个网格。显式系统是基于使用 LodManager 组件,通过子模型指定不同的细节级别。

自动级别细节

使用自动级别细节支持的主要方法是通过使用 Balsam 资产导入工具 导入内容。在导入资产时,使用标志 --generateMeshLevelsOfDetail,当可能时,该工具将为每个网格生成级别细节。这是通过尝试简化原始网格的几何形状,同时保持整体特征来完成的。结果是额外的几何形状以及新索引值,每个额外细节级别都有一个用于确定给定渲染大小的网格的索引因子。这个指数因子与被渲染的物体到摄像机的距离成正比,但最重要的是,它有一个像素每几何形状的良好比率。这些数据将写入 .mesh 文件,并在使用 Model 时自动使用。

自动系统的权衡,以及为什么默认不启用它的原因,是在几何形状减少时,可能也会引入视觉伪影。所用的几何形状简化算法试图保留模型的特征,但在某些情况下,可能需要重新计算网格的正常值以保持预期的视觉外观。这可以通过在导入资产时使用标志 --recalculateLodNormals 来完成。通过传递欧拉角度值到参数 --recalculateLodNormalsMergeAngle--recalculateLodNormalsSplitAngle,可以通过控制合并或拆分正常值的角来进一步调整正常值重新计算过程。

自动系统的主要优点是一旦资产已导入并设置适当,则很容易使用。无需编写任何额外代码即可使用自动系统,任何引用包含级别细节几何形状生成的网格文件的模型都将自动根据该模型在屏幕上占据的像素数量选择适当的几何形状。

可以在全局级别或模型级别通过使用CameraModellevelOfDetailBias属性来调整自动级别细节选择行为的设定。这些偏差属性的默认值1.0表示信任自动系统计算得出的值。这个值与理想值有偏差,因此小于1.0的值需要在切换到更低细节级别之前具有更小的渲染尺寸。大于1.0的值会导致较早使用更低的细节级别。值为0.0将完全禁用细节级别的使用,始终使用原始网格几何形状。

自动系统不像显式系统那样灵活。例如,自动系统始终为所有细节级别使用相同的材质,但这不一定总是希望的。另一个潜在的缺点是,不同细节级别之间没有过渡,而自动细节级别理想情况下不应有必要,但对于某些用例可能是有希望的。

显式细节级别

显式细节级别系统比自动系统更灵活,但需要更多的工作来实现。显式系统基于使用LodManager组件来指定不同的细节级别,作为子Model组件。任何是Model实例的LodManager的子代都将被视为细节级别。这相当强大,因为每个细节级别都可以是完全定制的模型,有它自己的几何形状和材质。

LodManager组件还有一个distances属性,用于确定使用哪个子Model。随着摄像头距离接近每个距离边界,LodManager节点将过渡到下一个子Model。可以使用fadeDistance属性来设置交叉淡入淡出过渡在距离边界附近的开始和结束。

以下是如何使用显式细节级别系统的示例

在参考示例中,使用LodManager来明确定义大理石半身的每个细节级别的不同网格文件。

LodManager {
    camera: camera
    distances: [100, 140, 180]
    fadeDistance: 10

    Model {
        scale: Qt.vector3d(100, 100, 100);
        source: "meshes/marble_bust_01_LOD_0.mesh"
        materials: [ marbleMaterial ]
    }

    Model {
        scale: Qt.vector3d(100, 100, 100);
        source: "meshes/marble_bust_01_LOD_1.mesh"
        materials: [ marbleMaterial ]
    }

    Model {
        scale: Qt.vector3d(100, 100, 100);
        source: "meshes/marble_bust_01_LOD_2.mesh"
        materials: [ marbleMaterial ]
    }

    Model {
        scale: Qt.vector3d(100, 100, 100);
        source: "meshes/marble_bust_01_LOD_3.mesh"
        materials: [ marbleMaterial ]
    }
}

对于此代码,这是一个定义的示意图,其中指出了如何使用距离列表来定义不同细节级别之间的边界,以及用于定义交叉淡入淡出过渡的 fadeDistance 属性。

© 2024 Qt公司有限。此处包含的文档贡献是各自所有者的版权。提供的文档受GNU自由文档许可1.3版条款的许可,由自由软件基金会发布。Qt和相应标志是芬兰和/或其他地区的Qt公司的商标。所有其他商标均为各自所有者的财产。