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

news/2025/2/23 14:26:31/文章来源:https://www.cnblogs.com/qq21497936/p/18567132

前言

  对于一些较大的图形,会出现显示卡顿和渲染缓慢的问题,这时候就要使用到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运行加载内存较大崩溃添加扩大运行内存 的解决方法》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/840765.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

带排序功能的js masonry瀑布流插件

在线预览 下载sortableJs是一款带排序功能的js masonry瀑布流插件。sortableJs能够使元素以卡片形式显示,并以masonry瀑布流方式进行布局,通过点击分类按钮,可以将卡片按指定的方式动态排序。使用方法 在页面中引入sortable.min.css和sortable.min.js文件。< link rel=…

OpenDaylight安装和配置

环境: Ubuntu 14.04.6 LTS (GNU/Linux 4.4.0-142-generic x86_64) 注意,需要确保虚拟机中安装有jdk root@UbuntuDesktop:~# java -version java version "1.8.0_151" Java(TM) SE Runtime Environment (build 1.8.0_151-b12) Java HotSpot(TM) 64-Bit Server VM (b…

如何测试一根网线传输质量

我心里有个疑问,一根成品网线或者自己制作的网线传输质量到底好不好,应该如何判断?这些网线速度到底如何是拿测线器测不出来的,毕竟测线器只能测试线路的通断,但线路质量是测试不出的。 我们也没有高大上的福禄克设备毕竟对于家里的几根线,动用这么专业高价的设备也不值当…

leetcode240

leetcode240思路:我们将矩阵逆时针旋转45度,可以发现矩阵变成了一个二叉搜索树,往左走是小,往右走是大。这样就能以matrix[0] [j]为根开始搜索。class Solution {//10:20~10:28public boolean doSearch(int[][] matrix,int i,int j,int target){if (i>=matrix.length||i…

能不能用uni开发一个线上运动会的APP、小程序?

引言:uni-app凭借其强大的跨平台能力,成为开发AI运动类APP和小程序的首选框架。本文旨在探讨基于uni进行开发AI运动小程序、APP开发,以及开发过程中遇到的技术难点,并为您介绍一个开箱即用的解决方案。一、为什么选择uni开发APP、小程序。 在数字化时代,移动应用开发已成为…

代码随想录之滑动窗口、螺旋矩阵、区间和、开发商土地;Java之数据结构、集合源码、File类和Io流以及网络编程(11.22)

代码随想录 滑动窗口 1、如果给两个字符串s和t,判断t是否为s的子串或是否s包含t的排列,用t的长度固定滑动窗口的大小,初始化将s的前t.length()个长度的字符情况存储在int数组中,int数组的大小由字符串中字符的类型决定,最大为ascii表的长度,为128。每次循环滑动窗口向前移…

代码随想录之滑动窗口、螺旋矩阵、区间和、开发商土地;Java之数据结构、集合源码、File类和Io流以及网络编程(11.23)

代码随想录 滑动窗口 1、如果给两个字符串s和t,判断t是否为s的子串或是否s包含t的排列,用t的长度固定滑动窗口的大小,初始化将s的前t.length()个长度的字符情况存储在int数组中,int数组的大小由字符串中字符的类型决定,最大为ascii表的长度,为128。每次循环滑动窗口向前移…

一文详解:项目如何从Docker慢慢演变成了K8s部署

今天,我们将深入探讨一个项目部署的演变过程。在这篇文章中,为了紧扣主题,我们将从 Docker 开始讲解,分析为什么一个传统的项目逐步演变成了今天流行的 Kubernetes(K8s)集群部署架构。我们将通过一个简单的 Java 项目来阐述这一过程。 为了更清晰地阐述,我在本地搭建了一…

HyperWorks基于几何投影的网格变形

在Altair(HyperWorks)里,使用本节将演示如何通过 line difference 功能,将已有网格以几何图形为目标进行投影,以生成全新的网格模型。 图 7-5 网格变形模型的状态Step01:读取模型。 (1) 打开文件 Exercise_7a.hm。 Step02:对保险杠模型进行网格变形。 (1) 在 Morphing 页…

vivo 企业云盘服务端实现简介

本文将介绍企业云盘的基本功能以及服务端实现。作者:来自 vivo 互联网存储团队- Cheng Zhi本文将介绍企业云盘的基本功能以及服务端实现。 一、背景 vivo 企业云盘是一个企业级文件数据管理服务,解决办公数据的存储、共享、审计等文件管理需求;同时便于团队成员快速共享、管…

100ASK_IMX6ULL-PRO 数码相框扩展项目:支持鼠标输入

1. 鼠标输入事件 驱动已支持,测试 Hexdump /dev/input/eventX确定设备节点 项目中的输入模块 输入事件的获取 项目启动时初始化输入设备 InputDeviceInit,通过链表进行设备管理,对于每一个注册的输入设备创建一个线程阻塞式读取输入数据: static void *InputEventThreadFun…

Public Key Retrieval is not allowed解决

1、在链接的驱动属性中,增加allowPublicKeyRetrieval=true “Public Key Retrieval is not allowed” 错误是由于 MySQL 连接驱动程序的默认行为更改所引起的。在 MySQL 8.0 版本及更新版本中,默认情况下禁用了通过公钥检索用户密码的功能。 在旧版本的 MySQL 中,客户端连接…