关闭

ogre 学习

377人阅读 评论(0) 收藏 举报
1: 设计初衷
它设计初衷是完全跨平台的。抽象的接口隐藏了平台相关的细节。
它设计初衷是大幅度支持扩展的。支持多种场景类型,独立出平台和3D接口限制。
2: 基本类结构关系
Roo:对象为一切的入口,它负责创建Ogre的所有基础元素,三大基础元素大致包括:场景管理器,绘制系统,资源管理器。
场景管理器:场景节点,动态对象。
资源管理器:资源组管理,资源管理
渲染模块:硬件缓冲区管理,渲染系统,渲染窗口
3:关键词
Root::Ogre系统入口,程序一开始就应当创建,最后释放,它帮助我们获得其他元素的指针。甚至包括StartRender()
RenderSystem::渲染系统。是对3D渲染API的一个封装。一般来说无需手工调用,场景管理器对对其进行控制,只有在实现一些特殊需要的时候,可以获取使用。
SceneManager:负责对整个场景中内容的创建和管理。包括静态地形场景,摄象机,动态对象,光线,材质等都归属其管理。场景管理器根据室内室外等渲染管理进行了不同类型的优化,在创建时可以传参进行选择。
ResourceGroupManager:资源组管理器包含多种的资源管理器,例如纹理,网格Mesh等的资源加载管理器,他们各司其职管理其所负责的资源数据对象。和渲染系统一样,大多数情况下他们会被自动调用的进行资源加载,我们仅需要做的就是 Root::getSingleton().addRessourceLocation()告诉Ogre从哪儿加载资源即可,除非个别特殊需求,我们动态的手工控制时候可以TextureManager::getSingleton()获取相应的资源管理器进行处理。
Mesh对象:就是一个具体的模型,而在一些情况下,Mesh对象仅指那些能够移动的对象,那些静态对象即不属于Mesh对象之列。Ogre有自己的一套定义的Mesh结构,即.mesh,该文件格式可以被网格工具编辑。
Entity实体:是一个可移动的对象实例。和Mesh的不同是,实体包括网格,但若网格未和场景结点绑定起来,则不可使用该实体。我们可以修改场景结点来获得实体的修改,但此时Mesh实际是没有变化的。注意:实体是允许有子实体的,网格也一样有子网格。每一个子网格可以有自己的材质。相关函数如下:SceneManager::CreateEntity()由场景管理器去创建实体对象,Entity::GetSubEntity()获取子实体指针,再SetMaterialName()修改材质。
材质:它是由资源管理器管理,但在场景管理器中也保存着一份材质的列表。它的属性有默认的,SceneManager::GetDefaultMaterialSetting()函数可以获取其默认属性,当然也可以修改。值得注意的是,OGRE允许在程序运行时,通过材质脚本对材质进行设置。
Overlays层:一般是拿来做一些不接收用户交互信息的UI面层的。当然游戏中也可以设置一些层元素作为游戏内容,例如飞机驾驶舱,不接受任何用户交互信息,并且要求最前端显示。层有一个专门的层管理器,它负责层的创建释放等工作。每个层有自己的一个Z深度信息,通过它进行遮挡关系的计算。另外,每几个层可以分为一个小组进行统一控制,这个在Ogre中被称为层容器 OverlayContainer。每个层可以进行独立的旋转缩放等功能。它允许是2D或3D。 OverlayManager::getSingleton().createOverlayElement(“Panel”, “myNewPanel”)。
4:Ogre的脚本
1:材质脚本。在资源组管理器初始化完毕时,装载材质脚本,OGRE会自动的在组相关的资源位置查找”.materal”扩展名的文件,并对这些脚本进行语法解析。手动解析也可以MaterialSerializer::parseScript()但是注意的是:解析脚本时并没有对脚本中定义的全部纹理等资源进行加载。所以,在我们访问一个材质的时候,一定要确保它已经装载,或者,我们手动将此材质Load()一次再进行访问。另外,材质名必须唯一,且不可有”:”号。
格式:以{},空格,//作为标识符。
// 后跟注释,不支持多行注释。
{} 之间代表为一个解析单元
每一个material XXX 代表是一个材质单元。其中,每一个technique代表一个材质渲染手法,pass是每个渲染通路模式,texture_unit则是一个纹理单元。
一个材质脚本允许有多个渲染手法技术,一个渲染手法技术中允许有多个渲染通路模式,一个渲染通道允许有多个纹理单元。
 
渲染手法技术Techinique:
一个“渲染手法技术”就是一个单独的渲染物体的方法。多个技术的存在原因是为适用不同的显卡以及根据远近关系对一个物体进行不同的渲染。
技术的排列需要一定顺序,一般来说,最常用最的技术放在脚本最前面,
格式为:        Techinique 技术名
不命名的技术默认会以其序列号进行命名,注意,技术名不可重复。
 
方案技术scheme:
因为我们对不同的显卡标准或根据某中不同的需求,设计出不同的技术,每种技术所适用的环境方案需要我们指出。
格式为:             scheme 方案名
默认的方案是default,若我们某一个技术适用于开启hdr,Shader3.0的方案,我们只需对该技术设置方案为 scheme hdr_open_shader_3_0 即可。
 
细节层次索引 lod_index:
每一个技术都必须对应一个细节层次索引。一般来说,默认的都是0,即最近最优秀的渲染技术,当我们需要对远处细节进行渲染时,则设置这个值吧。
格式为:              lod_index 数值层级
虽说lod的数值层级是从0-65535,一般设置2-4层就差不多了吧。因为技术有一定的排列顺序,所以,我们一般是将index大的技术放在后面。
 
细节层次距离 lod_distances:
这里指定使用不同的细节层次的距离值,注意,该属性必须在所有的技术块外面进行声明指定。
如例子中所标识:lod_distance 200 就代表,在0-200这个距离内,我们使用细节层次为0的技术,在200以上的则使用细节层次为1的技术
Lod_distance 200 700.5 则表示在0-200时我们使用细节0,200-700.5这段距离使用细节1的材质技术,700.5以上使用细节2的材质技术。200和700.5间使用空格间隔。
 
所以技术的排列顺序通常为这样
Material MyTestMaterial
{
lod_distances 200
       Technique Lod_0_Hdr_Open_Shader_3_0
       {
Lod_index 0
              Pass 0
{
       Texture_unit
       {
              //…..
}
       Texture_unit
       {
              //…..
}
              }
Pass 1
{
       Texture unit
{
       // ….
}
}
}
       Technique Lod_0_Hdr_Close_Shader_1_0
       {
Lod_index 0
              Pass
{
       Texture_unit
       {
              //…..
}
       Texture_unit
       {
              //…..
}
              }
}
       Technique Lod_1_Hdr_Open_Shader_3_0
       {
Lod_index 1
              Pass
{
       Texture_unit
       {
              //…..
}
       Texture_unit
       {
              //…..
}
              }
}
       Technique Lod_1_Hdr_Close_Shader_1_0
       {
Lod_index 1
              Pass
{
       Texture_unit
       {
              //…..
}
       Texture_unit
       {
              //…..
}
              }
}
}
 
Pass渲染通路:
再次强调一个概念:一个材质脚本,为了适应不同的显卡和LOD细节层次技术,我们允许有多个技术,为了加速充分的使用GPU,每个技术中同时又支持多通道的渲染,每个渲染通道内,同时又允许有多个纹理单元。首先这个改变必须明确理解才能顺利的进行材质脚本的设计。
我们在“渲染通路”这层可以设置以下属性:
·   ambient       材质的环境光反射系数
格式是 ambient red green blue alpha
每个值要求为0.0-1.0之间,例如ambient 0.2 0.2 1.0 1.0代表每个顶点对环境光的反射系数。注意:若关闭了动态光照和纹理层的光照色彩混合的话,该项就不起作用了。默认值为全白
·   diffuse       材质的漫反射系数
格式是 diffuse red green blue alpha 其他同上。
·   specular      材质的镜面反射系数
格式是 specular red green blue alpha Shininess ,最后多了一个参数,是闪耀值,该值处于1-128之间。注意:若该值较大则会令人感到耀眼的反射。
·   emissive      材质自发光系数
格式是 emissive red green blue alpha
·   scene_blend
设置渲染通道和现有的渲染层内容混合方式。有预设的四种方式
格式为scene_blend add或scene_blend modulate/alpha_blend/colour_blend
Add 是将渲染出的颜色和亮度一起叠加到渲染场景中,相当于“scene_blend one one”
Modulate 是将渲染输出的颜色叠加到渲染场景中,相当于”scene_blend dest_colour zero”
alpha_blend 是将渲染输出的亮度叠加到渲染场景中,相当于”scene_blend src_colour one_minus_src_colour”
colour_blend 是将渲染输出的alpha值进行遮罩缓和。相当于”scene_blend src_alpha one_minus_src_alpha”
当然,我们也可以不使用预设的方式,进行自定义源和目标的混合因数
格式为 scene_blend src_factor dest_factor
这样最终渲染出的颜色就是 (渲染通道的结果 * src_factor) + (渲染场景的颜色 * dest_factor),其中src_factor dest_factor两个参数可选以下值
one
常数值1.0
zero
常数值0.0
dest_colour
已存在的像素颜色
src_colour
纹理像素颜色
one_minus_dest_colour
1 -(dest_colour)
one_minus_src_colour
1 -(src_colour)
dest_alpha
已存在的像素alpha值
src_alpha
纹理像素alpha值
one_minus_dest_alpha
1 -(dest_alpha)
one_minus_src_alpha
1 -(src_alpha)
例如:scene_blend one zero (代表渲染出的纹理完全覆盖其后的渲染场景,即渲染管道出来的纹理是完全不透明的) ß默认的混合模式也正是这种。
·   depth_check
是否开启深度缓冲检测 格式为 depth_check on 或 depth_check off
·   depth_write
是否打开深度缓冲写入。 格式为 depth_write on 或 depth_write off
默认的时候深度缓冲是打开的,个别时候我们需要渲染一系列透明物体的关系时候,则将其关闭。
·   depth_func
写入象素前的深度比较函数。 格式为 depth_func compareFun
其中compareFun可以取下面值之一。
always_fail
永远不向渲染目标写入像素
always_pass
总是将像素写入渲染目标
less
如果将要写入的像素的深度小于现在缓冲区内容的深度,则写入
less_equal
如果将要写入的像素的深度小于等于现在缓冲区内容的深度,则写入
equal
如果将要写入的像素的深度等于现在缓冲区内容的深度,则写入
not_equal
如果将要写入的像素的深度不等于现在缓冲区内容的深度,则写入
greater_equal
如果将要写入的像素的深度大于等于现在缓冲区内容的深度,则写入
greater
如果将要写入的像素的深度大于现在缓冲区内容的深度,则写入
默认值是 depth_func less_equal ,注意:当我们关闭深入缓冲检测的话,该函数无效。
·   depth_bias
无法理解。不会用。
·   alpha_rejection
对渲染管道的材质纹理进行alpha信息剪裁。 格式为 alpha_rejection compareFun value
其中value取值范围是0-255,例如 alpha_rejection less_equal 122 则代表抛弃渲染管道中alpha值大于等于122的象素。附注:考虑到硬件兼容,Value最好是0-128之间。
·   cull_hardware
硬件剪裁方式。 格式为 cull_hardware HCutFun
HCutFun枚举下列三种方式:clockwise / anticlockwise/ none
clockwise将逆时针的三角型都cut掉(即CUT镜头反面)
anticlockwise将顺时针的三角型都cut掉(即CUT镜头正面)
none 不做任何剪切。
默认为 clockwise
·   cull_software
软件剪裁方式。 格式为 cull_software SCutFun
SCutFun 枚举以下三种格式:back / front / none
实际上,这个和硬件裁减是类似的,不过,对于一些动态的物件建议不要开启该项,消耗很大。默认是 back 剪裁。
·   lighting
是否开启动态光照。 格式为 lighting on / off
注意:使用了顶点程序,此属性无效。动态光照一旦关闭,环境光反射,镜面反射光,放射光,阴影等属性均无效。默认为on
·   shading
Ogre阴影模式。 格式为 shading flat/ gouraud/ phong
Flat不进行插值,每个平面的阴影都由该平面的第一个顶点色决定。
Gouraud 对平面上每个顶点颜色进行线形插入计算。
Phong 全平面使用顶点法线向量。效果好,代价高,部份硬件无法支持此属性。
默认为 : gouraud
·   polygon_mode
栅格化方式。   格式为 polygon_mode solid/ wireframe/ points
面,线,点的栅格化。默认当然是面solid模式。
·   fog_override
是否开启雾化。 fog_override true/false
当fog_override true的时候就需要顺序跟出以下参数
雾的type: none 无雾。 相当于fog_override false
           Linear 线性雾。 从 start到end之间有雾
           Exp 几何方次性雾。 受浓度 density 影响
           Exp2 几何二次方增加。 受浓度 density 影响
雾的颜色 color: RGB三种颜色值。0.0-1.0之间
雾的浓度 density:设置几何方次性雾的浓度。对线形雾不影响,但也必须写上进行占位。
雾的起始位置 start :对非线性雾无效,但必须写上占位。
雾的结束位置 end : 对非线性雾无效,但必须写上占位。
例如:fog_override true exp 1 1 1 0.002 100 10000 开启几何次方雾。颜色为1,1,1白色,浓度为0.002(若是线性则代表,离镜头100至10000之间的距离有雾)
·   colour_write
是否关闭渲染通路的颜色写入功能。 colour_write on/off
该功能一旦关闭,则代表渲染通路不可输入任何的颜色渲染。仅在初期初始化深度缓冲区时个别时间有用。默认为开on
·   max_lights
此渲染通路最大光源数量。一般使用默认为8 格式为 max_lights 8
·   start_light
·   iteration
是否对渲染通路进行迭代渲染。 默认为仅渲染一次,格式为Iteration once
Iteration 5 代表本渲染通路将被重复执行5次渲染。
Iteration once per_light point 则代表本渲染通道将每个光源点进行一次渲染。
Iteration 5 per_light point则代表本渲染通道将每个光源点进行5次渲染。
·   point_size
·   point_sprites
·   point_size_attenuation
·   point_size_min
·   point_size_max
 
Texture_unit 纹理单元
我们在PASS渲染通道处已经进行了一次整体的渲染环境设置,然而,在每个纹理单元,我们还可以对单独的纹理进行渲染属性设置。
·   texture_alias
设置一个纹理的别名。类似于技术的别名。格式: texture_alias 纹理别名
默认该别名就是纹理单元的名字。
·   texture
本层要使用的静态纹理图象名字。可以简单的格式为
Texture xxx.jpg (注意:纹理文件名禁止有空格)也可对其属性进行详细的设置。如下
Texture xxx.jpg 2d 8 none PF_A8R8G8B8
2d是装载的纹理类型,类型实际上包括1d(1象素的纹理点),2d(纹理面,默认也是该项),3d(3D带深度的纹理),cubic(有些类似天空盒式的贴在立方体内侧6个2D纹理,但是仅可贴同一种纹理,不如使用cubic_texture)
8 是MipMap的层级,默认是unlinited,代表可以无限的对纹理进行mipmap,我们这里设置为8代表生成8个层级递减的MIPMAP。注意:若多个材质脚本中使用同一个纹理,切记他们的mipmap数量必须一致。
None 这项是我们指定的单独的透明通道做为alpha进行装载,默认的为 none,表示以红色作为alpha通道。
PF_A8R8G8B8纹理格式,常用的有PF_R5G6B5,PF_A4R4G4B4,PF_A8R8G8B8,PF_X8R8G8B8等。
·   anim_texture
与上面的texture对应,是用于活动的纹理层,即动态图象。注意,这里不是使用默认的保存好的.gif动画,而是导入多桢图,设置好桢之间的间隔时间。这里我们有两种方法。
一种是按照Ogre内部规定对动画的纹理命名:xxx_0.jpg xxx_1.jpg xxx_2.jpg这样以0为首,加下划线递增命名,这样我们调用时会比较方便,这样便可以了
Anim_texture xxx.jpg 3 2.2 即代表xxx_0.jpg这样命名的纹理有3张,间隔时间为2.2秒。
另一种是非标准的纹理命名,则需要我们如下写:
Anim_texture 1.jpg flame2.jpg xxx_3.png hit4.tga 2.2 直接以空格间隔标示逐个标示出每一桢的纹理即可。
注意:2.2是每桢间的间隔时间,若设置为0,则不会自动进行桢画面切换,需要我们代码中手工控制了。
·   cubic_texture
创建一个立方体纹理。这个一般用于反射映射和天空盒中。其格式和动态纹理一样,有两种方式,一种是Ogre制定的规范,我们调用就更加简单,如下
Cubic_texture skybox.jpg combinedUVW
我们仅提供一个基础的纹理名,此时OGRE会默认的去查找skybox_fr.jpg, skybox_bk.jpg, skybox_up.jpg, skybox_dn.jpg, skybox_lf.jpg, skybox_rt.jpg这些纹理。
第二中方式则是按照“前后上下左右”的顺序将这些纹理罗列出来。
最后一个参数需要设置为combinedUVW或separateUV, combinedUVW会将纹理组合到一个立方体纹理映射中,带有UVW三维纹理坐标,适合做反射映射。而separateUV仅仅保存2D的UV坐标,适用于天空盒。
·   tex_coord_set
因为一个Mesh网格允许有多套纹理坐标集,我们在这里设置使用哪套坐标集。格式为 tex_coord_set 3 (使用编号为3的坐标集)
默认为 tex_coord_set 0
·   tex_address_mode
纹理寻址模式。即当纹理UV值大于1.0时的纹理处理方法。参数有以下几种枚举选择:
Wrap 会将所有UV值大于1.0的值设置为0.0,纹理会被重复连续绘制。
Clamp 会将所有UV值大于1.0的值设置为1.0,这样的话就相当于在模糊边界。
Mirror 会当UV值等于1.0的时候,将纹理反转后连续绘制。
Border 超过1.0的UV都会被设置为边界色,就是描边效果。此项可设置tex_border_colour属性。
·   tex_border_colour
和上一属性对应,设置纹理边界色,仅对Border纹理寻址有效。
格式 : tex_border_colour RGBA(0.0 – 1.0取值)
·   filtering
纹理过滤形式:我们可以使用其预定的四种基本类型,包括
None 不进行纹理过滤
Bilinear 进行双线性纹理过滤。就是对mipmap进行挑选过滤,但是不对mipmap各个级别之间进行过滤
Trilinear 进行三线性纹理过滤。将最近的两个mipmap一起进行过滤。
Anisotropic 各向异性纹理过滤。使用该项,则你必须设置其max_anisotropy值。
默认为bilinear。
·   max_anisotropy
最大各相异性程度偏差值。根据硬件不同一般限制为8或者16
默认为 max_anisotropy 1
·   mipmap_bias
我们在Pass通道时已经允许设置mipmap纹理Lod运用层级以及适用的距离。在纹理单元这层级我们可以重新对其进行调整。格式为
Mipmap_bias -3 后面的整数代表在所有的范围内强制使用增大或缩小的mip级别。-3代表,在所有范围内强制使用更大3级的mip纹理。
默认是不进行层级偏移:mipmap_bias 0
·   colour_op
简单的纹理混合方式,我们可以使用预定义的4项枚举:
Replace 不处理,用当前的纹理直接替换掉后面的所有颜色。覆盖式。
Add 将当前纹理色和后面的渲染颜色进行加法处理。
Modulate 将当前纹理色和后面的渲染颜色进行乘法处理。
Alpha_blend 将当前纹理和后面的纹理进行alpha颜色混合。
默认为 colour_op modulate 当前纹理色和后面颜色进行乘法混合。
·   colour_op_ex
高级的纹理混合模式,可以详细的指定混合系数和效果,但个人不推荐使用。效率消耗较大,且受不用的硬件限制性大,使用默认支持的4种混合模式可以了。
·   colour_op_multipass_fallback
当上面一个colour_op_ex设置要求过高,硬件无法支持多纹理混合时,则不得不调用该项进行多通路混合渲染。若我们使用的是colour_op预设置的4种纹理混合模式,则无需在此处理,OGRE底层已经做了完善的处理。
·   alpha_op_ex
同colour_op_ex,不推荐使用。
·   env_map
设置环境映射效果。该项可以使用预定义的五个选项
Off 关闭环境映射反射。 默认即本项。
Spherical 开启球面环境映射。 它需要一个单独的纹理,该纹理进行周围反射的记录。
Cubic_reflection 开启平面环境映射。
·   scroll
静态纹理偏移。 个人感觉这个函数的存在意义完全是拿来弥补美术的小BUG。或者是个别情况下,事件响应时调用对纹理的修改?
格式如下:scroll x y
·   scroll_anim
动态纹理偏移。 ……针对上一功能的补足。给纹理层一个移动速度进行偏移。
格式为 scroll_anim xspeed yspeed
·   rotate
以固定角度静态旋转一个纹理。和scroll没什么区别。格式如下 rotate angle
注: angle是逆时针旋转的角度数
·   rotate_anim
动态旋转一个纹理。 格式为 rotate_anim 3 代表每秒旋转3次360度。
·   scale
静态缩放一个纹理。 格式为 scale x_scale y_scale。
·   wave_xform
制作类似于水面波纹性质的专用函数。可以制造出一个类似于波状的动态纹理变化形式。
格式: wave_xform <xform_type> <wave_type> <base> <frequency> <phase> <amplitude>
示例: wave_xform scale_x sine 1.0 0.2 0.0 5.0
xform_type
scroll_x
变动x滚动值
scroll_y
变动y滚动值
rotate
变动旋转值
scale_x
变动x比例值