框架场景资源渲染,整个框架的插件配置化和根节点驱动;各种场景管理器且场景节点负责空间划分、节点物体变换变形、资源调用和提交渲染;资源管理器的各种组和管理器提供加载重用卸载功能以及网格实体类型、摄像机类型、光照类型、材质类型;渲染管理器的各种渲染子系统和渲染目标设置,OGRE是标准的OGL坐标系但是屏幕坐标系却是D3D形式的。
插件化脚本化渲染,整个OGRE繁杂的材质纹理组织和渲染顶点像素着色,Overlay UI系统,粒子系统,字体都已经脚本化无需编译,按需加载,按照LOD加载;且脚本可以继承重用,可以按照配置加载,脚本化配置插件化引擎是很优秀的做法。
数据缓存高效性,尽量用Lock Discard/NoOverWrite方式丢弃前面的写,Pool尽量放置到显存中,Usage尽量用WriteOnly方式写,可以有效的提高性能,如果真的要频繁读取前面的数据那么用系统缓存一份尽量少的数据剩下的数据按照前面的方式,都比来愚蠢的回锁定写显存的效率高。多个几何体可以共用顶点缓存和索引缓存,例如一样大小或者进行一些恰当的变换,所以顶点缓存和索引缓存需要用智能指针。
顶点,对于顶点声明,有顶点位置、纹理坐标(包括多阶层纹理)、顶点法向量、光照颜色(环境和漫反射等)、还有绑定骨骼节点的绑定权重值。索引缓存可以关联到三角网格信息,三角邻接信息,Opengl command中使用网格的关联。
像素,像素缓存更新,用blitFromMemory或者用上锁写缓存,解锁的方式,像素也就是一个二维的像素格式的表面(从压缩格式里面解压出来了),那么可以当做普通缓存一样使用。纹理的类型1D,2D,3D坐标系表示,TEX_TYPE_CUBE_MAP是有6个二维坐标系用三维坐标系来表达的。
网格,由顶点缓存和索引缓存组成尽管属性子集也是如此,网格静态数据可以组成多个实体Entity,实体有子实体子实体有子集的材质纹理;OGRE中场景中的对象分为实体(一般动的),Camera, Light,和Material。
阴影,生成方式主要有两种基于模板的阴影,和基于纹理的阴影;在使用方式上还可以调整阴影明暗,附加光照掩码计算非阴影区域光照贡献度的方法;阴影的作用对象是光照和物体材质,可以在光源方或者在材质方,单个和多个渲染组物体上开启关闭和操作阴影效果。阴影在OGRE中默认是采用基于投影基础的纹理阴影,只需要简单的启动和设置,投影简单顶点形状和大小计算,材质中分为漫反射环境光单个光源不同的贴图,多次通路渲染等都自动计算。OGRE支持的模板阴影也支持模板的设置阴影距离、摄像机裁剪面等。 实际阴影渲染中应该使用阴影体几何列表导出(3D中可以对阴影体缩放),或者实时轮廓边计算根据光源位置计算投影几何体,在顶点着色器中进行复杂阴影顶点的计算(避免过近光源,避免过长影子,会影响其它物体穿透,LOD因素),在像素着色器阶段需要考虑光源的纹理和物体的材质,LOD以及多次通路的渲染。调制阴影是用集成化材质阴影对多光源渲染的阴影结果累加,和减少边界明显轮廓,柔化阴影颜色可以使用预烘焙技术。加成光照遮罩是用光照原理将多光源渲染的光照阴影结果进行叠加,渲染的通路次数Pass是光源个数n+2,为实时的光照需要的性能消耗比较高,且不能已有的静态光照结果很好混合(不能去除已有静态光照结果),所以只能选择集成化光照或者加成实时光照,游戏引擎一般选用集成化材质阴影的调制阴影。光照和阴影是一个很复杂高级的技术需要不断加强。
动画,复杂的面部动画或者变形特效还是需要顶点插值动画(在像素插值上进行了压缩)和基于曲线的顶点插值动画;一般有规律的角色动画需要骨骼动画(在顶点插值上进行了压缩)。骨骼动画可以用线性插值或者样条插值,网格顶点可以赋予多个骨骼节点以及骨骼权重,骨骼动画可以有多个关键帧,关键帧之间有旋转放缩平移,在骨骼父节点和子节点也存在运动关系,这样的运动关系可以正向推进插值,也可以用逆向动力学由结果推出前面的运动。骨骼动画用Shader编程计算插值顶点和纹理光照会得到更好的性能。动画可以抽象出动画状态,用动画状态控制动画的动作,动画播放时间(负数会反转动画),动画位置,骨骼权重调整,一个动画状态可以操作多个动画实体。 动画分为顶点动画和骨骼动画,其中顶点动画分为:顶点形变动画和顶点姿势动画,顶点形变动画可以是关键帧在两个顶点缓存间直接线性插值或者是样条式的PathDeform路径动画,姿势动画有一套姿势关键帧信息也就是语音位置类似骨骼但是在姿势上对插值的顶点受到多个姿势权重影响进行融合得到顶点网格最终位置。无论是顶点形变动画,面部姿势动画,还是骨骼蒙皮动画都是通过关键帧对压缩抽象出来的变换信息进行线性或者样条插值得到的,面部动画和骨骼动画复杂在的地方就是需要对多因素进融合(权重)计算结果。
一般来说,当实体的结构和形状发生完全变化的时间,采用变形动画, 变形动画还是非常全面和强大的。变形动画和骨骼动画,姿势动画和骨骼动画之间可以混合使用,可以将网格进行划分,不同的网格应用不同的动画类型,且在各自方向进行独立计算,例如,你使用硬件皮肤,你应该实现两个分离的顶点程序,一个做骨骼动画,一个做骨骼动画和顶点动画。或者融合影响的网格,那些在顶点上的效果被首先应用到基网格模型上,而骨骼动画被应用到这个结果上。举例来说:这就允许你在一个角色的面部动画用在塑造顶点动画,同时进行主要的移动动画用在骨骼动画上,例如:先做顶点动画,然后应用骨骼动画到其结果上(顶点在变形方面,骨骼在平移和旋转方面变化,用变形后的网格进行骨骼变换,平移和旋转是相对于原始的帧的当前的插值却是对顶点变换后的帧的,但是正是这样实现了都是相对于原始帧变换的合成)。场景节点动画和骨骼动画类似有节点关键帧和父子节点的变化。数值动画可动画的对象可以继承自AnimableObject 例如光源的漫反射和环境光颜色渐变用变形动画来做。如果在Shader中编程实现动画时候需要注意最大寄存器数。
OGRE 调试:对于全屏无法调试的问题,调试进去,发现ogre.cfg, ogre.txt log都在用户路径:C:\Users\Administrator\Documents\Ogre\Xalafu 下面。
OGRE 调试:对于全屏无法调试的问题,调试进去,发现ogre.cfg, ogre.txt log都在用户路径:C:\Users\Administrator\Documents\Ogre\Xalafu 下面。
更多的细节见:
http://www.ogre3d.org/docs/manual/index.html#Top
中文版1.4的有:
http://ogre3d.cn/%E6%96%87%E6%A1%A3:%E6%89%8B%E5%86%8C:1-4-0
本文深入探讨了 OGRE 3D 渲染引擎的核心特性,包括其框架设计、材质纹理管理、顶点及像素缓存机制、阴影生成与处理技术、以及动画系统实现等内容。
4428

被折叠的 条评论
为什么被折叠?



