【Ogre编程入门与进阶】第十四章 Ogre渲染目标

14.1 概念总览

14.1.1 渲染目标(Render Target)

        在我们继续下面的学习之前,我们首先来了解一下与渲染相关的概念。首先我们看一下渲染目标的概念。简单的说,渲染目标就是一个用来保存Ogre渲染结果的存储区域。在Windows平台下,我们通常是将Ogre的渲染结果保存在一个“窗口”中,那么这个窗口就是一个渲染目标。同理,我们可以把渲染结果存储在别的地方(不一定是窗口中),也就是说,渲染目标不一定只能是窗口,其他任何可以接收Ogre渲染结果的事物都可以成为渲染目标。不过在实际应用中,除了将“窗口”作为渲染目标,最常用的莫过于将“纹理”作为渲染目标,也就是渲染到纹理(RTT)技术,渲染到纹理技术我们将在下一小节中详细的介绍。

 

笔者注:

        在3D图形API(应用程序编程接口)里面,渲染目标(Render Target)的概念经常被提及,关于渲染目标,我们也可以这样理解:

简单来说,渲染目标就是一个表面,图形API可以在这个面上“画”东西。实质上,渲染目标就是用来显示渲染结果的地方——是一段连续的内存区域,这样的内存区域可以同时的存在多个,也就是说,在同一时间内可以存在多个渲染目标。

 

        渲染目标的基类是“RenderTarget”类,通过这个类可以派生出三个不同的类,这三个类代表了三种不同的渲染目标类型,它们分别是:窗口渲染目标“RenderWindow”、纹理渲染目标“RenderTexture”以及“MultiRenderTarget”类型,其中MultiRenderTarget”类型主要用来对多个渲染目标进行绑定。

14.1.2 渲染窗口(Render Window)

        不知道读者注意到没有,在第十二章“Ogre的启动序列(Startup Sequence)”一章中,我们就曾经接触过渲染窗口的概念,在上文中提到的那个用来保存Ogre渲染结果的窗口,实际上就是我们这里的渲染窗口。我们可以通过下面的一句代码创建一个渲染窗口:

Ogre::RenderWindow*mWindow =mRoot->initialise(true," IMedia Project ");

        这行代码通过Root对象的实例mRoot(根(Root)对象是Ogre系统的入口,所谓“系统的入口”就是说在使用Ogre之前,必须要做的第一件事情就是创建一个Root对象)初始化了一个名为" IMedia Project "的渲染窗口,这个渲染窗口非常的简单,它上面什么都没有,如下图所示:

        在Ogre中创建一个渲染窗口是通过RenderWindow* createRenderWindow函数实现的,该函数的原型如下:

RenderWindow* createRenderWindow(const String& name, unsigned int width,

unsigned int height,bool fullScreen, const NameValuePairList* miscParams = 0);

        该函数有4个参数,下面我们就简单的介绍下这四个参数的含义:

        (1)name:”,“name”参数是系统用来区分此窗口与其他窗口的唯一标识符,也就是此窗口的ID,该参数的索引值是“title”。

        (2)width:“width”参数用来设置此窗口的宽度。

        (3)height:“height”参数用来设置此窗口的高度。

        (4)fullScreen:这是一个布尔类型的参数,利用它可以设置此窗口是否为全屏显示。

        (5)miscParams:这是一个指针类型的参数,它的类型是std::map<String, String>,利用这个参数,我们可以对此窗口的属性进行具体的设置,这些可以设置的属性都包括以下几个:

        · 窗口名称:这个属性用来设置渲染窗口左上角显示的文本,即窗口的名称:

        在默认的情况下,渲染窗口左上角显示的文字是“Ogre RenderWindows”。

 

笔者注:

        这个属性同上文中的(1)name是不同的,name是窗口的ID,Ogre可以用这个name属性区分它与其他的窗口;而这里的“窗口名称”是实实在在的显示在窗口上的文字。

 

        • 窗口边框样式:这个属性用来设置渲染窗口的边框,属性的取值有以下几种:“none”,“fixed”或是“resize”。在默认的情况下,该属性被设置称为“resize”。

 

        • 颜色深度:这个属性用来设置渲染窗口的颜色深度,取值为16或32,也就是可以将颜色深度设置成为16位或者32位。注意:这个参数只在Windows系统下有效,在Linux和Mac系统下不会有什么效果。而且在默认情况下,这个属性的值取的是电脑显示的颜色深度,这个颜色深度可以通过右击桌面空白处,选择菜单中的“属性”进行设置。

 

        • 窗口位置:这个属性用来设置此渲染窗口在显示器上的位置。默认值是将此窗口放置在桌面的正中间位置。

 

        • 深度缓存:这是一个布尔类型的属性,有true和false两个取值,分别表示渲染窗口是否使用深度缓存。

 

笔者注:

        在Ogre 中,我们可以让Ogre创建渲染窗口,然后这个渲染窗口可以由Ogre自己进行管理和维护,不过通过这种方法创建的渲染窗口功能非常简单,通常只有窗口尺寸和标题等简单的属性,往往不能满足实际开发的需求;还有另一种方法,程序开发人员可以亲自创建并维护渲染窗口,只需将渲染窗口的句柄作为参数传递给Ogre即可。

 

14.1.3 视口(Viewport)

        早在第五章,我们就向读者介绍过视口的概念,通过本节的介绍,详细读者会对视口的概念有更深一步的了解。实际上,视口构建起了一座连接摄像机和渲染目标的桥梁。在同一时刻可能有很多的摄像机同时工作,可是呈现在电脑屏幕上的却只能有其中某一个摄像机,这个被选中呈现在屏幕上的摄像机所呈现的画面就是视口。

        视口是一个矩形的区域,它从摄像机获取内容,并把这些内容投射到渲染目标上。视口的作用不言而喻,只有通过视口才能连接场景管理器和渲染系统。一个常见的视口的应用就是游戏或动画中,汽车的后视镜效果。由此可见,视口并非一定要将全部的场景内容投射到渲染目标上,可以选择场景内容中的一部分对其进行投射。

 

笔者注:

        同一个渲染目标可以接收多个视口中的内容,这些视口中的内容按层的顺序叠放在渲染目标上,每个层都有一个Z-order值,Z-order值小的层放置在下面,Z-order值大的层放置在上面。通过不同的层的叠加,可以形成很多不同的特效。

        不过多视口也有其弊端,比如多个视口会共享一个相同的深度缓存,这有可能会导致深度缓存的冲突。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值