#### 3.1.12 Texture Aliases

Texture aliases are useful for when only the textures used in texture units need to be specified for a cloned material. In the source material i.e. the original material to be cloned, each texture unit can be given a texture alias name. The cloned material in the script can then specify what textures should be used for each texture alias. Note that texture aliases are a more specific version of Script Variables which can be used to easily set other values.

Using texture aliases within texture units:
Format:
texture_alias <name>

Default: <name> will default to texture_unit <name> if set

    texture_unit DiffuseTex
    {
      texture diffuse.jpg
    }

texture_alias defaults to DiffuseTex.

Example: The base material to be cloned:

    material TSNormalSpecMapping
    {
      technique GLSL
      {
        pass
        {
          ambient 0.1 0.1 0.1
          diffuse 0.7 0.7 0.7
          specular 0.7 0.7 0.7 128

          vertex_program_ref GLSLDemo/OffsetMappingVS
          {
            param_named_auto lightPosition light_position_object_space 0
            param_named_auto eyePosition camera_position_object_space
            param_named textureScale float 1.0
          }

          fragment_program_ref GLSLDemo/TSNormalSpecMappingFS
          {
            param_named normalMap int 0
            param_named diffuseMap int 1
            param_named fxMap int 2
          }

          // Normal map
          texture_unit NormalMap
          {
            texture defaultNM.png
            tex_coord_set 0
            filtering trilinear
          }

          // Base diffuse texture map
          texture_unit DiffuseMap
          {
            texture defaultDiff.png
            filtering trilinear
            tex_coord_set 1
          }

          // spec map for shininess
          texture_unit SpecMap
          {
            texture defaultSpec.png
            filtering trilinear
            tex_coord_set 2
          }

        }
      }

      technique HLSL_DX9
      {
        pass
        {

          vertex_program_ref FxMap_HLSL_VS
          {
            param_named_auto worldViewProj_matrix worldviewproj_matrix
            param_named_auto lightPosition light_position_object_space 0
            param_named_auto eyePosition camera_position_object_space
          }

          fragment_program_ref FxMap_HLSL_PS
          {
            param_named ambientColor float4 0.2 0.2 0.2 0.2
          }

          // Normal map
          texture_unit
          {
            texture_alias NormalMap
            texture defaultNM.png
            tex_coord_set 0
            filtering trilinear
          }

          // Base diffuse texture map
          texture_unit
          {
            texture_alias DiffuseMap
            texture defaultDiff.png
            filtering trilinear
            tex_coord_set 1
          }

          // spec map for shininess
          texture_unit
          {
            texture_alias SpecMap
            texture defaultSpec.png
            filtering trilinear
            tex_coord_set 2
          }

        }
      }
    }

Note that the GLSL and HLSL techniques use the same textures. For each texture usage type a texture alias is given that describes what the texture is used for. So the first texture unit in the GLSL technique has the same alias as the TUS in the HLSL technique since its the same texture used. Same goes for the second and third texture units.
For demonstration purposes, the GLSL technique makes use of texture_unit naming and therefore the texture_alias name does not have to be set since it defaults to the texture unit name. So why not use the default all the time since its less typing? For most situations you can. Its when you clone a material that and then want to change the alias that you must use the texture_alias command in the script. You cannot change the name of a texture_unit in a cloned material so texture_alias provides a facility to assign an alias name.

Now we want to clone the material but only want to change the textures used. We could copy and paste the whole material but if we decide to change the base material later then we also have to update the copied material in the script. With set_texture_alias, copying a material is very easy now. set_texture_alias is specified at the top of the material definition. All techniques using the specified texture alias will be effected by set_texture_alias.

Format:
set_texture_alias <alias name> <texture name>

    material fxTest : TSNormalSpecMapping
    {
      set_texture_alias NormalMap fxTestNMap.png
      set_texture_alias DiffuseMap fxTestDiff.png
      set_texture_alias SpecMap fxTestMap.png
    }

The textures in both techniques in the child material will automatically get replaced with the new ones we want to use.

The same process can be done in code as long you set up the texture alias names so then there is no need to traverse technique/pass/TUS to change a texture. You just call myMaterialPtr->applyTextureAliases(myAliasTextureNameList) which will update all textures in all texture units that match the alias names in the map container reference you passed as a parameter.

You don’t have to supply all the textures in the copied material.

    material fxTest2 : fxTest
    {
      set_texture_alias DiffuseMap fxTest2Diff.png
      set_texture_alias SpecMap fxTest2Map.png
    }

Material fxTest2 only changes the diffuse and spec maps of material fxTest and uses the same normal map.

Another example:

    material fxTest3 : TSNormalSpecMapping
    {
      set_texture_alias DiffuseMap fxTest2Diff.png
    }

fxTest3 will end up with the default textures for the normal map and spec map setup in TSNormalSpecMapping material but will have a different diffuse map. So your base material can define the default textures to use and then the child materials can override specific textures.