http://blog.sina.com.cn/s/blog_60d6fadc010128mo.html
1.Const与 = 0的理解
const 和 =0 没有关系,要分开理解。
成员函数后面用 const 修饰,通俗的理解就是在这个函数内不能修改类的成员变量,除非那个成员变量是 mutable 的。
= 0表示这个成员函数是纯虚函数,也就是它可以没有定义,只有接口,由它的继承类具体定义它的行为,当然,你也可以给它定义缺省的函数体。一个类里如果包含 =0 的纯虚函数,那么这个类就是一个抽象类,它不能具体实例化(不能创建它的对象),而只能由它去派生子类。
举例:来自OGRE的工厂类
template< typename T >
class FactoryObj
{
public:
virtual ~FactoryObj() {};
virtual const String& getType() const = 0;
virtual T* createInstance( const String& name ) = 0;
virtual void destroyInstance( T* ) = 0;
};
第三章 OGRE设计总揽
OGRE最亮眼的地方:场景图和场景内容的分离设计。
OGRE最灵活和最富有价值的系统:材质脚本系统。
OGRE支持的三种动画方式:骨骼动画(Skeleton)、变型动画(Morph)、姿态动画(Pose)。
合成器框架:允许用户在视口级别实现全屏的二维后处理特效。注意:这是针对视口的操作。
资源的含义:所有渲染几何体到渲染目标的数据所需要的数据。资源的四种状态:未定义、已申明、未载入、已载入。
Root对象:OGRE应用程序的主入口点,作为整个引擎的外观类。
资源管理器:单件模式,使用单件对象ResourceGroupManager来作为资源管理器。注意区别资源组管理器和资源管理器。
OGRE中极其重要组成概念:场景管理器。所有场景图的具体执行过程都来自SceneManager类,支持多个并发的场景管理器一起工作,虽然绝大多数时候只有一个场景管理器在工作。场景节点(SceneNode)。实体(Entity),继承于活动对象(MovableObject)。
渲染系统和渲染目标:前者是OGRE对底层硬件API的一层抽象。后者是前者所创建的一个对象类型。又有渲染到窗口和渲染到纹理。
OGRE中的管理器都是单件模式的。
第四章 OGRE的初始化
OGRE最有名的卖点:它拥有良好的适应性和弹性。所谓的弹性,就是根据你自己的情况选择对它的操控程度,好比开车的时候自己选择手动挡还是自动挡。
OGRE渲染窗口:唯一可以被系统用来渲染场景的地方。如同画布一样,OGRE把你程序的内容画到它的表面。摄像机用来拍摄场景,视口用来存放胶片。“深度冲突”的概念及解决方法。
渲染循环(Render Loop):最简单的方法,root->startRendering();调用后,OGRE会不断的渲染所有能被渲染的对象。结束渲染的方式有很多种,最好的方式是在帧监听中返回false。
帧监听:帧监听对象就是一个符合FrameListener接口的类的实例。OGRE渲染每一帧的开始和结束的时候都会回调FrameListener接口的方法。
OGRE的手动初始化。
插件部分——其中最重要的两个插件是八叉树场景管理器(OctreeSceneManager)、粒子系统管理器插件(Plugin_ParticleFX)。
渲染系统——获取渲染系统的方法。手动设置渲染系统的方法。
渲染窗口——手动创建渲染窗口的方法。可以把OGRE的渲染窗口插入到一些窗口系统或者组建系统中(Qt、wxWidgets),获取当前渲染窗口在系统中的句柄。也可以让OGRE使用你提供给他的窗口来作为渲染的父窗口。
摄像机和场景管理——这两个类渲染了你的场景。
摄像机——拥有方位属性,不能被渲染。根据设置计算好椎体,再剔除之外的物体。三种渲染模式:边框、实体、点。指向、方向、着眼点。“轴绑定”的本地坐标系:原点是摄像机所在的点,轴向和世界坐标系一样。
高级摄像机属性——OGRE的立体渲染(虽然用处不大)。
视口——“画中画”的实现原理。
主循环渲染——手动渲染、自动渲染。
第五章OGRE场景管理器
场景图——组织管理它里面可渲染的物体。
场景管理器——场景节点,场景图中三个重要的操作:移动、旋转、缩放,操作的目标都是场景节点而非场景内容。
空间关系和3D变换——OGRE默认的方式是移动在父空间进行,旋转和缩放在本体空间进行。
场景中的活动物体——渲染对象和可渲染物体。前者是摄像机、灯光等。后者是具体的物体。
摄像机的特殊属性:可以在没有挂接到场景节点的情况下直接放置到场景中,也可以不依赖于节点进行自身的旋转移动等操作。在挂接到节点时,注意“锁定偏移轴”设置,否则摄像机会维持固定的“向上”状态,导致不能进行滚动操作。
灯光:局部辐射光照算法。全局辐射度模型。“渲染通路”的概念?点光源、聚光灯光源、有向光。
世界地图——包含除“活动物体”以外的所有东西。最重产生的地图通常是由网格模型为基础构成的。
通用的空间分割策略:OGRE的场景分割建立在物体粒度而非多边形本身。四叉树、八叉树、二叉树分割空间法。
静态几何体——通常由很多不再活动的活动物体来构成。现代的GPU擅长渲染少量巨大的物体,而非多而小。
缩放:如果你在缩放场景节点的时候,发现实体模型忽然产生了奇怪的变化。可能是因为法线也一同被缩放所致,因为光线计算会参照标准法线的数据,而缩放后的法线将会对计算产生相应的影响。解决的办法是通过在缩放后调用setNormaliseNormals()方法,不过这也会消耗一些执行效率。
第六章 OGRE的材质
OGRE的材质——材质的是一个术语,表示你的物体对光的反射方式。
材质的101报告——OGRE是硬件加速的实时渲染引擎。对于硬件来说,无论多么复杂的材质,最终渲染到屏幕的结果只有一个类型,那就是颜色。Ogre作为一个典型的渲染引擎,把物体上的颜色分解成四种不同的光照作用:环境反射(Ambient)、漫反射(Diffuse)、放射(Emissive)以及镜面反射(Specular)。
物体着色的基础:局部辐射度模型,对物体颜色产生影响的因素:光源本身的属性、观察者的角度、物体的颜色。
纹理贴图:使用纹理贴图就相当于用一个2D的图片包裹3D的物体。
可编程着色技术:可编程图形管线(programmable graphics pipeline)的出现,是到目前为止实时渲染3D图形加速技术中最大的飞跃。
固定功能管道:固定功能管道(fixed-function pipeline),不可以编程,你告知硬件物体的顶点和图片上像素的对应关系,然后就交给硬件就进行下面的工作:把物体的顶点信息映射到世界空间中去,然后结合纹理光栅化顶点的数据,最后绘制到屏幕上。
材质与程序设计——之前还是理解些高级的东西吧!
批次:OGRE最基本的渲染单元叫做可渲染对象。为了效率,尽量减少渲染状态的改变。
材质科隆:OGRE中材质被所有引用共享。
OGRE材质中最活跃的两块:技术和方案。技术:一种对物体的渲染方法。方案:渲染技术的集合。
LOD:细节等级
通路:Pass.通路是最基本的渲染单位。同时也是可渲染对象用来标示自己渲染状态的基本单元。有几次通路一帧就要进行几次渲染。
纹理单元:对应硬件的“纹理采样”。
纹理压缩:常见的DDS就是压缩的纹理格式。
视频流:
实体:实体和子实体是物体渲染特征的入口。模型和子模型是物体结构特征(几何体数据)的入口。
材质的例子——
GPU程序参数类型:按索引方式——位置索引(Indexed)、名称定位(Named)。按设置方式——手动、自动。
第七章 资源管理
材质资源、模型资源、骨骼资源、字体资源、GPU资源、纹理资源。
资源管理——用资源管理策略来处理资源。
资源组——两种管理方式:按类型、按组别。
资源组与世界地图——默认通过场景管理器将整个地图载入“General”资源组。
资源定位(档案)——Archive接口的功能
资源的生存周期——资源的各种状态和触发其转换的事件。
资源逻辑管理——资源管理器主要负责管理资源的载入和卸载。
资源载入——不同资源类型的载入方式可能不同。
对手动创建的资源载入——
后台处理资源载入——默认的OGRE不是线程安全的。
资源的四种状态——未定义->已声明->未载入->已载入。
资源管理实践——插件式载入方法的代码编写。
资源的初始化——资源初始化的顺序:在正式添加资源前,你需要首先初始化相应的资源组。而在初始化资源本身之前,你需要创建所需的渲染窗口,这是因为对资源脚本的解析可能会依赖GPU的配置。
卸载资源——两种
清理资源/销毁资源组——
卸载单个资源——
OGRE中的档案(Archive)——可以被描述为:把一系列文件存储在一起的文件夹。价值是:为OGRE提供一个访问文件的入口。
通过自定义档案来实现自定义的资源载入——wad文件类型。
第八章 OGRE渲染目标
OGRE的渲染到纹理技术。
概念总揽——
渲染窗口——当使用多个窗口的时候,只有第一个窗口被设置为OGRE的渲染主窗口,与D3D或者OpenGL绑定。
视口——
渲染到纹理——简单来说,它的概念就是把当前场景的一部分或者全部渲染成一个可以使用的纹理上面,然后在下一次的渲染中把它当普通的纹理使用。(哈哈,就想我话雷达图时的双缓存透明叠加一样)。应用场合:如实时阴影、动态反射等。
性能影响——从缓存中读取数据是一项耗时的工作。
渲染目标相关的类型——渲染目标的基类:抽象接口“RenderTarget”。派生出三种渲染目标类型:窗口渲染目标、纹理渲染目标、多个渲染目标。
例子——不同实现:D3DRenderWindow,GLXWindow,GTKWindow,SDLWindow以及Win32Window。
渲染到纹理的实现——创建一个纹理渲染目标->设置一个摄像机和视口用于把场景内容渲染到纹理目标上->(dao 8.4)
第九章 动画
动画是由静态画面快速交替得到的。
操控方法——关键帧、控制器。
OGRE支持的动画类型——数字动画轨迹、节点动画轨迹、顶点动画轨迹。
动画——骨骼动画、顶点动画、变型动画、姿态动画
硬件动画vs.软件动画——硬件加速时,硬件动画中的模型数据无法被CPU使用。
挂载点——
控制器——
动画实例——尽量使用“原地动画”来表现模型的运动。
第十章 公告板与粒子
公告板——公告板是一种依赖摄像机确定方向的简单四边形。正面总对着摄像机。作用:作为容器(一个表层),被普遍用于提高茂密型场景的执行效率。
公告板集合——公告板不能渲染自身。公告板集合是一种管理器,管理的是同种类型。
集中公告板类型:指向公告板(默认)、导向公告板、垂直公告板。
公告板池——提前告知数量,OGRE提前创建,在你需要的时候提供给你。
公告板的纹理坐标——两种纹理坐标的分配方式。
公告板链——创建诸如闪电、电波、速度线和轨迹这种需要“跟随前面的运动”而不是独立的公告板集合产生的特效。
带状轨迹——如同链表,在头部增加,在尾部删除,达到带状效果。
粒子系统——以一种简单的方式实现很多的特效。
粒子系统的基础——两种定义方式:脚本(推荐)、硬编码。
粒子系统与3D场景——发射器跟节点绑定,而发射出来的粒子则不受控制。
粒子系统的范围——包围盒的概念。
粒子系统的更新——OGRE的软启发方式更新。一个粒子在离开视野一段时间之后,就要停止更新,即被冻结。OGRE允许其在时间轴上前进一个数量。
粒子系统的空间排序——可以渲染粒子的时候根据粒子到摄像机的距离进行排序(非默认,高功耗)。
发射器——发射器的形状、发射的角度、发射的速率、发射持续时间、粒子的生存周期、粒子的颜色。可以在运行期插入自定义的发射器插件,这是对Ogre中粒子系统最简单的扩展方法。
效果器——对粒子进行影响。类型:线性力、颜色衰减器、颜色修改器、缩放器、旋转器、颜色图。
第十一章 动态阴影
阴影的重要作用:在3D空间中表现空间感。
阴影技术——模板阴影、纹理阴影。分别拥有两个形态:调节、加成。