《Pro Ogre 3D Programming》 读书笔记 之 第六章 材质 材质复制 (转)
材质复制
如果新的脚本只是对某个已经存在的脚本进行小部分的变化,那么可进行从旧脚本复制,而不是C&P。新材质可以修改特定technique,pass,texture,或是添加新项。
格式: material <NewUniqueChildName> : <ReferanceParentMaterial>
当材质脚本被加载到ogre中,这种继承关系不再维系,假如父材质在运行时被修改,不会影响到子材质。如果在一个technique中有5个pass,而我们只想修改第5个pass,我们可以用pass指定或是它的索引(从0计)
meterial test2: test1
{
technique 0
{
pass 4
{
ambient 0.5 0.7 0.3 1.0
}
}
}
加入一个新的technique或pass到material中,可以通过赋于它们新的名称来实现,新名称必须在父材质中没有出现过。指定新索引也一样。新technique或pass会被加载到父材质相应technique或pass末尾.
material BumpMap2 : BumpMap1
{
technique ati8500
{
pass 0
{
texture_unit NormalMap
{
texture BumpyMetalNM.png
}
}
}
}
在上面的例子中,如果texture_unit的名称NormalMap在父材质中指定过,那么现在的行为表示override,如果它是一个新的名字,那么表示在pass的最后新加一个texture unit。
纹理别名
在源材质被clone时,每个texture unit可以被赋于一个Texture alias(别名)。可以用这个别名来指定使用什么纹理。格式: texture_alias <name> 缺省: texutre_unit <name>( 纹理单元的名字)
texture_unit DiffuseTex
{
texture diffuse.jpg
}
在这种情况下,texture_alias为DiffuseTex.
material TSNormalSpecMapping
{
technique GLSL
{
pass
{
texture_unit NormalMap
{
texture defaultNM.png
tex_coord_set 0
filtering trilinear
}
texture_unit DiffuseMap
{
texture defaultDiff.png
filtering trilinear
tex_coord_set 1
}
texture_unit SpecMap
{
texture defaultSpec.png
filtering trilinear
tex_coord_set 2
}
}
}
technique HLSL_DX9
{
pass
{
texture_unit
{
texture_alias NormalMap
texture defaultNM.png
tex_coord_set 0
filtering trilinear
}
texture_unit
{
texture_alias DiffuseMap
texture defaultDiff.png
filtering trilinear
tex_coord_set 1
}
texture_unit
{
texture_alias SpecMap
texture defaultSpec.png
filtering trilinear
tex_coord_set 2
}
}
}
}
例子中有两个技术,都使用相同的纹理,第一个技术使用缺省的方式定义了纹理别名,第二个技术显式地指定纹理别名。两者都有相对应的同样的纹理别名。如果想定义一个材质只是想使用不同的纹理,那么copy父材质时可以使用set_texture_alias来重新指定新纹理。
material fxTest : TSNormalSpecMapping
{
set_texture_alias NormalMap fxTestNMap.png
set_texture_alias DiffuseMap fxTestDiff.png
set_texture_alias SpecMap fxTestMap.png
}
上面代码就对拥有指定别名的texture unit所使用的纹理图片进行了重新指定。