yzwalkman

——用数绘画

导航

2013年1月15日 #

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 阅读(799) 评论(0) 推荐(2) 编辑

2013年1月13日 #

Ogre源代码浅析——脚本及其解析(五)

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

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

2013年1月8日 #

Ogre源代码浅析——脚本及其解析(四)

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

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

2013年1月4日 #

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 阅读(2225) 评论(1) 推荐(0) 编辑

2013年1月2日 #

Ogre源代码浅析——脚本及其解析(二)

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

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

2012年12月30日 #

Ogre源代码浅析——脚本及其解析(一)

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

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

2012年12月26日 #

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 阅读(1956) 评论(0) 推荐(0) 编辑

2012年12月24日 #

Ogre源代码浅析——资源管理逻辑结构(二)

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

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

2012年12月23日 #

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 阅读(3236) 评论(0) 推荐(2) 编辑

2012年12月21日 #

Ogre源代码浅析——Archive对象

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

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