欢迎来到天天文库
浏览记录
ID:37712831
大小:23.64 KB
页数:8页
时间:2019-05-29
《Ogre 光源的使用》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Ogre光,材质与材质脚本光材质与材质脚本基本概念Ogre的材质(Material)为了优化渲染,必须把渲染状态的变化减少到最小。而最频繁的渲染状态改变是材料的变化(大多是纹理的变化)。Ogre的Material类封装了物体的所有材料属性,类似于3DStudio中material的概念。平时不被认为是属于材料的属性,像culling模式和深度缓存设置等,也被Material包含近来了。因为这些属性同样影响了物体的外观,把它们放到Material类里可以集中设置所有影响物体的属性。这和D3D中只保存颜色组
2、件而没有纹理映射的Material有明显不同。Ogre的Material可以被认为是’Shader’的等同物。Material类包括如下几类属性:1、基本的表面材质属性,如对不同颜色的反射率、Shininess等等:2、组成Material的纹理层3、纹理之间的混合(Blend)方式4、深度缓冲设置5、Culling模式6、纹理过滤方式(三线性过滤、双线性过滤)7、是否受光照影响8、Shading选项9、雾化其中第二条的纹理层可以有多个,Ogre在Material类的内部定义了TextureLayer类
3、。纹理层(TextureLayer)一个纹理层可以是一幅静止的图像,也可以是一幅以某种方式运动的图像,还可以是由多幅图像组成的动画。它可以实现多种纹理特效,如BUMPMAP(凹凸贴图)、环境帖图、运动的纹理。材质管理器(MaterialManager)MaterialManager类负责管理Material库。和材质相关的类图如下:MaterialManager还负责分析Material脚本(MaterialScript),从而初始化Material的属性。下面我们来分析一下Ogre提供的材质脚本语言。
4、Ogre的材质脚本Ogre提供的材质脚本可以帮助开发者简单的设置又酷又眩的材质特效,而不用重新编译。当然你也可以用Material和TextureLayer类提供的诸多成员函数来做到,但这就有点不太实用了。Ogre材质脚本的默认扩展名为.material,你也可以通过MaterialManager类的parseAllSources方法来规定新的扩展名。系统初始化时会自动分析所有的材质脚本文件,并设置材质的属性。注意,这里只设置材质的属性,并不会将材质的纹理调入内存,因为那样会招致极大的内存消耗!示例一:
5、环境帖图在场景中显示一个OGRE头,并设置其表面材质为环境帖图,该环境帖图的属性在Example.material中设置。我们先看一下createScene()函数的代码:voidcreateScene(void){//设置环境光mSceneMgr->setAmbientLight(ColourValue(0.5,0.5,0.5));//创建一个实体(OGRE头)Entity*ent=mSceneMgr->createEntity("head","ogrehead.mesh");//设置实体的材质ent
6、->setMaterialName("Examples/EnvMappedRustySteel");//将实体附属到场景根结点上mSceneMgr->getRootSceneNode()->createChild()->attachObject(ent);}在这里,Entity的成员函数setMaterialName是关键,字符串类型的参数对应材质脚本中的材质名。"Examples/EnvMappedRustySteel"就是材质名,它在Example.material文件中定义了环境帖图,脚本代码如下
7、://材质名Examples/EnvMappedRustySteel{//环境光ambient1.0,1.0,1.0//散射光diffuse1.0,1.0,1.0shadingphong//纹理层0{//纹理图象文件textureRustySteel.jpg}//纹理层1{//纹理图象文件texturespheremap.png//纹理层之间的颜色累加colour_opadd//指定环境帖图的方式env_mapspherical}}从这个例子中我们可以发现使用脚本来定义材质非常方便。首先,脚本采用类C+
8、+的语法,以{}作为分隔符,以//作为注释符。每一个Material必须有一个名字,在这个例子中就是Examples/EnvMappedRustySteel,它对应一个材质。脚本规定一个命令占一行,不可以串行。Ogre为其材质脚本定义了许多关键字(命令),用来设置材质属性。如上例中的“ambient”与“diffuse”就是关健字,分别设置材质对环境光和散射光的反射率。在Material定义中嵌套一个“{}”,就代表一个纹理层,你可以在大括
此文档下载收益归作者所有