《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所使用的纹理图片进行了重新指定。

你可能感兴趣的:(programming)