Ogre中设置渲染性能参数

转载 2011年01月24日 14:26:00

Ogrehttp://hghhe.blog.163.com/blog/static/3237756820099163237160/

       在ogre示例框架程序启动时,我们会看到一个配置窗口,在这个Rendering Setup配置窗口中,我们可以设置窗口启动大小、抗锯齿度、是否垂直同步、是否Gamma校正等。在Ogre::Root中有showConfigDialog方法来显示配置窗口,ogre会自动调会Root::restoreConfig来填充这个窗口中的参数。
       如果我们不想用ogre的配置窗口来设置参数怎么办呢? 我们一般不会在启动自己的游戏的时候使用ogre自带的配置窗口,这时就需要自己向ogre传递渲染参数了。
       我们只需要在调用Root的createRenderWindow函数时设置渲染参数就可以了。 此函数的最后一个参数是NameValuePairList类型(其实它是std::map<String,String>的重定义),包涵了ogre自带配置窗口中出现的所有参数!例:
    NameValuePairList params;
    params["externalWindowHandle"] = StringConverter::toString(hWnd);     // 手动创建的窗口句柄
    params["vsync"]                = “Yes”; // 开启垂直同步
    params["gamma"]              = “Yes”; // 开启Gamma校正
    params["FSAA"]                 = "2";    // 抗锯齿等级
    // 创建渲染窗口
    mOgreRenderWindow = mOgreRoot->createRenderWindow(
        "Ogre Window",                           // 窗口的名字
        800,                                             // 窗口的宽度(像素)
        600,                                             // 窗口的高度(像素)
       false,                                             // 是否全屏显示
        &params);                                    // 渲染性能参数

下面解释下这几个常用的渲染参数:

1.垂直同步(VSync): 如果设置成“Yes”表示开启,"No"表示关闭。开启此项设置后,窗口的刷新速率将会设置为当前屏幕的刷新速率(ogre在创建D3D设备时,会把D3DPRESENT_PARAMETERS结构体中的BackBufferCount设置为2(2个后台缓冲区)和PresentationInterval设置为D3DPRESENT_INTERVAL_ONE(表示当屏幕刷新一次时前后台数据进行交换))。如不开启此选项,则当后台图形绘制完成后立即进行前后台数据交换。 一般来说,我们会觉得帧速越大越好,其实不然! 我们一般用float型变量来计时,在帧速太大时,由于float型变量的误差会导致时间记录上的不准确。 这时开启垂直同步就是一个很好的解决方法了,因为在帧速到达60-70时人的肉眼是感觉不到停顿的。曾经有人问如何在ogre中限制帧速,我也想到过用Sleep函数,但设置垂直同步的方法更有效,更简单!

2.伽玛校正(Gamma):这个参数这得从显示器成像说起了。使用CRT的电视机等显示器屏幕,由于对于输入信号的发光灰度,不是线性函数,而是指数函数,因此必需校正。这其实只是在校正显示器的显示亮度,因为我们指定的显示亮度是线性的。 就也就是为什么我们没有开启伽玛校正时,画面显示会比较暗的原因。

3.抗锯齿(FSAA):开启抗锯齿,会使图像更加圆滑,从而减少锯齿感。 这个参数一般设置为0、2、4、8...等,它表示抗锯齿类型(值越大,画面锯齿感越小)。在DX9中,这个数可以是0-16中的任意一个,根据显卡的不同而不同。当显卡不能支持我们指定的抗锯齿类型时,ogre会提示创建D3D设备失败,这时我们就需要在创建时对显卡的最大支持类型进行判断了。 还好,ogre已经帮我们做了,这将在下面提及。

4.视频模式(Video Mode):视频模式包括窗口大小和颜色位数。颜色位数现在一般为16位或32位,32位颜色下要比16位色彩更丰富一些,当然也更漂亮一些。ogre在启动时已经为我们检测了硬件,把设备能够支持的视频模式记录下来(配置框中“Video Mode”栏所列举的值,比如800X600@32-bit colour)。如果想在程序里面动态改变窗口的大小,可以用RenderWindow::setFullscreen函数和RenderWindow::resize函数。 这二个之间有区别,resize函数只能在窗口模式下使用,setFullscreen函数则没有限制;但setFullscreen在窗口模式下使用时会发生"意外"(ogre论坛上这么说的),所以最好是窗口下变化用resize,全屏下变化用setFullscreen。 不过在ogre1.6.2中已经把setFullscreen全屏变到窗口不正常的问题修改过了。二个函数最大的区别是:resize函数仅仅是把窗口大小变化了,而setFullscreen在变化窗口大小的同时还对D3D后备缓冲大小也修改过。所以用setFullscreen变化窗口大小后,图像不会变模糊。

       有些时候我们需要获取显卡设备是否支持某个参数的调节或最大支持值(比如抗锯齿),ogre同样为我们提供了接口来返回这些信息。RenderSystem::getConfigOptions方法会返回一个ConfigOptionMap类型的值,它里面就保存着当前显卡设备的支持信息。使用起来也很简单,下面以抗锯齿为例:
        Ogre::ConfigOptionMap optionMap = mOgreRoot->getRenderSystem()->getConfigOptions();
        Ogre::StringVector           fsaaVector = optionMap["Anti aliasing"].possibleValues; // 返回可能的值
这样fsaaVector 中就保存着当前显卡在抗锯齿类型上可能的取值,ogre自带的配置窗口也是这么做的。 遍历fsaaVector ,我们会发现有三种取值。1. None 这表示类型为0,就是不开启抗锯齿。 2.NonMaskable+x,这类表示抗锯齿类型为1。x表示此类型下的品质,当然品质值越高,效果也越好。 3.Level+x,这表示抗锯齿类型为x,x的取值一般为2、4、8、16(支持16的显卡我还没见过,好像GF9系的能支持到这个高度)。在D3D9中抗锯齿类型值是0-16,ogre会调用D3D中的CheckDeviceMultiSampleType方法去逐个检查显卡是否支持各种抗锯齿类型,但一般我们的电脑是支持0、1、2、4、8、16这几种,所以在ogre文档上的FSAA取值就是这几种。

        其它参数也可以根据optionMap中的possibleValues来获取值,比如optionMap["vsync"].possibleValues就存在"Yes"或"No"的不同取值。这样,我们就可以知道显卡的支持能力了。

 

 

批注:

      也可以通过如下方法更改:

      system->setConfigOption("Allow NVPerfHUD", "No");
      system->setConfigOption("Anti aliasing", "Level4");
      system->setConfigOption("Floating-point mode", "Fastest");
      system->setConfigOption("Full Screen", "No");
      system->setConfigOption( "Rendering Device", "Monitor-1-NVIDIA GeForce 9400 GT" );
      system->setConfigOption("VSync", "No");
      system->setConfigOption("Video Mode", "1024 x 768 @ 32-bit colour");

      mRoot->setRenderSystem(system);

      mRoot->initialise(false);


ogre中设置渲染性能参数

在ogre示例框架程序启动时,我们会看到一个配置窗口,在这个Rendering Setup配置窗口中,我们可以设置窗口启动大小、抗锯齿度、是否垂直同步、是否Gamma校正等。在Ogre::Root中有...
  • miaoweiye
  • miaoweiye
  • 2010年09月25日 14:29
  • 706

Ogre中设置渲染性能参数

 在ogre示例框架程序启动时,我们会看到一个配置窗口,在这个Rendering Setup配置窗口中,我们可以设置窗口启动大小、抗锯齿度、是否垂直同步、是否Gamma校正等。在Ogre::Root中...
  • tulun
  • tulun
  • 2010年05月24日 16:49
  • 1460

Ogre2.1 结合OpenGL3+高效渲染

在DX10与OpenGL3+之前,二者都是固定管线与可编程管线的混合,其中对应Ogre1.x的版本,也是结合固定与可编程管线设计.转眼到了OpenGL3+与DX10后,固定管线都被移除了,相对应着色器...
  • mansir123
  • mansir123
  • 2016年04月04日 21:41
  • 647

【Ogre引擎架构】 第十一讲 渲染系统封装OpenGL 2.x (一)

Ogre的渲染系统部分对应的是RenderSystem类,针对OpenGL和D3D分别又派生出GLRenderSystem和D3DRenderSystem,分别针对两套API的不同版本又有GL3Plu...
  • Nanhu2012
  • Nanhu2012
  • 2016年01月04日 14:17
  • 939

OGRE渲染过程

参考文章:http://www.cnblogs.com/liangliangh/p/3577239.html OGRE渲染过程:     Create the Root object.     De...
  • Blues1021
  • Blues1021
  • 2015年09月05日 23:56
  • 771

(原创)OGRE主要渲染流程简介

                        OGRE主要渲染流程简介                                    谢伟亮       feiyurainy@163.com...
  • RAINini
  • RAINini
  • 2007年12月29日 00:26
  • 1640

简要分析Ogre的渲染队列实现原理

渲染队列在Ogre中是一个重要的概念,在场景中的所有物体都会在绘制前被Ogre放入到一个特定的渲染队列中。渲染队列主要起两个作用:1.确保正确的绘制顺序。比如先绘制天空盒再绘制一般物体,最后绘制界面。...
  • debugconsole
  • debugconsole
  • 2014年06月27日 13:35
  • 1828

OGRE Demo_RenderToTexture 渲染到纹理

Demo_RenderToTexture       这是一个使用渲染到纹理技术的最基本的例子,代码也比较容易理解。我们首先在原点处放置一个平面,然后布置相应的摄像机把场景中的内容映射到平面所使用的材...
  • pizi0475
  • pizi0475
  • 2010年03月12日 11:49
  • 3425

一张OGRE渲染出的效果的截屏,我还以为是照片呢!

里面用到了全局光线追踪算法!?awesome graphics.Hi, Im glad to finally be able to show a few screenshots of the proj...
  • zdl1016
  • zdl1016
  • 2008年06月05日 14:46
  • 2000

Ogre中渲染到纹理的步骤

 在我看来,渲染到纹理和渲染到某个窗口其实没多大区别,如果一定要说点区别,那就是渲染的目标不同,后者是窗口,前者是某个纹理。    下面列出摘抄自某网友博客上的关于渲染到纹理的三部曲:    1、创建...
  • Redefine
  • Redefine
  • 2010年03月14日 20:05
  • 708
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Ogre中设置渲染性能参数
举报原因:
原因补充:

(最多只允许输入30个字)