Ogre中设置渲染性能参数

来源:互联网 发布:特效拍摄软件 编辑:程序博客网 时间:2024/04/18 10:12

在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"的不同取值。这样,我们就可以知道显卡的支持能力了。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/tulun/archive/2010/05/25/5620471.aspx

原创粉丝点击