12.1脚本
熟悉编程的同学一定对脚本不陌生。脚本(script)的原意是手稿、剧本,手稿可以修改涂抹,剧本指导演员去演。计算机中所运用的脚本也具有以上两个性质。
计算机中的脚本是用脚本语言编写,依据一定的格式编写的可执行文件,又称作宏或批处理文件。它使得本来要用键盘进行的相互式操作自动化。脚本是批处理文件的延伸,是一种纯文本保存的程序,一般来说的计算机脚本程序是确定的一系列控制计算机进行运算操作动作的组合,在其中可以实现一定的逻辑分支等。
脚本是用脚本语言编写的程序,可以用记事本进行打开、编辑等操作。脚本程序比较接近自然语言,可以不经编译而是解释执行,将一条条的翻译成机器可识别的指令,利于快速开发或一些轻量的控制,同时由于它在执行时多了一道翻译的过程,所以它比二进制程序执行效率要低一点。
脚本可以由应用程序临时调用执行,由于脚本可以减小网页的规模和提高网页浏览速度,并且有丰富网页的表现,因此被广泛地应用于网页设计中。
Ogre也离不开脚本,并且有很多类型的脚本,如材质脚本、合成器脚本、粒子脚本、表层脚本、字体信息脚本等。本章将对这些脚本进行一一介绍。
12.1.1材质脚本
在了解材质脚本的概念之前,我们先来看看Ogre中材质的概念。材质是一个很基本的术语,简单的说就是物体看起来是什么质地,我们甚至可以把材质简单的从字面上理解为“材材料和质感的结合”,实际上,材质描述的是物体对光的反射方式。在这一章节我们会详细地介绍材质脚本的相关内容。
Ogre中的Material类封装了物体的所有材料属性。这些属性都包括属性:
1、材质基本属性,如对不同颜色的明暗度、对比度、反射率等等;2、纹理属性,纹理好比一张贴图贴在物体的表面上,使这个物体看上去拥有与贴图相同的外表。物体表面的纹理可以有很多层而不止一层。3、纹理的混合方式;4、深度缓冲设置;5、Culling模式设置;6、纹理的过滤方式,包括三线性过滤、双线性过滤等不同的纹理过滤方式。7、光照设置,通过这个属性可以设置其是否收到光照的影响。8、阴影效果的设置;9、雾化效果的设置。
Ogre的材质脚本:Ogre 提供的材质脚本可以帮助开发者设置又酷又眩的材质特效,而且不用重新编译。另外,Ogre中Material类和TextureLayer 类的诸多成员函数都可以设置材质特效,方便我们在自己的程序中使用。
在默认情况下,Ogre 材质脚本的扩展名为.material,当然Ogre也提供了相应的函数来更改这个默认的扩展名,这个更改扩展名的函数就是MaterialManager类的parseAllSources 函数。系统初始化时,Ogre为了是内存的消耗不至于太大,只会设置材质的属性,而不会将纹理也导入内存,而且Ogre会自动分析、管理所有的材质脚本文件。
不同类型的光源(Ogre中有3种类型的光源:电光源、聚光源和有向光)反射在物体表面的材质上会出现截然不同的效果,这是物理世界中存在着的客观规则,同样的,Ogre中的材质也遵守了这种规则,而且,Ogre中的材质也已经定义了不同的物体对不同类型的光源反射的不同的处理方法,方便程序开发人员方便的调用。
12.1.2合成器(compositor)脚本
关于Ogre中合成器的概念和用法,我们将会在第十六章 Ogre的“二维”与合成特效一章中具体介绍,这里,我们只是先简单的了解一下Ogre合成器基本概念即可,如果读者对Ogre合成器的概念和用法有什么疑问,没关系,通过第十六章的学习,相信读者就会对Ogre中的合成器有更深一步的了解。
通过合成器,我们可以轻松的实现后加工处理效果。换句话说,Ogre中的合成器是用来处理并形成特效的,通过使用合成器,可以在Ogre中形成多种多样的特效。
合成器脚本(Compositor)的概念:我们可以在合成器脚本定义合成器效果,并且可以重复使用并易于修改。合成器在Ogre系统中的扩展名是“.compsitor”,它的处理方式和材质脚本相同。
合成器脚本(Compositor)的格式:一本脚本可以定义多个不同的合成器以实现不同的功能。合成器脚本格式与C++的代码相似,都是以大括号为段分隔符,对脚本的定义都包含在一对大括号中,例如:“{···}”。如果我们想要在脚本中添加注释,那么可以使用双斜杠“//”开头,在“//”的后面加上要注释的文字。下面我们用一个例子来解析一下Ogre中的合成器脚本。
// 双斜杠后的内容都是注释 // 利用合成器脚本实现“黑白交替”的四格屏幕效果 compositor B&W //合成器脚本的名字 { technique { // 纹理的定义 texture rt0 target_width target_height PF_A8R8G8B8
target rt0 { // 从原始的场景或是先前的合成器渲染场景 input previous }
target_output { // 开始输出 input none // 利用黑色和白色的图片将屏幕划分为四格“黑白交替”的形式 pass render_quad { // 利用材质将屏幕渲染成4格形式 material Ogre/Compositor/BlackAndWhite input 0 rt0 } } } } |
每个合成器必须定义一个名字,而且必须是唯一的(区别于其他的合成器脚本),我们可以在最开始的大括号前面的“compositor”那一行来设置合成器的名字。合成器的名字里也可以包含空格,但是一旦合成器的名字里包含空格,那么就必须将这个合成器的名字用双引号括起来,如compositor "My comp01"。
12.1.3粒子脚本
粒子脚本是用来定义粒子系统的,同样不必在源代码中进行设置,易于修改,并且每个修改都能得到快速回应。脚本里定义的粒子系统可以做模板使用,并且实际的系统可以在运行时在脚本中创建。
粒子脚本的装载:粒子脚本也是在系统初始化时被装载的:OGRE可以自动在所有与组相关的资源位置搜索.particle后缀的文件,并解析它;如果想分析不同扩展名的文件,调用ParticleSystemManager::getSingleton().parseAllSources方法,或者是想分析单个文件,使用ParticleSystemManager::getSingletion().parseScripe. 一旦脚本被分析完,就可以基于这些代码使用SceneManager::createParticleSystem()方法实例化系统。
下面,我们通过一个实际的例子脚本的例子,来向读者介绍粒子脚本的使用方法
particle_system Examples/GreenyNimbus { //设置这个系统中的粒子将要使用的材质名称。此系统中的全部粒子使用相同的材质,但是每个粒子可以设置不同的颜色。 //格式:material<material_name> 示例:material Example/Flare 默认:none(空材质)
material Examples/FlarePointSprite //在世界坐标中,设置粒子的宽度,当billboard_type()为point或者perpendicular_self时,这个属性是绝对值,而当billboard_type是oriented_common , oriented_self或者perpendicular_common时,它是按方向向量的长度而定的。 particle_width 35 //在世界坐标中,设置粒子的高度。同粒子宽度设置相同,当billboard_type()为point或者perpendicular_self时,这个属性是绝对值,而当billboard_type是oriented_common , oriented_self或者perpendicular_common时,它是依方向向量的长度而定的。 //所有的粒子系统都被包括在一个包含这个系统所有粒子的边界盒内,这对一般的局部的有限的粒子系统,如大部分粒子是同时可见的或者是同时不可见的,是足够的,但是, //对于那些在更大面积上扩散的粒子(例如,一个雨水系统),实际上也许想要单独的处理每一个粒子以便节约时间,因为很可能只有一小部分的粒子是可见的,可以通过设置 //cull__each的参数为真。默认的是false //设置这个系统在某一时刻所允许包含的最多粒子数。当达到这个限制时,粒子发射器将不允许再发射粒子,直到某些粒子被消灭(例如,它们的time_to_live存续时间用尽)。值得注意的是,你几乎是肯定要改变这个设置的,因为默认值太短了(粒子池只能增加,而不能减少)。 格式: quota <max_particles> 示例: quota 10000 默认: 10
// 这实际上是'公告板'粒子渲染器(默认)的一个属性,同时也是通过在系统声明中直接声明的方法给粒子渲染器传递属性的一个示例。使用默认渲染器的粒子被用公告板进行渲染,即由2个旋转到面向指定方向的三角形组成的矩形构成的平面。但是,定向一个公告板有不止一种方法。传统方法是公告板直接面对摄像机:这也是默认的方法。但是,这种安排只是对于表现像光晕一样的模糊的球状物看上去还算可以。对于更多的诸如激光射线这样的线性效果,事实上你想要粒子有其自己的方向。
格式: billboard_type <point|oriented_common|oriented_self|perpendicular_common|perpendicular_self> 示例: billboard_type oriented_self 默认: point
|
12.1.4表层(overlay)脚本
笔者注: 通合成器一样,有关表层的概念我们也会在第十六章 Ogre的“二维”与合成特效中为读者作详细的介绍。 |
在Ogre中,表层主要是用来处理“二维”显示的,即平面上的显示(与3D无关)。换句话说,Ogre中将所有的与“二维”相关的处理都被放置在称为“表层(OverLay)中”。顾名思义,表层是实质上是一个层,这个层覆盖在场景中所有其他的物体之上。
表层脚本用来定义图层,同样可以重复使用并方便修改。而且,Ogre中同样可以使用SceneManager,Overlay以及OverlayElement类的方法在代码中为一个场景建立所有图层,也可以以文本文件的方式储存层定义,在需要的时候再调用。