首页 > 其他分享 >OSG开发笔记(三十四): OsgUtil::Simplifier:简化几何体,提升显示性能和渲染效率

OSG开发笔记(三十四): OsgUtil::Simplifier:简化几何体,提升显示性能和渲染效率

时间:2024-11-25 10:55:14浏览次数:3  
标签:Simplifier osgUtil 几何体 简化 pMatrixTransform OsgUtil osg

前言

  对于一些较大的图形,会出现显示卡顿和渲染缓慢的问题,这时候就要使用到osgUtil::Simplifier简化器,来对其进行简化。

 

Demo

  在这里插入图片描述

  在这里插入图片描述

  在这里插入图片描述

 

osgUtil

  osgUtil库是osg的四大核心库之一,OSG 核心库提供了用于场景图形操作的核心场景图形功能、类和方法;开发3D图形程序所需的某些特定功能函数和编程接口,以及2D和3D文件I/O的OSG 插件入口。
  在这里插入图片描述
  osgUtil(OSG Utilities)模块提供了场景更新、裁剪、绘制、数据统计等公用工具。

 

osgUtil::Simplifier:简化几何体类

  在这里插入图片描述

  OsgUtil::Simplifier 是 OpenSceneGraph (OSG) 库中的一个工具类,用于简化几何图形。OpenSceneGraph 是一个高性能的场景图渲染引擎,用于图形应用程序的开发,比如可视化、模拟、虚拟现实和游戏等。OsgUtil::Simplifier 类提供了一种方法来减少场景中的多边形数量,这在需要优化渲染性能或减小场景文件大小时非常有用。

功能概述

  OsgUtil::Simplifier 的主要功能是简化几何体,比如网格(mesh)。它通过移除一些不太重要的顶点或边来实现这一点,从而减少多边形的数量。简化的程度可以通过参数设置来控制,以达到在保持视觉质量的同时减少渲染负载的目的。

使用场景

  • 性能优化:在需要渲染大量几何体时,通过简化几何体可以减少GPU的负担,提高渲染速度。
  • 文件大小优化:简化后的几何体可以生成较小的场景文件,这对于网络传输或资源存储都是有益的。
  • 实时应用:在实时渲染应用中,如虚拟现实或增强现实,简化可以帮助保持帧率稳定,提供流畅的用户体验。

基本用法

  使用 OsgUtil::Simplifier 通常涉及以下几个步骤:

  • 创建简化器实例:创建一个 OsgUtil::Simplifier 的实例。
  • 设置简化参数:通过配置简化器的参数(如目标多边形数量、误差容限等)来控制简化的程度。
  • 应用简化:将需要简化的几何体(如 osg::Geometry 或 osg::Node)传递给简化器进行处理。
  • 获取结果:简化器处理后会返回简化后的几何体,可以将其用于渲染。
      注意事项
  • 视觉质量:虽然简化可以提高性能,但过度简化可能会导致视觉质量的显著下降。因此,需要仔细调整简化参数以找到性能和质量的平衡点。
  • 数据完整性:简化过程中可能会修改原始数据,因此在使用前最好保留原始数据的备份。
  • 资源消耗:简化操作可能需要一定的计算资源,特别是在处理复杂的几何体时。因此,在实时应用中需要谨慎使用,以避免引入额外的延迟。
      OsgUtil::Simplifier 是 OpenSceneGraph 提供的一个强大工具,可以帮助开发者在不影响视觉体验的前提下,优化渲染性能和资源使用。
 

osgUtil::Simplifier使用步骤

步骤一:引入头文件

   在这里插入图片描述

#include <osgUtil/Simplifier>

步骤二:创建实例,同步设置简化参数

  在这里插入图片描述

// 步骤二:创建实例
double sampleRatio = 0.5f;
double maximumError = 4.0f;
double maximumLength = 0.0f;
osgUtil::Simplifier simplifier = osgUtil::Simplifier(sampleRatio, maximumError, maximumLength); 

步骤三:应用简化到几何体

  在这里插入图片描述

// 步骤三:设置简化参数
osg::ref_ptr<osg::Node> pNode2 = (osg::Node*)pNode->clone(osg::CopyOp::DEEP_COPY_ALL);
// 接收报错:terminate called after throwing an instance of 'std::bad_alloc' what():  std::bad_alloc
//          模型太大,简化类型时出现内存分配错误
pNode2->accept(simplifier);

步骤四:使用简化后的几何体

  在这里插入图片描述

// 移动下,方便对比
osg::ref_ptr<osg::MatrixTransform> pMatrixTransform = new osg::MatrixTransform();
pMatrixTransform->addChild(pNode2);
osg::Matrix matrix = pMatrixTransform->getMatrix();
matrix = matrix * osg::Matrix::translate(0, 3.5, 0);
pMatrixTransform->setMatrix(matrix);
pGroup->addChild(pMatrixTransform);
 

Demo源码

osg::ref_ptr<osg::Node> OsgWidget::getSimplifierNode()
{
    // 其他demo的控件
    updateControlVisible(false);

    osg::ref_ptr<osg::Group> pGroup = new osg::Group();

    // 加载支持stl格式插件
//    osgDB::Registry::instance()->addFileExtensionAlias(".stl", "stl");

    // 加载模型
    {
        osg::ref_ptr<osg::Node> pNode;
        QString filePath = "T:/CVN76.STL";

//        QString filePath = "cow.osg";
        pNode = osgDB::readNodeFile(filePath.toStdString());
        if(!pNode.get())
        {
            LOG << "Failed to openFile:" << filePath;
        }

        pGroup->addChild(pNode);

#if 1
        // 对模型进行简化
        // 步骤一:添加头文件
//        #include <osgUtil/Simplifier>
        // 步骤二:创建实例
//        double sampleRatio = 0.5f;
//        double sampleRatio = 0.3f;
        double sampleRatio = 0.1f;
        double maximumError = 4.0f;
        double maximumLength = 0.0f;
        osgUtil::Simplifier simplifier = osgUtil::Simplifier(sampleRatio, maximumError, maximumLength);
        // 步骤三:设置简化参数
        osg::ref_ptr<osg::Node> pNode2 = (osg::Node*)pNode->clone(osg::CopyOp::DEEP_COPY_ALL);
        // 接收报错:terminate called after throwing an instance of 'std::bad_alloc' what():  std::bad_alloc
        //          模型太大,简化类型时出现内存分配错误
        pNode2->accept(simplifier);

        // 移动下,方便对比
        osg::ref_ptr<osg::MatrixTransform> pMatrixTransform = new osg::MatrixTransform();
        pMatrixTransform->addChild(pNode2);
        osg::Matrix matrix = pMatrixTransform->getMatrix();
        matrix = matrix * osg::Matrix::translate(0, 3.5, 0);
        pMatrixTransform->setMatrix(matrix);

        pGroup->addChild(pMatrixTransform);
#endif
    }

    return pGroup.get();
}
 

工程模板v1.37.0

  在这里插入图片描述

 

入坑

入坑一:应用简化器的时候崩溃

问题

  应用简化器的时候崩溃
  在这里插入图片描述

原因

  是模型太大,简化失败, 因为测试了其他图形是可以的:
  在这里插入图片描述

  崩溃时的cpu、内存和gpu占用率:
  在这里插入图片描述

  看到其保存的文件达到300MB:
  在这里插入图片描述

解决

  可尝试加大内存,因为笔者是mingw32版本的,没有进行研究了,具体参照文章《关于 Qt运行加载内存较大崩溃添加扩大运行内存 的解决方法》

标签:Simplifier,osgUtil,几何体,简化,pMatrixTransform,OsgUtil,osg
From: https://www.cnblogs.com/qq21497936/p/18567132

相关文章

  • 35. 模型材质和几何体属性
    本文章给大家介绍模型对象的几何体.geometry和材质属性.material。浏览器控制台查看对象和属性浏览器控制打印模型对象mesh,可以展开对象,查看对象的几何体.geometry和材质属性.material。constmesh=newTHREE.Mesh(geometry,material);console.log('mesh',mesh);浏览......
  • 23. 几何体顶点位置数据和点模型
    本节课主要目的是给大家讲解几何体geometry的顶点概念,相对偏底层一些,不过掌握以后,你更容易深入理解Threejs的几何体和模型对象。缓冲类型几何体BufferGeometrythreejs的长方体BoxGeometry、球体SphereGeometry等几何体都是基于BufferGeometry (opensnewwindow)类构建的,Bu......
  • 第四章 Three.js 绘制基本几何体
    本章将介绍如何使用Three.js绘制各种基本几何体,包括立方体、球体、圆柱体、圆锥体、平面和环形几何体。我们将详细讲解每种几何体的创建方法,并通过示例代码展示如何将它们添加到场景中。4.1立方体(BoxGeometry)立方体是最基础的几何体之一。Three.js提供了THREE.Box......
  • d3d12龙书阅读----绘制几何体(上) 课后习题
    d3d12龙书阅读----绘制几何体(上)课后习题练习1完成相应的顶点结构体的输入-布局对象typedefstructD3D12_INPUT_ELEMENT_DESC{一个特定字符串将顶点结构体数组里面的顶点映射到顶点着色器的输入签名LPCSTRSemanticName;语义索引如果语义名相同的......
  • threejs 几何体的本质 顶点
    几何体的线框模式,一个正方平面最少可以由4个顶点组成,两个三角形组成(公用了2个顶点,使用了索引创建顶点属性)。//导入threejsimport*asTHREEfrom"three";import{OrbitControls}from"three/examples/jsm/controls/OrbitControls.js";//引入dat.gui.js的一个类GU......
  • three.js基础之几何体颜色、纹理贴图、外部模型
    几何体颜色<body><canvasid="mainCanvas"width="400px"height="300px"></canvas></body><scripttype="importmap">{"imports":{"three":"./js/build/......
  • three.js基础之几何体Curve、Geometry
    CurveEllipseCurve<canvasid="EllipseCurve"width="300px"height="200px"></canvas><canvasid="ArcCurve"width="300px"height="200px"></canvas><canvasid="Curv......
  • STLExporter 是用于将 Three.js 场景中的几何体数据导出为 STL 格式的类。
    demo案例STLExporter是用于将Three.js场景中的几何体数据导出为STL格式的类。下面是关于STLExporter的入参、出参、方法和属性的讲解:入参(Parameters):scene:THREE.Scene类型的参数,表示要导出为STL格式的Three.js场景对象。出参(ReturnValue):string:......
  • d3d12龙书阅读----绘制几何体(上)
    d3d12龙书阅读----绘制几何体(上)本节主要介绍了构建一个简单的彩色立方体所需流程与重要的api下面主要结合立方体代码分析本节相关知识顶点输入装配器阶段的输入首先,我们需要定义立方体的八个顶点顶点结构体:structVertex{XMFLOAT3Pos;XMFLOAT4Color;};当然......
  • Three——四、几何体、高光网络材质、锯齿模糊以及GUI库的使用
    Threejs常见几何体简介Three.js常见的几何体:常见的几何体://BoxGeometry:长方体constgeometry=newTHREE.BoxGeometry(100,100,100);//SphereGeometry:球体constgeometry=newTHREE.SphereGeometry(50);//CylinderGeometry:圆柱constgeometry=newTHREE.CylinderGe......