OGRE模型图.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
OGRE模型图

OGRE简析(二) ------OGRE 模型绘制 “伟大航路,我把世界上的一切都放在了那里,有种的话就去领取吧” 这是OGRE中文网的一则广告,我想,无论作为OGRE的学习者还是漫漫人生的一名旅人,这句话都是非常不错的激励语。放在这,是否能够让你隐约看到属于自己的新世界? 前沿 在上次完成框架解析之后,主要是参照OGRE_3D_1.7_Beginners_Guide这本书,对OGRE的应用有了一个大简单而全面的了解,对其中场景、节点和相机等,以及模型、动画和粒子都有了一个概念的认知,这本书对于初学来说,还是值得一读的。还有就是Pro_OGRE_3D_Programming这本,网上推荐页不错,不过还没来得及看。 看完这本书,打算结合书中的应用场景来学习一下实现,毕竟会调用接口和了解内部处理机制上还是有不少差别的,而自然,第一个例子就是Sinbad水手模型了。 OGRE中显示一个模型很简单 Ogre::Entity* ent = mSceneMgr-createEntity(MyEntity,Sinbad.mesh); mSceneMgr-getRootSceneNode()-attachObject(ent); 简单的两句话,一个模型就可以马上显示出来,下面进入本章的主题,模型绘制过程解析。OGRE中,这个过程主要分三个阶段 模型文件加载 纹理映射 模型渲染 备注:红色部分是可以讨论的技术,只做引用,想不全,只列出关键词 文件加载 对于OGRE应用来说,添加一个含有模型的节点,即上面代码内容,主要就是为了在程序中加载模型,其后的显示均是在OGRE内部实现渲染,并不需要用户做其他工作。 添加模型,就不得不提一下场景的概念:”场景组织就像一个舞台,需要摄影机、灯光、服饰、道具和演员”,对于场景中的Object,大致分为moveable和immobeable两类,而模型属于前者。在OGRE中MovableObjectCollectionMap mMovableObjectCollectionMap用来维护对象,其本身算是一个二维字典,先负责Entity、Cameras类型,然后再细化到每一类型下面的实体,以name作为索引。 对象的创建主要由MovableObject* MovableObjectFactory::createInstance(const String name, SceneManager* manager, const NameValuePairList* params)函数来实现,工厂模式来处理 对于模型,最终由模型管理器Load实现。 一个完整的模型包括三大部分,模型文件,材质文件和纹理图片,其中,对于具有动画功能的,还包含骨骼文件,本章中不涉及骨骼文件的介绍,在动画专题中会做研究 模型构建 模型管理器,通过资源管理器在内存中先构造出模型,此时模型为空壳,仅保存此模型的路径信息,只是在资源管理器中有此模型的唯一位置。其后,调用模型的load函数,实现模型文件的加载 文件读取 Sinbad模型是一个zip文件,在load中,需要通过zip文件解析,获取解析后的文件流,存储在mFreshFromDisk成员中 文件解析 准备好文件流后,则开始了文件解析的过程,OGRE中由MeshSerializer类型,负责模型二进制流的导入导出功能。最终形成一个完整的模型。 模型的内存结构 Mesh最为一个整体,主要是由SubMesh组合而成的,每一个SubMesh包括材质、顶点数组、纹理数组、渲染类型和骨骼四项内容,依次读取Mesh文件中的信息,其中材质只是name标识,而在材质文件中根据name索引详细说明。在读取完子模型和骨骼后,下面存储的是模型的bounds和外接球半径,最后是EdgeData 如此,一个模型文件的读取告一段落。 引用计数的广泛应用 纹理映射 接下来,则进入了模型材质的准备阶段,其最关键的就是纹理的调度。 首先将每一个SubMesh(包含材质名称,并在材质对应文件中有描述)封装为SubEntity,通过材质管理器构建出材质,设置到所属的SubEntity,通过load函数来进行纹理映射的实现。 材质过程:T-》Pass-》TextureUnitStates-》TexturePtr 然后由纹理管理器创建出对应材质的纹理,如果共用则引用计数+1即可。 纹理创建Prepare(prepare::do_image_io,mLoadedImages) 纹理创建Load(GLTexture::createInternalResourcesImpl,HardwarePixelBuffer::blitFromMemory) 通过纹理管理器完成了纹理映射的构建,prepare阶段主要完成纹理图

文档评论(0)

jgx3536 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档