标签: ogrematerialogre材质it |
分类: 游戏编程 |
Ogre的材质(Material)
为了优化渲染,必须把渲染状态的变化减小到最小,而最频繁的渲染状态改变是材料的变化(大多数是纹理的变化)。
Ogre的Material类封装了物体的所有材料属性,类似于3D Studio中的material的概念,平时不被认为是属于材料的属性,像Culling模式和深度缓存设置等等,也被Material包含进来,因为这些属性同样影响了物体的外观,把他它们放到Material类里可以集中设置所有影响物体的属性。这和D3D中只保存颜色组件而没有纹理映射的Material有明显的不同。Ogre的Material可以被认为是Shader的等同物。
Material类包括以下几类属性:
1. 基本的表面材质属性,如不同的颜色反射率,Shininess等等;
2. 组成Material的纹理层
3. 纹理之间的混合(blend)方式
4. 深度缓冲设置
5. Culling模式
6. 纹理过滤方式(三线性过滤,双线性过滤);
7. 是否受光照影响
8. Shading选项
9. 雾化
其中2的纹理层可以有多个,Ogre在Material类的内部定义了TextureLayer类
一个纹理层可以是一副静止的图像,也可以是一副以某种方式运动的图像,还可以使由多幅图像组成的动画。它可以实现多种纹理特效,如BUMPMAP、纹理贴图、运动的纹理。
MaterialManager类负责管理Material库,和材质相关的类图如下:
MaterialManager还负责分析Material脚本(Material Script),从而初始化Material的属性。
Ogre提供的材质脚本可以帮助开发者简单的设置又酷又炫的材质特效,而不用重新编译。当然也可以使用Material和TextureLayer类提供的诸多成员函数来做到,但这样明显是不实用的。
Ogre材质脚本的默认扩展名为.material,你也可以通过MaterialManager类的parseAllSources方法来规定新的扩展名。系统初始化时会自动所有的额材质脚本文件,并设置材质的属性。注意,这里面只设置了材质的属性,并不会将材质的纹理调入内存,因为那样会招致加大的内存消耗。
Ambient 设置材质的环境光反射属性
格式:ambient <red><green><blue>
正确的参数在0.0到1.0之间取值,直接影响物体材质对环境光反射能力,默认值为白色(1.0 1.0 1.0)
Diffuse 设置材质的漫反射属性
格式:specular <red><green><blue>
正确的颜色参数在0.0和1.0之间取值,shininess属性可以是任何正数,直接影响物体材质的镜面反射属性。默认值为镜面反射(0.0 0.0 0.0 0.0)
Specular 设置材质的镜面反射属性
格式: specular <red> <green> <blue> <shininess>
正确的颜色参数在0.0 和1.0 之间取值,shininess 属性可以是任何正数。直接影响物体材质
的镜面反射属性。默认值为无镜面反射(0.0 0.0 0.0 0.0)。
Emissive 设置材质本身的发光程度
格式:emmissive<red><green><blue>
正确的颜色参数在0.0到1.0之间取值,如果一个物体会自发光,他将不需要外界的照明,但是,值得注意的是这不表明这个物体会成为一个光源:它只会照亮自己。默认是黑色(0.0 0.0 0.0)
Scene_blend 设置与场景的混合方式,有两种形式
1. scene_blend<add|modulate|alpha_blend>
这个格式比较简单常用
Add——渲染的结果将被以相加的方式加入到场景之中,与Scene_blend one one 等价,对爆炸,火焰,光照,幽灵等效果比较好。
Modulate——渲染的结果与场景相乘。对烟、玻璃杯和单个的透明效果很好。与scene_blend src_color one_minus_src_colour等价
Alpha_blend——渲染结果中的Alpha成员将被用作遮罩,与scene_blend src_alpha one_minus_src_alpha等价
2. scene_blend<src_factor><dest_factor>
这个格式比较麻烦,但是比较完善。结果的计算公式为(texture*sourceFactor)+(scene_pixel*destFactor)其中sourceFactor和destFactor如下:
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(不透明)
3. cull_hardware 设置硬件cull模式
格式:cull_hardware<clockwise|anticlockwise|none>
默认顺时针Cull,这与OpenGL的默认是一样的,但是和D3D的默认相反,(因为Ogre用的是OpenGL采用的右手坐标系)
4. cull_software 设置软件cull模式
格式:cull_softwate<back|front|none>
默认背面。相当于硬件cull模式的顺时针
5. lighting 光照
设置动态光照是否为此材质打开。如果关掉,将使得材质本身的所有ambient,diffuse,specular,emissive和shading属性无效,仅仅与外界的光照有关。
格式:lighting<on|off>
默认:lighting on
6. shading阴影模式
格式:shading<flat|gouraud|phong>
Flat——每个表面仅仅用一个颜色填充
Gouraud——线性过渡表面颜色
Phong——并非所有的硬件都支持,这种模式测定每一个顶点的颜色。
默认:shading gouraud
7. filtering 设置纹理过滤方式
格式:filtering<none|nilinear|trilinear>
默认是双线性的(bilinear)
8. Texture Layer专用属性
1) Texture 设置纹理要使用的图名
格式:texture<texturename>
无默认值,必须指定一个纹理名
2)anim_texture 动画纹理
设置动画纹理使用图片文件名
格式1(短的)anim_texture<base_name><num_frames><duration>
指定一个图片名称,以这个名称后缀_1、_2一直到_num(由num_frames指定),duration指定间隔时间。
格式2(长的):anim_texture<frame1><frame2>…<duration>
一个一个指定图片名称,duration指定间隔时间