ogre中MaterialSystem分析

原创 2007年09月26日 13:49:00

                                                 MaterialSystem分析

最近以为写引擎,需要研究ogre,以下是研究材质系统的结果。部分内容参照了《Pro.OGRE.3D.Programming》中文版。

 

1. Mesh SubMeshSubEntityEntity

所有的Mesh对象是由SubMesh构成的,每个SubMesh代表了Mesh对象的一部分,该部分只能使用一种Meterial。如果一个Mesh只采用一种Material,那么它可能只包含一个SubMesh

当基于Mesh创建出一个Entity时,该Entity由多个SubEntity构建而成, SubEntityMesh中的SubMesh一一对应。可以通过调用Entity::getSubEntity方法获得SubEntity。一旦得到SubEntity的指针,通过调用setMaterialName方法改变其Material。通过这种方法,可以改变所创建的Entity的默认Materials,从而使创建出来的Entity与众不同。

class SubMesh

{

    RenderOperation::OperationType operationType;

    VertexData *vertexData;

    IndexData *indexData;

 

    String mMaterialName;

};

通过代码可以看到SubMesh是保存顶点和顶点索引的类。

 

class Mesh: public Resource

{

    typedef std::vector<SubMesh*> SubMeshList;

SubMeshList mSubMeshList;

}

通过代码可以看到Mesh是收集SubMesh的类。

class SubEntity: public Renderable

{

    String mMaterialName;

    MaterialPtr mpMaterial;

    SubMesh* mSubMesh;

}

通过代码可以看到SubEntitySubMeshMaterial是一一对应的。

class Entity: public MovableObject, public Resource::Listener

{

 MeshPtr mMesh;

 typedef std::vector<SubEntity*> SubEntityList;

 SubEntityList mSubEntityList;

}

通过代码可以看到Entity是收集SubEntityMesh的类。

 

Entity的可渲染属性:Entity是由SubEntity组成的,SubEntity是从Renderable继承而来,所以Entity是可渲染的。

Entity的可移动属性:Entity是从MovableObject继承而来,所以Entity是可移动的。

 

概括的来说,EntitySubEntity是物体渲染特性的入口,而MeshSubMesh是物体结构特性(几何体数据)的入口。

 

 

 

 

 

2. TechniqueScheme PassTexture Unit

 

TechniqueScheme  

可以说技术和方案是Ogre引擎材质中最强大和活跃的两个特性。

Ogre中,每个材质中都至少包含了一种技术实现,这种实现允许你对不同性能显示卡和硬件平台使用不同的材质属性组合。简而言之,技术就是一种对物体的渲染方法。通常来说对具体适用哪个渲染技术是由Ogre引擎自动甄选出来的(根据硬件性能、方案以及细节等级等信息),但是如果你希望的话也可以在代码中完全控制这个过程。

 方案Ogre使用的高级话题之一,事实上它是一个渲染技术集合的描述。举例来说,你可能有三个不同的技术方案:高质量,中等质量,低质量。在游戏运行的时候,允许用户通过选择这三个方案中的任意一个来确定在游戏中具体使用的渲染技术集合。

 

Ogre在渲染的时候,会有一个自动甄选所需渲染技术的固定流程:首先过滤掉那些不在当前方案中的所有技术(默认情况下当前方案是Default);然后选择适配当前细节等级(LoD)的那些;最后在剩下的当中挑选当前硬件环境中可以执行的最优技术(最好效果的)。当Ogre找不到任何一个可以使用的渲染技术时,就会把物体渲染成单调的白色表面。换句话说,如果你看到了一片雪白,就要检讨一下你对材质的配置了。另外在默认的情况下,材质中所有技术的细节等级(LoD)都被设置成为0,也就是最高的细节等级。换句话说,Ogre总是在尽可能的帮助你选择最优材质技术。

 

       似乎技术和方案会带来很多复杂的处理细节。但在实际的执行过程中,你只要在材质脚本中提供了充足的内容,Ogre就会接替你来管理这些琐碎的细节。当然如果你喜欢,也可以用代码完成脚本所进行的工作。

 

 

Pass

Ogre中通路是最基本的渲染单位,同时也是可渲染对象(Renderable)用来标示自己渲染状态的基本单元。每个可渲染对象都会有自己的材质,Ogre在材质中甄选出最适合当前应用的技术实现。然后把当前技术中所有的通路依次放入图形硬件的渲染通路中。顾名思义,Ogre材质中的通路对应于图形硬件中渲染通路的概念。也就是说当前技术中如果包含了3个通路,那么在绘制是用这个材质的模型的时候,在每一帧就要进行3次渲染。

 

在实际的使用中,通路里面还有纹理单元(texture unit的定义,你可以在一个通路中定义任意数量的纹理单元,当然一个不用也是没问题的。

 

Texture Unit

Ogre对材质的定义中,纹理单元的概念对应于图形硬件中的纹理采样(texture sampler)。为了运行Ogre程序,至少需要一个硬件纹理采样支持。不过这并不是什么大问题,因为现代的图形硬件基本上都会有多个纹理采样,因此我们可以在一次渲染通路的执行中,同时处理多个纹理单元。

 

       顾名思义,纹理单元里都会包含一张纹理。你可以直接用硬盘中的图片文件,也可以通过实时的渲染来得到,甚至可以通过一个视频流来动态生成纹理图案。在Ogre中并没有对通路中纹理单元的数量进行限制,这是因为Ogre能根据图形硬件能力动态拆分通路(这里假设没有使用硬件着色程序)。具体点说,如果你的图形硬件只能同时处理4个纹理采样,但是应用程序却使用了一个6纹理单元的通路。这时候Ogre会自动的把这个6纹理通路拆分成两个分别两次进行渲染,不过虽然最后的渲染结果和预期的一样,但是仍然是通过两次渲染通路来实现的,对效率的影响不言自明。

 

 

材质的组成

在下图中,展示了Ogre的材质之中各种组成成分之间的关系。一份完整的材质至少有一种技术实现,每种技术实现中至少要有一个渲染通路。从图示中看到材质中包含了N种的技术实现,而在真正的渲染时,只会有一种技术被激活并进入渲染过程(选择激活技术的工作一般交给Ogre自动完成)。 

 

6-2:在Ogre中,材质,技术以及通路之间的关系

一篇不错的关于ogre相关技术的解释

1.真是不错!国外廉价引擎评价最好的两个是 Turque 、Truevision3D,免费开源引擎评价最好的是 OGRE和 IrrLicht ,综合考虑起来, OGRE 还不是个完整的游戏引擎,它首先...
  • naturalation
  • naturalation
  • 2013年05月05日 10:38
  • 303

Ogre参考手册(二)3.1.1-3.1.2 材质、技术、通道

说明 翻译自Ogre 1.81 manual,在不影响理解的情况下做了删减,以减小阅读的时间和翻译的工作量 这么做只是去掉了文字上修饰部分,并没有减少任何原文档中的知识点,可以作为对等的参...
  • a812073479
  • a812073479
  • 2015年07月28日 14:38
  • 385

目前游戏行业内部主要几款游戏引擎的技术对比

如果只有客户端的话,可以考虑用gamebryo,技术好一点,用ogre也可以,如果规模不大,用unity3d,如果很有钱,要效果很好的,用unreal3,bigworld是带服务器的,如果能力不够,最...
  • pizi0475
  • pizi0475
  • 2011年06月17日 11:29
  • 66981

OGRE 简明扼要的分析(自己记录看看)

据说OGRE要追上商业引擎,还是比较期待。昨天下午下载了OGRE,HG然后CMAKE,看了一下代码,写点记录。 引擎=数据结构+算法+架构 架构=模块化(适合原型封装,简洁高效不够方便,更方便需要...
  • fohoo
  • fohoo
  • 2015年08月20日 19:38
  • 474

OGRE启动过程详解(OGRE HelloWorld程序原理解析)

本文介绍 OGRE 3D 1.9 程序的启动过程,即从程序启动到3D图形呈现,背后有哪些OGRE相关的代码被执行。会涉及的OGRE类包括: RootRenderSystemRenderWindo...
  • wang371372
  • wang371372
  • 2014年12月05日 14:57
  • 623

OGRE中MESH文件格式分析

OGRE中MESH文件格式分析Ogre的mesh的文件格式我们可能通过代码反推出相关格式,如下这张图: 这图是导入一个简单的mesh文件(没有包含动画)根据代码反推出的相关结构,这个Mesh文件...
  • fenxinzi557
  • fenxinzi557
  • 2015年09月29日 09:25
  • 1027

地形的构建ogre地形shader 析解

地形的构建 以一个terrainSize为513的Terrain为例子,他应该分成多少个tile呢? 由maxBatchSize这个参数决定,numTiles = (terrainSize-1) ...
  • linuxheik
  • linuxheik
  • 2015年05月28日 10:47
  • 553

OGRE与Qt的结合(一)----使用OGRE渲染QWidget

最近几天开始重新学习Ogre,这次从源码编译了Ogre2.1,编译过程基本跟Ogre1.8.1类似,连第三方依赖库都是用的官网推荐的以前版本的,此处不多说了,网上有很多教程,现在给出下载连接。    ...
  • jidny
  • jidny
  • 2015年03月23日 20:58
  • 850

基于Ogre的角色控制器

基本框架首先参照这里配置好工程。添加一个类CharacterApplication,还有main.cpp.直接贴代码了。characterapplication.h#pragma once #incl...
  • qp120291570
  • qp120291570
  • 2015年02月25日 11:56
  • 1658

OGRE学习系列三:基础教程1 你的第一个场景

教程介绍:         第一节教程将包含构建OGRE场景的一些基础要素。首先需要关注的就是SceneManager,SceneNode,和Entity。一个实体(Enitity)就是以三维网格表示...
  • u012943043
  • u012943043
  • 2017年04月23日 22:13
  • 370
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ogre中MaterialSystem分析
举报原因:
原因补充:

(最多只允许输入30个字)