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值大的层放置在上面。通过不同的层的叠加,可以形成很多不同的特效。 不过多视口也有其弊端,比如多个视口会共享一个相同的深度缓存,这有可能会导致深度缓存的冲突。 |