Ogre学习记录(一)-启动流程

启动gazebo时的ogre渲染引擎相关error 解决error:virtual void Ogre::RenderSystem::setDepthBufferFor(Ogre::RenderTarget*),更新nvida最新驱动即可。 阅读详情

        Ogre给的教程框架还是很友好的,继承其所给的BaseApplication类,只用重写createScene函数,就可以渲染出mesh模型了。但是为了更好的学习,当然要搞清楚BaseAplication中的每一段代码都做了什么。官方的第Basic Tutorial第6节讲的很清楚。

点击打开链接

1.wiki上的tutorial给定建议启动流程

1.create the root object. 创建根对象

2.define the resource that Ogre will use. 定义一个Ogre将要使用的资源文件

3.choose and setup the RenderingSystem. 选择和启动一个渲染器(例如,OpenGL,DirectX)

4.create Rendering Window. 创建一个Ogre渲染的窗口

5.Initialize the resources that you are going to use. 初始化所有要使用的资源

6.create a scene use the resource. 利用资源创建一个场景。

7.set up any thirdparty puligins and library. 设置所有的第三方插件与库

8.create any numbers of frame listeners. 创建任意数量的frameListener

9.start the render loop. 开始渲染循环

        当然,wiki上也说了,你可以不按着规矩来,但是1-4一定要乖乖的按着顺序做,7-8可以放在5-6之前,但是这样在resources和secne创建完成之前第三方插件和frameListener是无法获取任何和resource以及scene相关的内容的。

2.具体实现

2.1创建根对象

        根对象是Ogre库的核心部分,是你想用Ogre引擎做任何事情之前必须首先初始化的东西,初始化跟对象时,可以直接调用其构造函数:这里我们传入了一个参数,告诉Ogre的根对象,我们所需加载的插件配置文件名称。
#ifdef _DEBUG
    mPluginsCfg = "plugins_d.cfg";
#else
    mPluginsCfg = "plugins.cfg";
#endif
 
    // construct Ogre::Root
    mRoot = new Ogre::Root(mPluginsCfg);
 
    return true;

        根对象root的构造函数有3个参数,均有默认值:

参数类型:String默认值描述
pluginFileName“plugin.cg”插件配置文件的名称和路径
configFileName"ogre.cfg"生成的ogre配置文件名称和路径
logFileName"Ogre.log"生成的log文件名称和路径



         


        plugin.cfg是必须事先编写好的,告诉根对象需要加载哪些插件,否则Ogre引擎直接启动失败,并抛出异常,至于plugin.cfg文件,在你编译好的SampleBroswer目下就有,拷贝过来用就行了,至于Ogre的插件系统我也还没有弄清楚,就先不详细说了。

        后面两个都是Ogre输出的文件,log好理解,就是日志信息了,出了什么错,什么异常,都会记录在里面,在Linux下其实这些信息都打印在终端里了,至于windows,估计出了问题,就要好好看log了。至于ogre.cfg,是root为你保存的第一次开启引擎时记录的信息,例如:显卡,渲染器类型,全屏,分辨率,垂直同步等等,还记得SampleBroswer第一次开启时,会有一个小Dialog让你配置选项么,但是第二次启动就没有了,就是因为Ogre为你保存了你的配置,不需要你反复的输入,当然如果你希望换个配置,但是在程序内部又没有提供相应的接口,那么直接删掉这个文件即可,再启动时,Ogre会让你重新配置系统信息的。

2.2定义资源文件信息

        如果细心你会发现在SampleBroswer目录还有一个cfg文件,resource.cfg,用vim打开瞧一瞧,很容易就明白了,【】内为每个配置的section,被=赋值的是每个具体的settings,这里的settings主要描述了资源所在的绝对路径,很简单,就不多说了。
        第二步就是告诉Ogre,读取哪个资源配置文件,从而让Ogre知道每个将要加载的资源具体所在的位置。
#ifdef _DEBUG
    mResourcesCfg = "resources_d.cfg";
#else
    mResourcesCfg = "resources.cfg";
#endif

// set up resources
// Load resource paths from config file
Ogre::ConfigFile cf;
cf.load(mResourcesCfg);
// Go through all sections & settings in the file
Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();
 
Ogre::String secName, typeName, archName;
while (seci.hasMoreElements())
{
    secName = seci.peekNextKey();
    Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
    Ogre::ConfigFile::SettingsMultiMap::iterator i;
    for (i = settings->begin(); i != settings->end(); ++i)
    {
        typeName = i->first;
        archName = i->second;
        Ogre::ResourceGroupManager::getSingleton().addResourceLocation(
            archName, typeName, secName);
    }
}
        记住,根对象一定是第一个创建的,其后才能加载资源文件,否则将发生错误。

2.3选择一个渲染系统

        这个没什么好说的,无非就是OpenGL或者DX,我在Fedora下也没什么选择,直接OpenGL完事。
RenderSystem *rs = mRoot->getRenderSystemByName("OpenGL Rendering Subsystem");
mRoot->setRenderSystem(rs);
rs->setConfigOption("Full Screen", "No");
rs->setConfigOption("Video Mode", "1366 x 768 @ 32-bit colour");
        另外,选择好了渲染系统后,这里还是继续配置一些相关的信息,例如是否全屏拉,分辨率拉,显卡类型拉很多很多,当然,如果你想把这个选择的权利交给用户,你可以用根对象的showConfigDialog()方法来为你弹出一个配置对话框,十分方便。
// configure
// Show the configuration dialog and initialise the system
if(!(mRoot->restoreConfig() || mRoot->showConfigDialog()))
{
    return false;
}
        这里有个restoreConfig()混在里面,是为了实现上述说过的,第一次配置完后,Ogre会为你生成一个ogre.cfg文件保存你上次的配置,这样就不用每次开启程序时都要设置一遍了。

2.4创建渲染窗口

        第三步之前的编译运行后,如果你观察啊终端输出或者log文件,会发现Ogre什么都没有做就退出了,其实并不是什么都没有做,只是没有找到一个可供它渲染的窗口,于是它自动退出了,但是前面所提到的加载插件,加载资源,Ogre可是一个也没落下。用以下方法就可以简单的创建一个渲染窗口了:
Ogre::RenderWindow* mWindow;
mWindow = mRoot->initialise(true, "Render Window");
        当然,如果你想要把Ogre嵌入你的win32窗口,或者其他的什么GUI窗口,Linux下GUi如Qt等等,wiki也给出了答案:
mRoot->initialise(false);
HWND hWnd = 0;  // Get the hWnd of the application!
NameValuePairList misc;
misc["externalWindowHandle"] = StringConverter::toString((int)hWnd);
RenderWindow *win = mRoot->createRenderWindow("Main RenderWindow", 800, 600, false, &misc);
        注意到,这与简单的初始化一个窗口唯一的区别就是,在调用Ogre::RenderWindow的initialise方法时,没有直接使用true参数,而是在后面通过HWND获取你想要嵌入的窗体的句柄,至于这个句柄怎么获得,那就取决于你用的GUI类型了,之后根对象的createRenderWindow()方法可以帮你将Ogre的渲染窗口指定为你所提供的其它GUI如win32已经建立的窗体,至于这些API具体怎么用大家去看官方手册吧。

2.5加载资源

2.6创建场景信息:包括entity,node,light等等

        这里我将这两部放在一起,我是这么理解的,如果1-4步只是在程序启动时运行一次,也就是我们写程序通常使用的initial的话,那么剩下的这些内容,可能会在程序运行时动态的运行,wiki也说了,其实在真正的大型游戏或者其它什么3D软件中,资源并不是一次全部加载的,而是按需加载的,举个例子,当你玩WOW和朋友在黑暗神庙开25人团的时候,程序不会蛋疼到把奥格瑞玛的地形信息和3D模型什么的加载到内存里面去吧?否则为什么你炉石完了之后会有一段读条。
        所以从这里开始的第五步和第六步,就是可能在程序中多次出现的了,先加载资源,再创建场景,当然具体怎么做,要使用到Ogre的一个类,叫做ResouceManager,如果有兴趣,可以去学习学习,下面给出链接:
        当然,如果你的程序很小,那么可以直接一次将所有资源全部加载,示例代码如下:
// Set default mipmap level (note: some APIs ignore this)
Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5);
// initialise all resource groups
Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
        至于第六步也就是创建场景信息,我就不多说了,内容太多,可以自己去wiki上学习,讲的很清楚。

2.7加载第三方插件

2.8创建任意数量的帧监听器(FrameListener)

        第三方插件我暂时还没有碰到过,FranmeListener可以理解为一个回调函数吧,这样在每帧运行时,都可以嵌入我们想要做的一些其他事情,如数据处理,动画播放,网络通信等等,现在还没有具体深入,也不详细描述了,免得被鄙视。

2.9进入渲染循环

        Ogre通过调用Ogre::Root::startRendering()就可以进入渲染循环了,当然,Ogre的渲染循环具体是那样的呢,wiki上也解释的很清楚,可以理解如为如下代码:
void Root::startRendering(void)
{
    assert(mActiveRenderer != 0);
 
    mActiveRenderer->_initRenderTargets();
 
    // Clear event times
    clearEventTimes();
 
    // Infinite loop, until broken out of by frame listeners
    // or break out by calling queueEndRendering()
    mQueuedEnd = false;
 
    while( !mQueuedEnd )
    {
        //Pump messages in all registered RenderWindow windows
        WindowEventUtilities::messagePump();
 
        if (!renderOneFrame())
            break;
    }
}
        这里其实循环最关键的就是while中的renderOneFrame这个函数的,这个函数可以这样理解:
bool Root::renderOneFrame(void)
{
    if(!_fireFrameStarted())
        return false;
 
    if(!_updateAllRenderTargets())
        return false;
 
    return _fireFrameEnded();
}
        所以我们可以在go方法中写入一个简单的循环,如下代码所示:
while(true)
{
    // Pump window messages for nice behaviour
    Ogre::WindowEventUtilities::messagePump();
 
    if(mWindow->isClosed())
    {
        return false;
    }
 
    // Render a frame
    if(!mRoot->renderOneFrame()) return false;
}
        这样,直到窗口关闭,或者renderOneFrame()返回false,Ogre不会停止对窗体的渲染。
        那么,renderOneFrame什么时候会返回false呢,这就又要提到farmeLisener和frameRenderingQueued()等方法了,其实理解起来也很简单,就是一个回调函数,会在每帧渲染时调用,这样就可以在这个回调函数中做我们想做的任何事件,如捕获输入信息,改变模型位置、大小,进行网络通信等,如果在某一帧我们捕捉到用户输入ESC键,我们理解为“退出”,那么我们可以让frameRenderingQueued()返回false,这样Ogre就会停止渲染,正常卸载资源与插件,并退出了。

PS:

        真的觉得Ogre是初学者学习3D引擎最好的选择了,没有之一,先不说它开不开源,Ogre的wiki上资源太丰富了,wiki上的tutorials一步一步引导你进入Ogre的世界,学到很多3D引擎相关的概念和只是,除了关于引擎本身的教程外,还有一些列的其它相关教程,如DCC tutorials,CEGUI的相关链接,OIS的相关教程,还列出了很多支持Ogre的第三方插件和子系统,并且Ogre的社区是十分活跃的,如果你有什么问题,抛到论坛上很快就会有人回复你,当然,不要问一些傻傻的问题,否则你将得到的答案绝对是RTFM。虽然接触Ogre才2周,但是已经完全喜欢上了这个东西,每天都像当初玩wow一样搞到一两点,但是,收获也是大大滴,不是吗。


第五天 Labview数据记录(5.4 EXCEL文件读写) Excel 文件读写在数据处理、自动化办公、数据分析等领域具有重要的意义。以下是 Excel 文件读写的主要应用场景和意义:1. 数据管理和整理;2. 自动化办公;3. 数据分析和可视化;4. 系统集成;5. 报表生成;6. 教育和培训;7. 实际应用场景。Excel 文件读写的意义在于提高数据处理的效率、减少人工操作、支持自动化办公、促进数据分析和可视化,以及实现系统之间的数据交互。无论是企业、组织还是个人,都可以通过 Excel 文件读写实现数据的高效管理和利用。 阅读详情

相关推荐

EtherCAT APWR报文实战:从站地址配置(0x0010)的初始化流程与报文解析

本文详细解析了EtherCAT APWR报文在从站地址配置(0x0010寄存器)中的初始化流程与实战应用。通过类比物业分配门牌号,生动解释了APWR报文如何高效批量配置从站地址,并深入探讨了0x0010寄存器的特殊作用、初始化步骤及常见问题排查方法。文章结合IgH主站的三从站配置案例,提供了报文解析技巧和调试建议,帮助工程师快速掌握EtherCAT网络配置的核心技术。

weixin_28744423的博客 410

OGRE启动过程详解(OGRE HelloWorld程序原理解析)

本文介绍 OGRE 3D 1.9 程序的启动过程,即从程序启动到3D图形呈现,背后有哪些OGRE相关的代码被执行。会涉及的OGRE类包括: RootRenderSystemRenderWindowResourceGroupManagerLogManagerViewportSceneManagerCameraSceneNodeEntityLight     建议在阅读本文时参考 OGRE

wang371372的专栏 1374

Ubuntu22.04 apt 安装 ROS1 ROS Noetic Ninjemys

ubuntu 22.04 apt-get 安装 ros1 ros Noetic 最新版

autolabor的博客 5万+

ResourceGroupManager初始化加载资源说明

<br />ResourceGroupManager初始化加载资源说明:<br />addResourceLocation: 加载资源路径,告诉资源管理器到哪些目录找我要加载的资源。<br /> <br />initialiseAllResourceGroups:初始化加载了路径的资源组,可以理解为记录每个资源的地址,以便于创建的时候资源管理器能一下找到。<br /> <br />也就是说在初始化的时候要配置并记录资源的路径,但不加载内存,创建的时候才通过资源组记录的地址加载资源到内存,加载了之后由于ogr

beyondgirlzxm的专栏 1411

【图形学】后处理下的HDR、颜色分级、颜色映射与颜色空间

目录 一、Color Grading 1.1概念 1.2 内置在Unity/UE4 二、HDR、LDR与VDR 2.1 LDR 2.2 HDR 2.3 VDR 三、Tone Mapping 3.1 概念 3.2 算法发展史 3.3 ACES算法 四、常见的颜色空间标准 参考 一、Color Grading 1.1概念 Color Grading(颜色分级、颜色校正)俗称调色,是游戏后期处理中最常见也是必要的一个环节。它能够改变或矫正最终图像的颜色和亮度,你可以把它想象...

ColorGalaxy 8419

【第一篇】Xshell连接服务器部署前后端项目(连接服务器)

利用Xshell连接服务器部署前后端项目

blog 1073

OGRE 3D使用resources_d.cfg加载模型

#include "Ogre/Ogre.h" int main(void) {  Ogre::Root *root = new Ogre::Root("plugins_d.cfg");//创建一个Ogre::Root类的实例;这个类需要plugins_d.cfg作为参数  if(!root->showConfigDialog())//显示配置对话框  {   return -1;

无敌的专栏 2871

拆解全球18大“支付清算”体系:CLS、中国、美国、欧洲、日本、mBridge...

拆解全球18大“支付清算”体系:CLS、中国、美国、欧洲、日本、mBridge...

银行信息系统应用架构详解 883

ogre config-style configfile loader

为什么80%的码农都做不了架构师?>>> ...

weixin_34380781的博客 157

使用Simulink对液流电池在微电网中的动态响应进行建模与仿真

本文介绍了使用Simulink对液流电池在微电网中的动态响应进行建模与仿真的方法。通过搭建包含液流电池、双向DC-DC变换器、分布式能源和负载的微电网模型,并设计基于SOC的控制器,详细说明了从模型创建到仿真运行的完整流程。重点分析了液流电池在不同负载条件下的动态特性,评估了系统响应速度、充放电效率和稳定性等性能指标。该仿真方法为验证液流电池在微电网中的应用提供有效工具,有助于优化参数设计和提升系统可靠性。

amy_mhd的博客 136

uniapp - 获取设备麦克风权限+麦克风设备列表,用户可选择切换麦克风设备功能,选择麦克风采集设备后点击录制音频外部声音+可随时暂停/继续录音+记录音频录制时长(支持在线播放试听或下载MP3文件)

uniapp获取麦克风设备列表,uniapp录制声音,Uniapp获取麦克风权限,uniapp苹果ios安卓app获取麦克风设备列表,Uniapp H5获取浏览器麦克风并实现录音,Uniapp实现麦克风权限管理与音频录制全流程,uni-app实战案例:实现H5页面麦克风权限获取与录音功能,uni-app音频录制,uniapp麦克风授权窗口,uniapp获取iOS麦克风权限,实现前端录音并播放,把音频传给后端接口处理,获取麦克风并实现录音功能,前端获取/切换麦克风播放采集音频和采集音量大小,前端调用麦克风实现

🏆 前端领域优质创作者 2981

Ogre1.x学习笔记1——建立Ogre项目

Ogre1学习笔记1——建立Ogre项目 本文介绍了构建Ogre项目的一般流程,代码部分采用官方的Bootstrap.cpp中的内容。这里参考了官方英文教程Setting up an OGRE project,但采用Makefile来建立Ogre项目,而不是英文教程中的cmake来建立。

摇光65535的博客 434

OSG第三方库编译之二十一:minizip编译(Windows、Linux、Macos环境下编译)

OSG编译;第三方库;跨平台编译;minizip编译(Windows、Linux、Macos环境下编译)

LuckyHanMo的博客 2621

ogre 学习笔记 - Day 3

ogre 学习笔记 - Day 3

weixin_43859510的博客 607

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Ogre学习笔记(一)

Ogre学习笔记(一) 2012-1-30 Kagula 概要 记录Ogre学习过程中要注意的地方。我的学习环境是 [1]WinXPSP3(简中版) [2]VS2008SP1(英语版) [3] boost 1.48 [4] Ogre 1.7.4 [5] CMake 2.8.7 为方便学习和调试,本文档中生成的库和程序是以Debug方式编译和运行。 正文 建立Ogre开发环境

lee353086的专栏 2097

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

ogre 学习笔记系列(三)启动过程 参考 ExampleApplication.h

1、入口: /// Start the example virtual void go(void) { if (!setup()) return; /*渲染流程 1. 调用帧监听者的frameStarted()函数 2. 调用当前的渲染窗口的update()函数 a) 调用场景管理器的_renderScene()

pathfinder 1535

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ogre学习笔记(启动篇)

ogre学习笔记(启动篇)

magicalpx的博客 449

OGRE+VS2008环境搭建

OGRE环境搭建

tomleader的专栏 1797

Ogre中Mesh的加载与渲染流程

  如果新开始写一个3D渲染引擎,Mesh应该是一个很好的切入点。当一个看似简单的Mesh渲染到窗口时,说明引擎的架构已经确定,并验证了。想了解Ogre内部的机制, 可以先看看Mesh的加载过程,这里主要涉及到Resource是如何管理的,Material是怎样处理的,Resource和HardwareBuffer是如何关联的。对于前面教程代码的执行过程做一下分析:创建一个Entity(加载Mesh及其相关的Material)的调用流程如下: SceneManager::createEntity()->Sc

Augmented Reality & Computer Graphics 2424

ogre 学习笔记 - Day 9

ogre 学习笔记 - Day 9

weixin_43859510的博客 598

ogre小知识点

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl

LaineGates的专栏 1263

ogre研究之开发环境搭建

现在肯定不需要在说什么是ogre了,既然你已经在看这篇文章,相信已经了解了ogre。本文主要记录ogre引擎研究的开发环境搭建(本文在windows xp下使用vs2008作为开发工具)。 1:下载、安装vs2008,这个不用说了,大家都会。 2:下载并安装ogre sdk。

Yarin's Blog™ 1215

Ogre源代码结构学习笔记——插件(Plugin)其它问题

插件(Plugin)结构的具体内容 我转载的文章里说的很系统清楚了。 《Ogre源代码浅析——插件(Plugin)工作原理》 这里就是我在学习中,不理解问题的笔记。 1、上期结尾问题 平平疑问记录如下: Ogre会在每个要被动态加载的dll库对象中声明一个名为“dllStartPlugin”的函数, 这里目前还没理解,先记录以后解决。 函数 Root::loadPlugin中有调用一个名为“dll...

jean7155的专栏 408

Ogre引擎源码——Timer

一个图形绘制引擎底层有很多工具类(utility),通过读基础工具类源码可以学习到不少东西。 本文通过解读Ogre的Timer来了解一般计时器的实现方式。

Benjamin's IT Life 4827

OGRE找不到渲染设备的问题

几经折腾,全静态连接运行时的静态库方式 和全动态连接运行时的动态库方式都编到能运行。但启动时发现没有找到渲染设备(我没有让他弹出自己选择配置的对话框,自己的程序帮他配置的)仔细一看OGRE的文档,乖乖。。。Root类的构造函数有三个默认参数Root(constString&pluginFileName="plugins.cfg",constString&config...

weixin_30642267的博客 214
上一篇: Java学习笔记(关于static)
下一篇: Fedora下的Ogre编译与安装
tinyFatAries
博客等级 码龄12年 1粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值