1. Mesh SubMeshSubEntityEntity

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

当基于Mesh创建出一个Entity时,该Entity由多个SubEntity构建而成, SubEntity与Mesh中的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;

}

通过代码可以看到SubEntity与SubMesh和Material是一一对应的。

class Entity: public MovableObject, public Resource::Listener

{

MeshPtr mMesh;

typedef std::vector<SubEntity*> SubEntityList;

SubEntityList mSubEntityList;

}

通过代码可以看到Entity是收集SubEntity和Mesh的类。

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

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

 

概括的来说,Entity和SubEntity是物体渲染特性的入口,而Mesh与SubMesh是物体结构特性(几何体数据)的入口。

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的MaterialSystem分析相关推荐

  1. OGRE源代码resource分析

    在载入模型和运行游戏的过程中资源的载入是一个很重要的过程,这些资源一般包括,texture,font,material,skeleton,等等,这些都是资源,都有一定的共同的特征,于是很自然的想到使用 ...

  2. Ogre骨骼动画分析

    http://3dlearn.googlecode.com/files/ogre skeleton animation.pdf 欢迎指出文中错误 1  前言 骨骼蒙皮动画分两步骤进行:根据时间插值更新 ...

  3. OGRE源码分析---Resource 板块分析

    引擎名称:OGRE 版本:1.11.5 模块名称:资源模块 2. 游戏资源管理主要做什么? ·资源组织 根据各种资源的特性和使用的方式等,设计资源数据的内存组织方式 ·资源管理 统一的资源处理方法,如 ...

  4. OGRE分析之设计模式

    这段时间静下心来看了一下OGRE的源代码,有一点心得,于是写下来形成如下的几篇零散的文章: 阅读 OGRE分析之设计模式(四)  摘要:Iterator  Observer  Strategy  Te ...

  5. Ogre内部渲染流程分析系列

    come from:http://blog.csdn.net/weiqubo/article/details/6956005 要理解OGRE引擎,就要理解其中占很重要位置的 Renderable接口, ...

  6. [Ogre][地形]OgreTerrain的实现原理分析

    转自:http://www.xuebuyuan.com/1482609.html 一.世界地图 将整个世界切分成多个Tile,每个Tile大小相同,用二维坐标形式索引起来,如图: 中心点(0,0)位置 ...

  7. OGRE 2.1简明扼要的分析

    link:http://www.aiuxian.com/article/p-2835471.html 据说OGRE 2.1 要追上商业引擎,还是比较期待.昨天下午下载了OGRE 2.1,HG然后CMA ...

  8. (转)修改ETM,用Ogre实现《天龙八部》地形与部分场景详解(附源码)

    本文主要讲的是<天龙八部>游戏的地形和一部分场景的具体实现,使用C++, Ogre1.6,我摸索了段时间,可能方法用的并不是最好的,但好歹实现了.文章可能讲得有点罗嗦,很多简单的东西都讲了 ...

  9. OGRE例子:Demo_Ocean 源码解析

    因为最近在做水,所以这篇海洋的例子是必须要读懂的.耐着性子看了一下,还是能看懂的.现在将代码解析放上来.程序共有四个文件:MaterialControls.h :MaterialControls.cp ...

最新文章

  1. 为创业者保驾护航 “无安全 不创业” 安全狗全国路演北京站
  2. mxnet symbol图的 变量 shape
  3. HDU 2243考研路茫茫——单词情结 (AC自动机+矩阵快速幂)
  4. Spring注解开发-属性依赖注入指定名称的bean
  5. 第一个linux桌面,Ubuntu 4.10 “Warty Warthog”:回顾第一个Ubuntu Linux桌面
  6. 单词拆分Python解法
  7. 布式缓存系统Memcached简介与实践
  8. Essential Studio for Windows Forms发布2017 v2,持office 2016和主题定制
  9. Linux ls命令:查看目录下文件
  10. 计算机连入局域网需要配置,设置局域网
  11. 电子沙盘 数字沙盘 开发教程
  12. S3C2410 通用异步收发UART 串口通信
  13. 微信小程序根据经纬度动态定位计算周边商家导航距离
  14. 乐理基础-十二平均律,三分损益法,五度相生法
  15. 改cpp[1] Vscode Hex Editor,在vscode中查看内存
  16. 数字录波器的理解——如何完成这一过程的(无数学推导过程)
  17. 计算机网络技术项目成果,计算机网络技术专业建设预期成效
  18. linux内核驱动中对文件的读写 【转】
  19. 博客之星规则能否参照“金球奖”
  20. BLDC电机FOC控制技术学习笔记2

热门文章

  1. ITK:提取具有多个分量的图像通道
  2. VTK:可视化算法之HeadBone
  3. VTK:Shaders之CubeMap
  4. VTK:相互作用之WorldPointPicker
  5. VTK:图片之ImageTransparency
  6. OpenCV基于LeNet-5和连接组件分析的数字识别的实例(附完整代码)
  7. OpenCV转换PyTorch分类模型并使用OpenCV Python启动
  8. Qt Creator编写代码
  9. C++前缀++/–比后缀++/–的效率高
  10. C和C++循环链表的设计与实现