osg

WIN10系统下OSG+VS2017或者vs2019环境搭建

天涯浪子 提交于 2020-03-26 15:29:35
** WIN10系统下OSG+VS2017或者vs2019环境搭建 ** 一、资料准备 1、OSG源码下载地址: http://www.openscenegraph.org/index.php/download-section/stable-releases (OpenSceneGraph-3.4.1 release 稳定版本)。 2、OSG第三方依赖库下载地址: http://www.openscenegraph.org/index.php/download-section/dependencies (3rdParty_VS2017_v141_x64_V11) vs2019也适用。 注:第三方库版本必须与Visual Studio版本相对应,本文所用只适用于Visual Studio2017 以上版本,,平台工具集版本为v141的情况下。 3、数据包下载地址: http://www.openscenegraph.org/index.php/download-section/data (OpenSceneGraph-3.4 standard dataset)。 4、编码工具下载地址: https://cmake.org/download/ (我用的是CMake 3.9.3版本)。 二、编译准备 为了编译的顺利进行,将下载的文件组织如下: 在D盘建立一个OSG的文件夹

探究osg中的程序设计模式【目录】

末鹿安然 提交于 2020-03-26 07:31:33
前序 探究osg中的程序设计模式---开篇 探究osg中的程序设计模式---创造性模式 探究osg中的程序设计模式---创造型模式---Factory(工厂)模式 探究osg中的程序设计模式---创造型模式---AbstractFactory(抽象工厂)模式 探究osg中的程序设计模式---创造型模式---Singleton(单例)模式 探究osg中的程序设计模式---创造型模式---Builder(创造者)模式 探究osg中的程序设计模式---创造型模式---Prototype(原型)模式 总结:创造型设计模式 探究osg中的程序设计模式---结构性模式 探究osg中的程序设计模式---结构性模式---Bridge(桥接)模式 探究osg中的程序设计模式---结构性模式---Adapter(适配器)模式 探究osg中的程序设计模式---结构型设计模式--- Decorator (装饰器)模式 探究osg中的程序设计模式---结构型设计模式--- Composite(组合)模式 探究osg中的程序设计模式---结构型设计模式---Flyweigh(享元)模式 探究osg中的程序设计模式---结构型设计模式---Facade(外观)模式 探究osg中的程序设计模式---结构型设计模式---Proxy(代理)模式 总结:结构型设计模式 探究osg中的程序设计模式---行为性模式

osg中使用geometry shader方式

烈酒焚心 提交于 2020-03-21 14:01:27
可以参考osg示例代码osggeometryshaders 它用glsl版本比较老#version 120 #extension GL_EXT_geometry_shader4 : enable 使用gl_PositionIn[],而不能使用gl_in[],这个需要更高版本 类似以下代码: #version 150 layout(triangles) in; layout(triangle_strip, max_vertices=3) out;vec4 p0_3d = gl_in[0].gl_Position;vec4 p1_3d = gl_in[1].gl_Position;vec4 p2_3d = gl_in[2].gl_Position; 需要使用osg::Program* p; p->setParameter(GL_GEOMETRY_VERTICES_OUT_EXT ,3);//对应 max_vertices=3 p->setParameter(GL_GEOMETRY_INPUT_TYPE_EXT ,GL_TRIANGLES);//对应 layout(triangles) p->setParameter(GL_GEOMETRY_OUTPUT_TYPE_EXT ,GL_TRIANGLE_STRIP);//对应 layout(triangle_strip 来源: https:/

解决项目中内存泄漏的问题

半城伤御伤魂 提交于 2020-03-13 22:10:30
根据大佬的文章而来,加上了自己代码的具体例子 关于内存泄漏的问题,根据经验总结如下(持续补充): 原则是, 有 new 就有delete 。 # 普通C++ 1 Static对象 尤其是单例模式,目的是整个程序的生命周期只有一个对象实例,但在退出时必须记得删除。(比如绑定mainwindow的析构函数,或者closeEvent等)。 /** * @brief The MAP_GR_DIS class * 采用单例模式,在private区有单一实例 * 获取实例的方法: * MAP_GR_DIS::getInstance * 举个例子: * 比如我想调用NoMeasuringDistance()这个函数 * 就可以MAP_GR_DIS::getInstance()->NoMeasuringDistance(); */ class MAP_GR_DIS: public MAP_OSG_BaseHandler { public: MAP_GR_DIS(); static MAP_GR_DIS * getInstance(); //获取单一实例的办法 static bool clickState; static void deleteDistanceObject(); private: static MAP_GR_DIS * disObject; 比如说这个类,MAP_GR_DIS

探索未知种族之osg类生物---渲染遍历之裁剪一

杀马特。学长 韩版系。学妹 提交于 2020-03-11 17:52:52
前言 上面我们用了四节课的内容,讲解了一些osg概念性的内部原理。希望大家可以再看今天的讲解之前先再仔细的研究一下前四节的内容。这样你就会对整个osg的渲染过程有一个更加清晰的认知,有助于理解下面两个函数cull()和draw()。 osg::Util::SceneView::cull() 好,相信大家已经又复习了上面几节的内容,那我们就进行sceneView的第一个重要功能 osg::Util::SceneView::cull() 函数。场景的筛选函数 cull 主要完成了以下几个工作。 1、通过_camera->getNodeMask()==0来判断主相机下的根节点是否可见,如果不可见则不用进行cull操作。 2、进行视图的渲染信息(_renderInfo)的初始化 3、通过 updateUniforms(); 更新一些osg内设的 osg::Uniform 着色器变量(osg_FrameNumber,osg_FrameTime等)。因为opengl中Uniform表示这个变量可以被所有的shader访问到,所以我们在编写 GLSL 程序时调用这些变量获取 OSG 提供的一些场景和时间方面的信息。 4、对筛选访问器(_cullVisitor),状态树根节点(_stateGraph)和渲染树根节点(_renderStage)进行初始化操作。 5、通过

基于osg的python三维程序开发(一)

亡梦爱人 提交于 2020-03-09 13:16:44
背景: osg是一款开源的三维引擎,在过去多年的发展中积累了大量的用户,该引擎基于场景树的管理,使用方法简单。但是对长期使用python作为开发工具的朋友来说, 有一定门槛。 下面的小程序,演示了如何使用python进行osg程序的开发。 代码基于OSG3.4 和 python3.6. OSG程序用vs2015编译。 https://github.com/enigma19971/pyosg from pyosg import * v= osgViewer.Viewer() root = osg.Group() node = osgDB.readNodeFile('C:/own/data/osg-data/cow.osg') root.addChild(node) v.setSceneData(root) v.setUpViewInWindow(600, 100, 800, 600) v.realize() v.run() 自由软件开发人 weix 714601476 来源: https://www.cnblogs.com/enigma19971/p/12448000.html

探索未知种族之osg类生物---呼吸分解之渲染遍历二

狂风中的少年 提交于 2020-03-05 06:49:57
那么今天我们就正式进入osg整个呼吸动作之中最复杂的一个动作,ViewerBase::renderingTraversals(),我们先介绍renderingTraversals的开头的简单的几步操作。 1、这个函数中先遍历了所有的view中的相机节点分别取得他们的位置Translation以及姿态Rotation,并保存到osg内置的log系统中。 2、得到所有的渲染上下文contexts,然后使用 ViewerBase::checkWindowStatus 检查是否存在有效的渲染上下文,没有的话,需要使用 ViewerBase::stopThreading 释放每个camera对应的渲染器以及停止所有的图形线程和相机线程的运行。 3、记录渲染循环开始的时间,最后会相应的进行统计,此次渲染循环进行了多久,方便开发人员调试。 4、通过getViewerFrameStamp()得到记录了仿真循环运行的参考时间,总时间和总帧数的类osg::FrameStamp中的变量_frameStamp。所以你们需要获取这些信息的话,也可以通过读取这个变量的成员函数来实现。当然,使用 Viewer 中的 osg::Stats 变量_stats 也是可以的,缺省情况下,这个变量会忠 实地记录当前帧以及之前的 24 帧的每帧用时,事件遍历用时,更新遍历用时,以及渲染遍 历用时信息

OSG 添加读写类别 要点记录

a 夏天 提交于 2020-02-28 08:19:58
源码文件夹中 osgPlugins 文件夹中, 每个子文件夹都有一个CMakeLists.txt 把文件名放到SET(TARGET_SRC下面 osgPlugins目录下有个CMakeLists.txt 添加一行: ADD_PLUGIN_DIRECTORY(...) REGISTER_OSGPLUGIN(扩展名, 类名) 这句不能写在.h文件中 必须写在cpp文件中, 否则出现重定义错误 需要文件读取的话, 需要重写这个接口函数: virtual ReadResult readNode(const std::string&, const Options*) const; 来源: oschina 链接: https://my.oschina.net/u/235558/blog/3158061

探索未知种族之osg类生物---渲染遍历之Renderer::draw()简介

旧巷老猫 提交于 2020-02-28 07:57:14
我们今天进入上一节的遗留问题Renderer::draw()的探究。 1、从_drawQueue中取出其中一个sceneView对象。SceneView是对scene和view类的封装,通过他可以方便的访问到scene或者view中的成员,以及最主要的作用是封装了更新,挑选,和绘制遍历,但是并不启用DatabasePager。 2、sceneView->collateReferencesToDependentCameras();得到所有的sceneView依赖的相机的引用,因为我们正在运行与主线程并行的绘制线程,所以取消引用的camera有可能还在被此渲染线程使用,所以为了防止这种情况,我们将引用所有这些Camera并且一旦我们清除了这些引用那么就完成了整个渲染调度。 3、_compileOnNextDraw,它代表接下来的渲染是否已经进行编译,如果为true,则进入Renderer::compile()函数,首先把compileOnNextDraw设置为false,然后我们从sceneView中得到scene的根节点sceneView->getSceneData(),遍历所有的场景中的节点,把GLObjects的节点的状态保存到状态树中。 4、执行 Renderer::initialize,初始化 Renderer 绘制所需的基本变量。 5、下一步的工作是执行 SceneView

osg 动态读取PageLOD数据文件后 处理数据节点 callback 方法

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-26 15:30:16
创建读取文件回调类 //.h class CReadFileCallbackEx : public osgDB::ReadFileCallback { public: CReadFileCallbackEx(); virtual ~CReadFileCallbackEx(); virtual osgDB::ReaderWriter::ReadResult readNode(const std::string& filename, const osgDB::ReaderWriter::Options* options); }; //.cpp osgDB::ReaderWriter::ReadResult CReadFileCallbackEx::readNode( const std::string& filename, const osgDB::ReaderWriter::Options* options ) { osgDB::ReaderWriter::ReadResult rs = osgDB::ReadFileCallback::readNode(filename,options); if (rs.validNode()) { //处理数据节点,可以设置显示颜色等参数 osg::Node* pNode = rs.getNode(); } return rs; } 来源: