OSG开发笔记(三十四): OsgUtil::Simplifier:简化几何体,提升显示性能和渲染效率
前言
对于一些较大的图形,会出现显示卡顿和渲染缓慢的问题,这时候就要使用到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运行加载内存较大崩溃添加扩大运行内存 的解决方法》
OSG开发笔记(三十四): OsgUtil::Simplifier:简化几何体,提升显示性能和渲染效率的更多相关文章
- 树莓派开发笔记(十四):入手研华ADVANTECH工控树莓派UNO-220套件(三):使用研发自带系统测试rtc、gpio、232和485套件接口
前言 上一篇说明了必须要使用研华自带的8G卡的系统,通过沟通拿到了相关的系统,购买的时候会带8GB的卡,请自行备份一份镜像.本篇对uno-220套件的相关研华配套的额外接口做测试,篇幅较长,重点讲 ...
- Java开发笔记(十四)几种运算符的优先级顺序
到目前为止,我们已经学习了Java语言的好几种运算符,包括算术运算符.赋值运算符.逻辑运算符.关系运算符等基础运算符,并且在书写赋值语句时都没添加圆括号,显然是默认了先完成算术.逻辑.关系等运算,最后 ...
- Android笔记三十四.Service综合实例二
综合实例2:client訪问远程Service服务 实现:通过一个button来获取远程Service的状态,并显示在两个文本框中. 思路:如果A应用须要与B应用进行通信,调用B应用中的getName ...
- .Net开发笔记(十四) 基于“泵”的UDP通信(接上篇)
上一篇中说到了“泵”在编程中的作用以及一些具体用处,但没有实际demo,可能不好理解,这篇文章我分享一个UDP通信的demo,大概实现了类似“飞鸽传书”在局域网中文本消息和文件传输的功能.功能不全也不 ...
- BizTalk开发系列(三十四) Xpath
XPath 是在 XML 文档中查找信息的语言,在BizTalk的开发中应用非常广泛,当然你可以不必先学Xpath再去学BizTalk.但是如果对Xpath有一定了解的 话,在很多应用下会使你的开发更 ...
- Android UI开发第三十四篇——SlidingPaneLayout
SlidingPaneLayout也是系统支持的高级控件,是Android团对在2013 google IO大会期间更新的Support库(Version 13)中新加入的重要的功能.它支持左右滑动菜 ...
- 网站开发进阶(三十四)编码中的setCharacterEncoding 理解
编码中的setCharacterEncoding 理解 1.pageEncoding="UTF-8"的作用是设置JSP编译成Servlet时使用的编码. 2.contentType ...
- tensorflow学习笔记(三十四):Saver(保存与加载模型)
Savertensorflow 中的 Saver 对象是用于 参数保存和恢复的.如何使用呢? 这里介绍了一些基本的用法. 官网中给出了这么一个例子: v1 = tf.Variable(..., nam ...
- Java开发学习(三十四)----Maven私服(二)本地仓库访问私服配置与私服资源上传下载
一.本地仓库访问私服配置 我们通过IDEA将开发的模块上传到私服,中间是要经过本地Maven的 本地Maven需要知道私服的访问地址以及私服访问的用户名和密码 私服中的仓库很多,Maven最终要把资源 ...
- PHP学习笔记三十四【记录日志】
<?php function my_error2($errno,$errmes) { echo "错误号:".$errno; //默认时区是格林威治相差八个时区 //设置 1 ...
随机推荐
- Java Swing Loading转圈的进度提示框
Java Swing Loading转圈的进度提示框 具体只需要两个类 AnimatedPanel.java InfiniteProgressPanel.java 前因:我们开发的web应用,有个奇葩 ...
- springboot 静态文件夹
正常这个很久了,不需要写,但是好几年没有写这个相关的,都忘了,好记性不如烂笔头 spring: resources: static-locations: file:D:\\test #对应服务器内映射 ...
- docker stop 容器,连接被拒绝
docker stop 容器ID 报错,无法kill,连接被拒绝 经过网上查找以及实际情况,发现原因为: 服务器重启时,正在运行的docker内的容器正在进行处理, 因为docker没有提前关闭,导致 ...
- fluent python-chap2
1. 内置序列类型 容器序列: list tuple collections.deque 可以存放不同类型的数据. 存放的是它们所包含的任意类型的对象的引用. 扁平序列: str bytes byte ...
- PRCV 2023:语言模型与视觉生态如何协同?合合信息瞄准“多模态”技术
PRCV 2023:语言模型与视觉生态如何协同?合合信息瞄准"多模态"技术 近期,2023年中国模式识别与计算机视觉大会(PRCV)在厦门成功举行.大会由中国计算机学会(CCF). ...
- MDC – Material Design, Angular Material, MDC, MWC, Lit 的关系
前言 它们关系挺乱的, 而且不只是我一个人感觉乱 还有 所以这篇做一个整理吧. Material Design Google 的设计指南. 早年用于 Android Apps, 现在也用于 Web A ...
- Jmeter、postman、python 三大主流技术如何操作数据库?
1.前言 只要是做测试工作的,必然会接触到数据库,数据库在工作中的主要应用场景包括但不限于以下: 功能测试中,涉及数据展示功能,需查库校验数据正确及完整性:例如商品搜索功能 自动化测试或性能测试中,某 ...
- Spring —— IoC入门案例
IoC入门案例 思路分析: 1.管理什么?(Service与Dao) 2.如何将被管理的对象告知IoC容器?(配置) 3.被管理的对象交给IoC容器,如何获取到IoC容器? ...
- CSS 学习路线图
一.基础入门阶段 学习内容: 理解 CSS 的作用和基本概念,包括样式表如何与 HTML 结合来美化网页. 掌握 CSS 的语法结构,如选择器.属性和值的组合方式. 学习常见的文本样式属性,如字体大小 ...
- 暑集假训SCP提高拟模21
\[だから妄想感傷代償連盟 \] \[愛を懐いて理想を叫んだ \] \[行き場のない愚者のメロディー \] \[再挑戦•転生•テレポーテーション \] \[何回だって 重ねて逝くんだ \] \[終わり ...