yzwalkman

——用数绘画

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

统计

随笔分类 -  Ogre Engine

Ogre Engine Analysis
Ogre源代码浅析——Mesh文件结构及加载(三)
摘要:MeshSerializer::importMesh()调用的MeshSerializerImpl::importMesh()(参见:http://www.cnblogs.com/yzwalkman/archive/2013/02/21/2920277.html Mesh文件结构及加载(二)第三段代码37行)展开如下: 1 void MeshSerializerImpl::importMesh(DataStreamPtr& stream, Mesh* pMesh, MeshSerializerListener *listener) 2 { 3 // Dete... 阅读全文

posted @ 2013-02-22 12:56 yzwalkman 阅读(2020) 评论(2) 推荐(0) 编辑

Ogre源代码浅析——Mesh文件结构及加载(二)
摘要:Ogre中的Mesh类对应着渲染所需的模型网格,其数据来自于Mesh文件。调用SceneManager::createEntity()时,Ogre会自动创建Mesh类对象,并从指定的Mesh文件中读取相应模型数据。createEntity()将形成以下call stack。 1 SceneManager::createEntity() 2 || 3 \/ 4 5 ... ... 6 7 || 8 \/ 9 MeshManager::... 阅读全文

posted @ 2013-02-21 14:34 yzwalkman 阅读(2834) 评论(0) 推荐(0) 编辑

Ogre源代码浅析——Mesh文件结构及加载(一)
摘要:Ogre的模型数据(模型顶点数,每个顶点的3D坐标值等等)保存在.mesh文件中,mesh文件的结构如下(版本号:MeshSerializer_v1.8): 1 enum MeshChunkID { 2 M_HEADER = 0x1000, 3 // char* version : Version number check 4 M_MESH = 0x3000, 5 // bool skeletal... 阅读全文

posted @ 2013-02-20 16:05 yzwalkman 阅读(5956) 评论(0) 推荐(0) 编辑

Ogre源代码浅析——脚本及其解析(八)
摘要:Ogre脚本解析的前两个阶段——“语义分析”的准备工作和“词法分析”是在ScriptCompiler::compile(const String &str, const String &source, const String &group)函数中进行的(参见“http://www.cnblogs.com/yzwalkman/archive/2013/01/02/2841607.html 脚本及其解析(二)”的3-5行);而生成AbstractNodeList并进行相关后期处理的过程,则会在ScriptCompiler::compile(const ConcreteNo 阅读全文

posted @ 2013-01-24 14:58 yzwalkman 阅读(849) 评论(0) 推荐(0) 编辑

Ogre源代码浅析——脚本及其解析(七)
摘要:ScriptCompilerManager是进行脚本解析的关键类型对象(参见:http://www.cnblogs.com/yzwalkman/archive/2012/12/30/2839013.html “脚本及其解析(一)”)。ScriptCompilerManager在其构造函数中将会创建ScriptCompiler对象实例,并将对象指针赋给其mScriptCompiler成员变量。前面所说解析过程的三个阶段即是由此mScriptCompiler对象完成的。对于ScriptCompiler来说,除了前面涉及的各函数过程外,还有两块内容值得关注。一是,如下的枚举变量定义: 1 en... 阅读全文

posted @ 2013-01-20 16:35 yzwalkman 阅读(1209) 评论(0) 推荐(0) 编辑

Ogre源代码浅析——脚本及其解析(六)
摘要:Ogre对脚本中import语句的内容将生成对应的ImportAbstractNode对象(参见:http://www.cnblogs.com/yzwalkman/archive/2013/01/08/2848831.html“脚本及其解析四”)。在创建数据对象前,对ImportAbstractNode对象的处理则将在ScriptCompiler::processImports()函数中进行,函数展开如下: 1 void ScriptCompiler::processImports(Ogre::AbstractNodeListPtr &nodes) 2 { 3 ... 阅读全文

posted @ 2013-01-15 23:04 yzwalkman 阅读(810) 评论(0) 推荐(2) 编辑

Ogre源代码浅析——脚本及其解析(五)
摘要:经过以上三个阶段的处理,借由AbstractTreeBuilder类对象,Ogre终于“理解”了指定的脚本文件究竟包含了哪些脚本对象,以及这些脚本对象间的相互关系。需要强调的是,此时各脚本对象所包含的内部数据并未被加载。在Ogre中,脚本对象与脚本对象内部数据,这两个概念是严格区分的。脚本对象与这个脚本对象中的数据,对应着脚本文件中的“同一段”内容。但脚本对象是解析过程中必不可少的一个数据抽象,只有借助它,才能有一个完整的“语义分析”过程,或者说“语义分析”才有一个落脚点。而脚本对象中的数据,以材质(material)为例,是要参与到后期的渲流程中去的;material实际上是实体类(En.. 阅读全文

posted @ 2013-01-13 14:16 yzwalkman 阅读(1591) 评论(0) 推荐(1) 编辑

Ogre源代码浅析——脚本及其解析(四)
摘要:生成了与脚本相应的ConcreteNodeList列表,并不意味着“语义分析”的结束,恰恰相反,“语义分析”其实刚刚开了个头。分析后面的代码,我们会知道,ConcreteNodeList列表的生成不过是为“语义分析”做一个准备罢了。“语义分析”的核心功能是在ScriptCompiler::convertToAST()函数中完成的。为了正确理解它,需要先来明确以下几个问题:1. 脚本文件的格式 a. 脚本中的对象(object)和对象的命名格式。 Ogre自定义了一些关键字用来对外部数据进行定义,比如材质脚本中的“material”、“technique”、“pass”等。脚本中要定义... 阅读全文

posted @ 2013-01-08 17:40 yzwalkman 阅读(2014) 评论(0) 推荐(1) 编辑

Ogre源代码浅析——脚本及其解析(三)
摘要:在完成了对脚本源文件的“词法分析”后,Ogre将进入到parse也就是“语义分析”阶段。这两个阶段的作用,从各自定义的数据结构中就可以一窥端倪,看下相应的结点定义: 1 struct ScriptToken 2 { 3 /// This is the lexeme for this token 4 String lexeme, file; 5 /// This is the id associated with the lexeme, which comes from a lexeme-token id mapping 6 ... 阅读全文

posted @ 2013-01-04 10:49 yzwalkman 阅读(2240) 评论(1) 推荐(0) 编辑

Ogre源代码浅析——脚本及其解析(二)
摘要:对文本文件的解析,有两种方式比较常见。第一种,文件信息有固定的格式但没有太过复杂的结构,比如Ogre中的.cfg格式文件。对这种文件,一般可以逐行读取并直接按行解析。整个过程相对比较简单。第二种,文件本身有比较复杂的结构,而且文件信息的组织要符合一定的语法规范。比如各种计算机语言的源文件以及各种脚本语言(JavaScript、Python、Lua等等)的源文件。对这种文件的解析一般要经历几个较复杂的阶段,并根据最终的解析结果得到相应的指令顺列。Ogre的脚本文件的组织和解析,其方法和复杂呈度实际上介于这两者之间。 以.material、.program、.particle和.comp... 阅读全文

posted @ 2013-01-02 15:17 yzwalkman 阅读(2141) 评论(0) 推荐(1) 编辑

Ogre源代码浅析——脚本及其解析(一)
摘要:Ogre的许多外部资源数据都有着相应的脚本格式,现例举如下:Material(材质):Ogre使用的是“大材质”的概念。狭义的“材质”概念往往是与“贴图”等概念区分开的,比如在Lambert光照模型中,它一般用来指物体表面对模拟光的环境分量、漫反射分量和镜面反射分量的作用的响应属性。而在Ogre中,“材质”既包括了上述狭义的材质含义,又包括对要使用的贴图的描述,还可以包括要使用的shader的相关信息。这些都是用Ogre的材质脚本来描述的。其实仔细思考一下就会发现,Ogre对材质概念的定义是恰当的,因为贴图实际上是图形学为了模拟光照效果的一种方法;而后期引入的shader其原意也是为了让程序员 阅读全文

posted @ 2012-12-30 18:18 yzwalkman 阅读(4365) 评论(0) 推荐(1) 编辑

Ogre源代码浅析——资源管理逻辑结构(三)
摘要:在完成了资源定位和资源初始化之后,Ogre就随时可以对资源进行加载了。现以mesh对象的加载过程为例,分析一下资源的加载过程。以下是Call Stack中,实现mesh对象数据加载的各被调函数的调用顺序:1. MeshManager::load( const String& filename, const String& groupName, HardwareBuffer::Usage vertexBufferUsage, HardwareBuffer::Usage indexBufferUsage, bool vertexBufferSh... 阅读全文

posted @ 2012-12-26 17:11 yzwalkman 阅读(1980) 评论(0) 推荐(0) 编辑

Ogre源代码浅析——资源管理逻辑结构(二)
摘要:创建好的资源对象指针会被保存在两个地方,第一处是在相应的ResourceManager的mResources容器中或mResourcesWithGroup容器中;第二处是在ResourceGroupManager的ResourceGroup中的loadResourceOrderMap中。 在之前的ResourceGroupManager::createDeclaredResources()代码中可以看到资源对象由ResourceManager对象调用ResourceManager::create()来创建,此函数又会调用自身的addImpl() 成员函数来保存生成的资源对象的指针,以... 阅读全文

posted @ 2012-12-24 13:34 yzwalkman 阅读(985) 评论(0) 推荐(0) 编辑

Ogre源代码浅析——资源管理逻辑结构(一)
摘要:Ogre把资源分为“Font”、“GpuProgram”、“Material”、“Mesh”、“Skeleton”和“Texture”等类型,它们分别用Font、GpuProgram、Material、Mesh、Skeleton、Texture等同名的类对象来描述,这些类都直接从Resource基类派生。Ogre的Resource对象都由ResourceManager来管理。不同类型资源的管理,分别由不同的资源管理器来实现,比如以上各种类型资源都对应着各自的资源管理器,FontManager、GpuProgramManager、MaterialManager、MeshManager、Sk... 阅读全文

posted @ 2012-12-23 20:09 yzwalkman 阅读(3267) 评论(0) 推荐(2) 编辑

Ogre源代码浅析——Archive对象
摘要:3D图形渲染引擎所需的外部资源,根据其作用可分为纹理、模型、骨骼动画、材质数据等多种类型。这些资源一般都以不同格式的文件形式保存在外部存储器上。Ogre在处理这些不同结构的资源文件时,又根据文件形态将其分为两大类——普通文件和压缩文件。在加载外部资源文件资源时,由于不同形态的文件后期处理的方式不同,所以要在加载之前就对其进行相应的区分。Ogre引入的Archive类可以达到这一目的。 Archive类有三个成员变量: protected: /// Archive name String mName; /// Archive type code Str... 阅读全文

posted @ 2012-12-21 21:39 yzwalkman 阅读(1043) 评论(0) 推荐(0) 编辑

Ogre源代码浅析——插件(Plugin)工作原理
摘要:Ogre引擎由多个模块组成,从不同角度来划分可以得到不同的结果。从功能上看Ogre可大致分为资源管理、场景管理和渲染管理三大模块;而从可执行部分的组织方式看,Ogre引擎则是由多个dll动态链接库组合而成的。 组成Ogre的各动态库基本上可以分为以下几部分:核心库、渲染层、场景管理逻辑层。核心库(OgreMain.dll,一般debug版会生成OgreMain_d.dll文件)负责资源加载和管理,并根据实际情况选择和加载对应的渲染层模块及场景管理层模块,同时调度协调各模块共同对场景进行渲染操作。渲染层主要是对不同的底层渲染引擎进行封装,使不同的底层渲染引擎如:DirectX、Open... 阅读全文

posted @ 2012-12-20 17:03 yzwalkman 阅读(3001) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示