OGRE學習 - 渲染目标
概念总览 顾名思义,渲染目标就是渲染结果的显示的地方。其中既包括硬件的缓存(包括帧缓存以及其他),也包括诸如纹理一样的储存区域。 渲染窗口 Ogre引擎中的渲染窗口并没有什么神秘的特性,它不过是系统GUI界面中的一个普通窗口,和其他的窗口一样被系统创建和管理。 视口 视口是这样一个矩形区域,它把从摄像机得到的内容映射到渲染目标上面。在同一个渲染目标中可以包含一个或者更多的视口。
警告:虽然多视口能带来很多有趣的效果,但同时也能带来潜在的问题。再默认的情况下,Ogre会用视口的颜色清空渲染部分的深度缓存。 视口是渲染目标和摄像机唯一的通道。换句话说,它是渲染系统和场景管理器与其内容的唯一入口。视口可以被称为你“场景中的窗户”。 虽然大多数时候,视口会占据你渲染目标的全部空间。但这并不是必要的,你可以用一些非占据全部空间的“小”视口实现相当有趣的效果。 注意:这里可能有一个认识上的普遍错误。在现实生活中使用摄像机的时候,你可以通过调整摄像机的焦距等数据来拉近目标距离。 渲染到纹理 用纹理作为渲染目标是一件极其有趣的事情。简单来说,它的概念就是把当前场景的一部分或者全部渲染成一个可以使用的纹理上面,然后再另外一次渲染中把它当作普通的纹理使用。 性能影响 其实纹理目标只不过是一种硬件缓存的表现形式。为了得到更高的性能,需要把缓存设置为静态并且只读的(大多数情况下,你也不能直接从CPU写纹理)。 渲染目标相关的类型 在Ogre中,大部分和渲染目标相关的类型都可以简单的管理和操作。 使用窗口渲染目标的例子 针对与不同系统的各种类型窗口,Ogre也提供了多个不同窗口渲染目标的实现,其中包括:D3DRenderWindow,GLXWindow,GTKWindow,SDLWindow以及Win32Window。 RenderWindow* createRenderWindow(const String& name, unsigned int width, 在调用这个方法之后,系统会为你创建一个包含渲染表面的系统窗口。 ·窗口标题:在窗口标题栏以及系统的任务栏出现的文本。在默认的情况下显示“Ogre Render Windows”。
工具开发者通常希望将Ogre渲染窗口包含在另外的窗口控件中。这也可以在创建窗口的时候很容易的实现,请参看代码8-2。
使用渲染到纹理例子 在Ogre的演示程序中提供了一些渲染到纹理的例子。在接下来的部分,我们将重点介绍这些例程的实现细节,以便让我们进一步了解纹理渲染目标的使用方法。 Demo_RenderToTexture 这是一个使用渲染到纹理技术的最基本的例子,代码也比较容易理解。我们首先在原点处放置一个平面,然后布置相应的摄像机把场景中的内容映射到平面所使用的材质纹理上。 在演示程序RenderToTexture.cpp文件中,RenderToTextureApplicaiton类中的createScene()方法中实现了大部分关键的操作。在这里我们重点介绍如何设置纹理渲染目标。
在代码8-4中,我们设置了一个摄象机和视口用于把场景内容渲染到目标纹理上。
在这里我们需要注意的,为了实现反射效果,我们把反射摄像机(纹理渲染目标使用)和主摄像机(渲染整个场景使用)设置到相同的位置。
上面代码中创建了名字为“RttMat”的材质,其中包含一个技术实现(Technique)和其中的一个渲染通路(Pass),
在代码8-6中,我们首先把摄像机设置为镜像状态。并且我们在参数中指定了作为“镜子” 的平面。如你所见,这个平面即用来渲染反射纹理,同时也用来作为反射表面的分界。
在每次纹理被渲染的时候,我们希望它能完整的反射所有场景中存在的物体,但却不希望它连自己都反射了(就如同镜子不会反射镜子本身一样)。 // Make sure reflection camera is updated too 如果用户更新了主摄像机的位置,我们的反射摄像机也会完全的跟随,这样就能保证反射的结果对应于我们当前的视点。 Demo_Fresnel Demo_Fresnel演示程序同样使用了渲染到纹理技术,不过他更主要的作用是展示通过GPU实时着色技术来渲染水面的折射效果,在这里是用了菲涅耳折射的算法。 观察水下的物体时,你所看到的光线会偏离一个角度。这种现象就是折射,相应的定律最早由19世纪的菲涅耳提出。 |
沒有留言:
張貼留言