English 简体中文 繁體中文 한국 사람 日本語 Deutsch русский بالعربية TÜRKÇE português คนไทย french
查看: 3|回复: 0

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

[复制链接]
查看: 3|回复: 0

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

[复制链接]
查看: 3|回复: 0

392

主题

0

回帖

1184

积分

管理员

积分
1184
溯源设备

392

主题

0

回帖

1184

积分

管理员

积分
1184
2025-2-7 02:35:46 | 显示全部楼层 |阅读模式
前言


  对于一些较大的图形,会出现显示卡顿和渲染缓慢的问题,这时候就要使用到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运行加载内存较大崩溃添加扩大运行内存 的解决方法》
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|智能设备 | 粤ICP备2024353841号-1

GMT+8, 2025-3-10 14:47 , Processed in 0.699741 second(s), 30 queries .

Powered by 智能设备

©2025

|网站地图