#### 3.1.9 Using Vertex/Geometry/Fragment Programs in a Pass

Within a pass section of a material script, you can reference a vertex, geometry and / or a fragment program which is been defined in a .program script (See Declaring Vertex/Geometry/Fragment Programs). The programs are defined separately from the usage of them in the pass, since the programs are very likely to be reused between many separate materials, probably across many different .material scripts, so this approach lets you define the program only once and use it many times.

As well as naming the program in question, you can also provide parameters to it. Here’s a simple example:

    vertex_program_ref myVertexProgram
    {
    	param_indexed_auto 0 worldviewproj_matrix
    	param_indexed      4 float4  10.0 0 0 0
    }

In this example, we bind a vertex program called ’myVertexProgram’ (which will be defined elsewhere) to the pass, and give it 2 parameters, one is an ’auto’ parameter, meaning we do not have to supply a value as such, just a recognised code (in this case it’s the world/view/projection matrix which is kept up to date automatically by Ogre). The second parameter is a manually specified parameter, a 4-element float. The indexes are described later.

The syntax of the link to a vertex program and a fragment or geometry program are identical, the only difference is that ’fragment_program_ref’ and ’geometry_program_ref’ are used respectively instead of ’vertex_program_ref’.

For many situations vertex, geometry and fragment programs are associated with each other in a pass but this is not cast in stone. You could have a vertex program that can be used by several different fragment programs. Another situation that arises is that you can mix fixed pipeline and programmable pipeline (shaders) together. You could use the non-programmable vertex fixed function pipeline and then provide a fragment_program_ref in a pass i.e. there would be no vertex_program_ref section in the pass. The fragment program referenced in the pass must meet the requirements as defined in the related API in order to read from the outputs of the vertex fixed pipeline. You could also just have a vertex program that outputs to the fragment fixed function pipeline.

The requirements to read from or write to the fixed function pipeline are similar between rendering API’s (DirectX and OpenGL) but how its actually done in each type of shader (vertex, geometry or fragment) depends on the shader language. For HLSL (DirectX API) and associated asm consult MSDN at http://msdn.microsoft.com/library/. For GLSL (OpenGL), consult section 7.6 of the GLSL spec 1.1 available at http://www.opengl.org/registry/. The built in varying variables provided in GLSL allow your program to read/write to the fixed function pipeline varyings. For Cg consult the Language Profiles section in CgUsersManual.pdf that comes with the Cg Toolkit available at https://developer.nvidia.com/cg-toolkit. For HLSL and Cg its the varying bindings that allow your shader programs to read/write to the fixed function pipeline varyings.

#### Parameter specification

Parameters can be specified using one of 4 commands as shown below. The same syntax is used whether you are defining a parameter just for this particular use of the program, or when specifying the Default Program Parameters. Parameters set in the specific use of the program override the defaults.

- param_indexed
- param_indexed_auto
- param_named
- param_named_auto
- shared_params_ref

#### param_indexed

This command sets the value of an indexed parameter.

format: param_indexed <index> <type> <value>
example: param_indexed 0 float4 10.0 0 0 0

The ’index’ is simply a number representing the position in the parameter list which the value should be written, and you should derive this from your program definition. The index is relative to the way constants are stored on the card, which is in 4-element blocks. For example if you defined a float4 parameter at index 0, the next index would be 1. If you defined a matrix4x4 at index 0, the next usable index would be 4, since a 4x4 matrix takes up 4 indexes.

The value of ’type’ can be float4, matrix4x4, float<n>, int4, int<n>. Note that ’int’ parameters are only available on some more advanced program syntaxes, check the D3D or GL vertex / fragment program documentation for full details. Typically the most useful ones will be float4 and matrix4x4. Note that if you use a type which is not a multiple of 4, then the remaining values up to the multiple of 4 will be filled with zeroes for you (since GPUs always use banks of 4 floats per constant even if only one is used).

’value’ is simply a space or tab-delimited list of values which can be converted into the type you have specified.

#### param_indexed_auto

This command tells Ogre to automatically update a given parameter with a derived value. This frees you from writing code to update program parameters every frame when they are always changing.

format: param_indexed_auto <index> <value_code> <extra_params>
example: param_indexed_auto 0 worldviewproj_matrix

’index’ has the same meaning as param_indexed; note this time you do not have to specify the size of the parameter because the engine knows this already. In the example, the world/view/projection matrix is being used so this is implicitly a matrix4x4.

’value_code’ is one of a list of recognised values:

world_matrix

  The current world matrix.

inverse_world_matrix

  The inverse of the current world matrix.

transpose_world_matrix

  The transpose of the world matrix

inverse_transpose_world_matrix

  The inverse transpose of the world matrix

world_matrix_array_3x4

  An array of world matrices, each represented as only a 3x4 matrix (3 rows of 4columns) usually for doing hardware skinning. You should make enough entries available in your vertex program for the number of bones in use, i.e. an array of numBones*3 float4’s.

view_matrix

  The current view matrix.

inverse_view_matrix

  The inverse of the current view matrix.

transpose_view_matrix

  The transpose of the view matrix

inverse_transpose_view_matrix

  The inverse transpose of the view matrix

projection_matrix

  The current projection matrix.

inverse_projection_matrix

  The inverse of the projection matrix

transpose_projection_matrix

  The transpose of the projection matrix

inverse_transpose_projection_matrix

  The inverse transpose of the projection matrix

worldview_matrix

  The current world and view matrices concatenated.

inverse_worldview_matrix

  The inverse of the current concatenated world and view matrices.

transpose_worldview_matrix

  The transpose of the world and view matrices

inverse_transpose_worldview_matrix

  The inverse transpose of the current concatenated world and view matrices.

viewproj_matrix

  The current view and projection matrices concatenated.

inverse_viewproj_matrix

  The inverse of the view & projection matrices

transpose_viewproj_matrix

  The transpose of the view & projection matrices

inverse_transpose_viewproj_matrix

  The inverse transpose of the view & projection matrices

worldviewproj_matrix

  The current world, view and projection matrices concatenated.

inverse_worldviewproj_matrix

  The inverse of the world, view and projection matrices

transpose_worldviewproj_matrix

  The transpose of the world, view and projection matrices

inverse_transpose_worldviewproj_matrix

  The inverse transpose of the world, view and projection matrices

texture_matrix

  The transform matrix of a given texture unit, as it would usually be seen in the fixed-function pipeline. This requires an index in the ’extra_params’ field, and relates to the ’nth’ texture unit of the pass in question. NB if the given index exceeds the number of texture units available for this pass, then the parameter will be set to Matrix4::IDENTITY.

render_target_flipping

  The value use to adjust transformed y position if bypassed projection matrix transform. It’s -1 if the render target requires texture flipping, +1 otherwise.

vertex_winding

  Indicates what vertex winding mode the render state is in at this point; +1 for standard, -1 for inverted (e.g. when processing reflections).

light_diffuse_colour

  The diffuse colour of a given light; this requires an index in the ’extra_params’ field, and relates to the ’nth’ closest light which could affect this object (i.e. 0 refers to the closest light - note that directional lights are always first in the list and always present). NB if there are no lights this close, then the parameter will be set to black.

light_specular_colour

  The specular colour of a given light; this requires an index in the ’extra_params’ field, and relates to the ’nth’ closest light which could affect this object (i.e. 0 refers to the closest light). NB if there are no lights this close, then the parameter will be set to black.

light_attenuation

  A float4 containing the 4 light attenuation variables for a given light. This requires an index in the ’extra_params’ field, and relates to the ’nth’ closest light which could affect this object (i.e. 0 refers to the closest light). NB if there are no lights this close, then the parameter will be set to all zeroes. The order of the parameters is range, constant attenuation, linear attenuation, quadric attenuation.

spotlight_params

  A float4 containing the 3 spotlight parameters and a control value. The order of the parameters is cos(inner angle /2 ), cos(outer angle / 2), falloff, and the final w value is 1.0f. For non-spotlights the value is float4(1,0,0,1). This requires an index in the ’extra_params’ field, and relates to the ’nth’ closest light which could affect this object (i.e. 0 refers to the closest light). If there are less lights than this, the details are like a non-spotlight.

light_position

  The position of a given light in world space. This requires an index in the ’extra_params’ field, and relates to the ’nth’ closest light which could affect this object (i.e. 0 refers to the closest light). NB if there are no lights this close, then the parameter will be set to all zeroes. Note that this property will work with all kinds of lights, even directional lights, since the parameter is set as a 4D vector. Point lights will be (pos.x, pos.y, pos.z, 1.0f) whilst directional lights will be (-dir.x, -dir.y, -dir.z, 0.0f). Operations like dot products will work consistently on both.

light_direction

  The direction of a given light in world space. This requires an index in the ’extra_params’ field, and relates to the ’nth’ closest light which could affect this object (i.e. 0 refers to the closest light). NB if there are no lights this close, then the parameter will be set to all zeroes. DEPRECATED - this property only works on directional lights, and we recommend that you use light_position instead since that returns a generic 4D vector.

light_position_object_space

  The position of a given light in object space (i.e. when the object is at (0,0,0)). This requires an index in the ’extra_params’ field, and relates to the ’nth’ closest light which could affect this object (i.e. 0 refers to the closest light). NB if there are no lights this close, then the parameter will be set to all zeroes. Note that this property will work with all kinds of lights, even directional lights, since the parameter is set as a 4D vector. Point lights will be (pos.x, pos.y, pos.z, 1.0f) whilst directional lights will be (-dir.x, -dir.y, -dir.z, 0.0f). Operations like dot products will work consistently on both.

light_direction_object_space

  The direction of a given light in object space (i.e. when the object is at (0,0,0)). This requires an index in the ’extra_params’ field, and relates to the ’nth’ closest light which could affect this object (i.e. 0 refers to the closest light). NB if there are no lights this close, then the parameter will be set to all zeroes. DEPRECATED, except for spotlights - for directional lights we recommend that you use light_position_object_space instead since that returns a generic 4D vector.

light_distance_object_space

  The distance of a given light from the center of the object - this is a useful approximation to per-vertex distance calculations for relatively small objects. This requires an index in the ’extra_params’ field, and relates to the ’nth’ closest light which could affect this object (i.e. 0 refers to the closest light). NB if there are no lights this close, then the parameter will be set to all zeroes.

light_position_view_space

  The position of a given light in view space (i.e. when the camera is at (0,0,0)). This requires an index in the ’extra_params’ field, and relates to the ’nth’ closest light which could affect this object (i.e. 0 refers to the closest light). NB if there are no lights this close, then the parameter will be set to all zeroes. Note that this property will work with all kinds of lights, even directional lights, since the parameter is set as a 4D vector. Point lights will be (pos.x, pos.y, pos.z, 1.0f) whilst directional lights will be (-dir.x, -dir.y, -dir.z, 0.0f). Operations like dot products will work consistently on both.

light_direction_view_space

  The direction of a given light in view space (i.e. when the camera is at (0,0,0)). This requires an index in the ’extra_params’ field, and relates to the ’nth’ closest light which could affect this object (i.e. 0 refers to the closest light). NB if there are no lights this close, then the parameter will be set to all zeroes. DEPRECATED, except for spotlights - for directional lights we recommend that you use light_position_view_space instead since that returns a generic 4D vector.

light_power

  The ’power’ scaling for a given light, useful in HDR rendering. This requires an index in the ’extra_params’ field, and relates to the ’nth’ closest light which could affect this object (i.e. 0 refers to the closest light).

light_diffuse_colour_power_scaled

  As light_diffuse_colour, except the RGB channels of the passed colour have been pre-scaled by the light’s power scaling as given by light_power.

light_specular_colour_power_scaled

  As light_specular_colour, except the RGB channels of the passed colour have been pre-scaled by the light’s power scaling as given by light_power.

light_number

  When rendering, there is generally a list of lights available for use by all of the passes for a given object, and those lights may or may not be referenced in one or more passes. Sometimes it can be useful to know where in that overall list a given light light (as seen from a pass) is. For example if you use iterate once_per_light, the pass always sees the light as index 0, but in each iteration the actual light referenced is different. This binding lets you pass through the actual index of the light in that overall list. You just need to give it a parameter of the pass-relative light number and it will map it to the overall list index.

light_diffuse_colour_array

  As light_diffuse_colour, except that this populates an array of parameters with a number of lights, and the ’extra_params’ field refers to the number of ’nth closest’ lights to be processed. This parameter is not compatible with light-based pass_iteration options but can be used for single-pass lighting.

light_specular_colour_array

  As light_specular_colour, except that this populates an array of parameters with a number of lights, and the ’extra_params’ field refers to the number of ’nth closest’ lights to be processed. This parameter is not compatible with light-based pass_iteration options but can be used for single-pass lighting.

light_diffuse_colour_power_scaled_array

  As light_diffuse_colour_power_scaled, except that this populates an array of parameters with a number of lights, and the ’extra_params’ field refers to the number of ’nth closest’ lights to be processed. This parameter is not compatible with light-based pass_iteration options but can be used for single-pass lighting.

light_specular_colour_power_scaled_array

  As light_specular_colour_power_scaled, except that this populates an array of parameters with a number of lights, and the ’extra_params’ field refers to the number of ’nth closest’ lights to be processed. This parameter is not compatible with light-based pass_iteration options but can be used for single-pass lighting.

light_attenuation_array

  As light_attenuation, except that this populates an array of parameters with a number of lights, and the ’extra_params’ field refers to the number of ’nth closest’ lights to be processed. This parameter is not compatible with light-based pass_iteration options but can be used for single-pass lighting.

spotlight_params_array

  As spotlight_params, except that this populates an array of parameters with a number of lights, and the ’extra_params’ field refers to the number of ’nth closest’ lights to be processed. This parameter is not compatible with light-based pass_iteration options but can be used for single-pass lighting.

light_position_array

  As light_position, except that this populates an array of parameters with a number of lights, and the ’extra_params’ field refers to the number of ’nth closest’ lights to be processed. This parameter is not compatible with light-based pass_iteration options but can be used for single-pass lighting.

light_direction_array

  As light_direction, except that this populates an array of parameters with a number of lights, and the ’extra_params’ field refers to the number of ’nth closest’ lights to be processed. This parameter is not compatible with light-based pass_iteration options but can be used for single-pass lighting.

light_position_object_space_array

  As light_position_object_space, except that this populates an array of parameters with a number of lights, and the ’extra_params’ field refers to the number of ’nth closest’ lights to be processed. This parameter is not compatible with light-based pass_iteration options but can be used for single-pass lighting.

light_direction_object_space_array

  As light_direction_object_space, except that this populates an array of parameters with a number of lights, and the ’extra_params’ field refers to the number of ’nth closest’ lights to be processed. This parameter is not compatible with light-based pass_iteration options but can be used for single-pass lighting.

light_distance_object_space_array

  As light_distance_object_space, except that this populates an array of parameters with a number of lights, and the ’extra_params’ field refers to the number of ’nth closest’ lights to be processed. This parameter is not compatible with light-based pass_iteration options but can be used for single-pass lighting.

light_position_view_space_array

  As light_position_view_space, except that this populates an array of parameters with a number of lights, and the ’extra_params’ field refers to the number of ’nth closest’ lights to be processed. This parameter is not compatible with light-based pass_iteration options but can be used for single-pass lighting.

light_direction_view_space_array

  As light_direction_view_space, except that this populates an array of parameters with a number of lights, and the ’extra_params’ field refers to the number of ’nth closest’ lights to be processed. This parameter is not compatible with light-based pass_iteration options but can be used for single-pass lighting.

light_power_array

  As light_power, except that this populates an array of parameters with a number of lights, and the ’extra_params’ field refers to the number of ’nth closest’ lights to be processed. This parameter is not compatible with light-based pass_iteration options but can be used for single-pass lighting.

light_count

  The total number of lights active in this pass.

light_casts_shadows

  Sets an integer parameter to 1 if the given light casts shadows, 0 otherwise, Requires a light index parameter.

ambient_light_colour

  The colour of the ambient light currently set in the scene.

surface_ambient_colour

  The ambient colour reflectance properties of the pass (See ambient). This allows you access to fixed-function pipeline property handily.

surface_diffuse_colour

  The diffuse colour reflectance properties of the pass (See diffuse). This allows you access to fixed-function pipeline property handily.

surface_specular_colour

  The specular colour reflectance properties of the pass (See specular). This allows you access to fixed-function pipeline property handily.

surface_emissive_colour

  The amount of self-illumination of the pass (See emissive). This allows you access to fixed-function pipeline property handily.

surface_shininess

  The shininess of the pass, affecting the size of specular highlights (See specular). This allows you bind to fixed-function pipeline property handily.

derived_ambient_light_colour

  The derived ambient light colour, with ’r’, ’g’, ’b’ components filled with product of surface_ambient_colour and ambient_light_colour, respectively, and ’a’ component filled with surface ambient alpha component.

derived_scene_colour

  The derived scene colour, with ’r’, ’g’ and ’b’ components filled with sum of derived_ambient_light_colour and surface_emissive_colour, respectively, and ’a’ component filled with surface diffuse alpha component.

derived_light_diffuse_colour

  The derived light diffuse colour, with ’r’, ’g’ and ’b’ components filled with product of surface_diffuse_colour, light_diffuse_colour and light_power, respectively, and ’a’ component filled with surface diffuse alpha component. This requires an index in the ’extra_params’ field, and relates to the ’nth’ closest light which could affect this object (i.e. 0 refers to the closest light).

derived_light_specular_colour

  The derived light specular colour, with ’r’, ’g’ and ’b’ components filled with product of surface_specular_colour and light_specular_colour, respectively, and ’a’ component filled with surface specular alpha component. This requires an index in the ’extra_params’ field, and relates to the ’nth’ closest light which could affect this object (i.e. 0 refers to the closest light).

derived_light_diffuse_colour_array

  As derived_light_diffuse_colour, except that this populates an array of parameters with a number of lights, and the ’extra_params’ field refers to the number of ’nth closest’ lights to be processed. This parameter is not compatible with light-based pass_iteration options but can be used for single-pass lighting.

derived_light_specular_colour_array

  As derived_light_specular_colour, except that this populates an array of parameters with a number of lights, and the ’extra_params’ field refers to the number of ’nth closest’ lights to be processed. This parameter is not compatible with light-based pass_iteration options but can be used for single-pass lighting.

fog_colour

  The colour of the fog currently set in the scene.

fog_params

  The parameters of the fog currently set in the scene. Packed as (exp_density, linear_start, linear_end, 1.0 / (linear_end - linear_start)).

camera_position

  The current cameras position in world space.

camera_position_object_space

  The current cameras position in object space (i.e. when the object is at (0,0,0)).

lod_camera_position

  The current LOD camera position in world space. A LOD camera is a separate camera associated with the rendering camera which allows LOD calculations to be calculated separately. The classic example is basing the LOD of the shadow texture render on the position of the main camera, not the shadow camera.

lod_camera_position_object_space

  The current LOD camera position in object space (i.e. when the object is at (0,0,0)).

time

  The current time, factored by the optional parameter (or 1.0f if not supplied).

time_0_x

  Single float time value, which repeats itself based on "cycle time" given as an ’extra_params’ field

costime_0_x

  Cosine of time_0_x

sintime_0_x

  Sine of time_0_x

tantime_0_x

  Tangent of time_0_x

time_0_x_packed

  4-element vector of time0_x, sintime0_x, costime0_x, tantime0_x

time_0_1

  As time0_x but scaled to [0..1]

costime_0_1

  As costime0_x but scaled to [0..1]

sintime_0_1

  As sintime0_x but scaled to [0..1]

tantime_0_1

  As tantime0_x but scaled to [0..1]

time_0_1_packed

  As time0_x_packed but all values scaled to [0..1]

time_0_2pi

  As time0_x but scaled to [0..2*Pi]

costime_0_2pi

  As costime0_x but scaled to [0..2*Pi]

sintime_0_2pi

  As sintime0_x but scaled to [0..2*Pi]

tantime_0_2pi

  As tantime0_x but scaled to [0..2*Pi]

time_0_2pi_packed

  As time0_x_packed but scaled to [0..2*Pi]

frame_time

  The current frame time, factored by the optional parameter (or 1.0f if not supplied).

fps

  The current frames per second

viewport_width

  The current viewport width in pixels

viewport_height

  The current viewport height in pixels

inverse_viewport_width

  1.0/the current viewport width in pixels

inverse_viewport_height

  1.0/the current viewport height in pixels

viewport_size

  4-element vector of viewport_width, viewport_height, inverse_viewport_width, inverse_viewport_height

texel_offsets

  Provides details of the rendersystem-specific texture coordinate offsets required to map texels onto pixels. float4(horizontalOffset, verticalOffset, horizontalOffset / viewport_width, verticalOffset / viewport_height).

view_direction

  View direction vector in object space

view_side_vector

  View local X axis

view_up_vector

  View local Y axis

fov

  Vertical field of view, in radians

near_clip_distance

  Near clip distance, in world units

far_clip_distance

  Far clip distance, in world units (may be 0 for infinite view projection)

texture_viewproj_matrix

  Applicable to vertex programs which have been specified as the ’shadow receiver’ vertex program alternative, or where a texture unit is marked as content_type shadow; this provides details of the view/projection matrix for the current shadow projector. The optional ’extra_params’ entry specifies which light the projector refers to (for the case of content_type shadow where more than one shadow texture may be present in a single pass), where 0 is the default and refers to the first light referenced in this pass.

texture_viewproj_matrix_array

  As texture_viewproj_matrix, except an array of matrices is passed, up to the number that you specify as the ’extra_params’ value.

texture_worldviewproj_matrix

  As texture_viewproj_matrix except it also includes the world matrix.

texture_worldviewproj_matrix_array

  As texture_worldviewproj_matrix, except an array of matrices is passed, up to the number that you specify as the ’extra_params’ value.

spotlight_viewproj_matrix

  Provides a view / projection matrix which matches the set up of a given spotlight (requires an ’extra_params’ entry to indicate the light index, which must be a spotlight). Can be used to project a texture from a given spotlight.

spotlight_viewproj_matrix_array

  As spotlight_viewproj_matrix, except an array of matrices is passed, up to the number that you specify as the ’extra_params’ value.

spotlight_worldviewproj_matrix

  As spotlight_viewproj_matrix except it also includes the world matrix.

scene_depth_range

  Provides information about the depth range as viewed from the current camera being used to render. Provided as float4(minDepth, maxDepth, depthRange, 1 / depthRange).

shadow_scene_depth_range

  Provides information about the depth range as viewed from the shadow camera relating to a selected light. Requires a light index parameter. Provided as float4(minDepth, maxDepth, depthRange, 1 / depthRange).

shadow_colour

  The shadow colour (for modulative shadows) as set via SceneManager::setShadowColour.

shadow_extrusion_distance

  The shadow extrusion distance as determined by the range of a non-directional light or set via SceneManager::setShadowDirectionalLightExtrusionDistance for directional lights.

texture_size

  Provides texture size of the selected texture unit. Requires a texture unit index parameter. Provided as float4(width, height, depth, 1). For 2D-texture, depth sets to 1, for 1D-texture, height and depth sets to 1.

inverse_texture_size

  Provides inverse texture size of the selected texture unit. Requires a texture unit index parameter. Provided as float4(1 / width, 1 / height, 1 / depth, 1). For 2D-texture, depth sets to 1, for 1D-texture, height and depth sets to 1.

packed_texture_size

  Provides packed texture size of the selected texture unit. Requires a texture unit index parameter. Provided as float4(width, height, 1 / width, 1 / height). For 3D-texture, depth is ignored, for 1D-texture, height sets to 1.

pass_number

  Sets the active pass index number in a gpu parameter. The first pass in a technique has an index of 0, the second an index of 1 and so on. This is useful for multipass shaders (i.e. fur or blur shader) that need to know what pass it is. By setting up the auto parameter in a Default Program Parameters list in a program definition, there is no requirement to set the pass number parameter in each pass and lose track. (See fur_example)

pass_iteration_number

  Useful for GPU programs that need to know what the current pass iteration number is. The first iteration of a pass is numbered 0. The last iteration number is one less than what is set for the pass iteration number. If a pass has its iteration attribute set to 5 then the last iteration number (5th execution of the pass) is 4.(See iteration)

animation_parametric

  Useful for hardware vertex animation. For morph animation, sets the parametric value (0..1) representing the distance between the first position keyframe (bound to positions) and the second position keyframe (bound to the first free texture coordinate) so that the vertex program can interpolate between them. For pose animation, indicates a group of up to 4 parametric weight values applying to a sequence of up to 4 poses (each one bound to x, y, z and w of the constant), one for each pose. The original positions are held in the usual position buffer, and the offsets to take those positions to the pose where weight == 1.0 are in the first ’n’ free texture coordinates; ’n’ being determined by the value passed to includes_pose_animation. If more than 4 simultaneous poses are required, then you’ll need more than 1 shader constant to hold the parametric values, in which case you should use this binding more than once, referencing a different constant entry; the second one will contain the parametrics for poses 5-8, the third for poses 9-12, and so on.

custom

  This allows you to map a custom parameter on an individual Renderable (see Renderable::setCustomParameter) to a parameter on a GPU program. It requires that you complete the ’extra_params’ field with the index that was used in the Renderable::setCustomParameter call, and this will ensure that whenever this Renderable is used, it will have it’s custom parameter mapped in. It’s very important that this parameter has been defined on all Renderables that are assigned the material that contains this automatic mapping, otherwise the process will fail.

#### param_named

This is the same as param_indexed, but uses a named parameter instead of an index. This can only be used with high-level programs which include parameter names; if you’re using an assembler program then you have no choice but to use indexes. Note that you can use indexed parameters for high-level programs too, but it is less portable since if you reorder your parameters in the high-level program the indexes will change.
format: param_named <name> <type> <value>
example: param_named shininess float4 10.0 0 0 0
The type is required because the program is not compiled and loaded when the material script is parsed, so at this stage we have no idea what types the parameters are. Programs are only loaded and compiled when they are used, to save memory.

#### param_named_auto

This is the named equivalent of param_indexed_auto, for use with high-level programs.
Format: param_named_auto <name> <value_code> <extra_params>
Example: param_named_auto worldViewProj WORLDVIEWPROJ_MATRIX

The allowed value codes and the meaning of extra_params are detailed in param_indexed_auto.

#### shared_params_ref

This option allows you to reference shared parameter sets as defined in Declaring Shared Parameters.
Format: shared_params_ref <shared_set_name>
Example: shared_params_ref mySharedParams

The only required parameter is a name, which must be the name of an already defined shared parameter set. All named parameters which are present in the program that are also present in the shared parameter set will be linked, and the shared parameters used as if you had defined them locally. This is dependent on the definitions (type and array size) matching between the shared set and the program.

#### Shadows and Vertex Programs

When using shadows (See Shadows), the use of vertex programs can add some additional complexities, because Ogre can only automatically deal with everything when using the fixed-function pipeline. If you use vertex programs, and you are also using shadows, you may need to make some adjustments.

If you use stencil shadows, then any vertex programs which do vertex deformation can be a problem, because stencil shadows are calculated on the CPU, which does not have access to the modified vertices. If the vertex program is doing standard skeletal animation, this is ok (see section above) because Ogre knows how to replicate the effect in software, but any other vertex deformation cannot be replicated, and you will either have to accept that the shadow will not reflect this deformation, or you should turn off shadows for that object.

If you use texture shadows, then vertex deformation is acceptable; however, when rendering the object into the shadow texture (the shadow caster pass), the shadow has to be rendered in a solid colour (linked to the ambient colour). You must therefore provide an alternative vertex program, so Ogre provides you with a way of specifying one to use when rendering the caster. Basically you link an alternative vertex program, using exactly the same syntax as the original vertex program link:

    shadow_caster_vertex_program_ref myShadowCasterVertexProgram
    {
    	param_indexed_auto 0 worldviewproj_matrix
    	param_indexed_auto 4 ambient_light_colour
    }

When rendering a shadow caster, Ogre will automatically use the alternate program. You can bind the same or different parameters to the program - the most important thing is that you bind ambient_light_colour, since this determines the colour of the shadow in modulative texture shadows. If you don’t supply an alternate program, Ogre will fall back on a fixed-function material which will not reflect any vertex deformation you do in your vertex program.

In addition, when rendering the shadow receivers with shadow textures, Ogre needs to project the shadow texture. It does this automatically in fixed function mode, but if the receivers use vertex programs, they need to have a shadow receiver program which does the usual vertex deformation, but also generates projective texture coordinates. The additional program linked into the pass like this:

    shadow_receiver_vertex_program_ref myShadowReceiverVertexProgram
    {
    	param_indexed_auto 0 worldviewproj_matrix
    	param_indexed_auto 4 texture_viewproj_matrix
    }

For the purposes of writing this alternate program, there is an automatic parameter binding of ’texture_viewproj_matrix’ which provides the program with texture projection parameters. The vertex program should do it’s normal vertex processing, and generate texture coordinates using this matrix and place them in texture coord sets 0 and 1, since some shadow techniques use 2 texture units. The colour of the vertices output by this vertex program must always be white, so as not to affect the final colour of the rendered shadow.

When using additive texture shadows, the shadow pass render is actually the lighting render, so if you perform any fragment program lighting you also need to pull in a custom fragment program. You use the shadow_receiver_fragment_program_ref for this:

    shadow_receiver_fragment_program_ref myShadowReceiverFragmentProgram
    {
    	param_named_auto lightDiffuse light_diffuse_colour 0
    }

You should pass the projected shadow coordinates from the custom vertex program. As for textures, texture unit 0 will always be the shadow texture. Any other textures which you bind in your pass will be carried across too, but will be moved up by 1 unit to make room for the shadow texture. Therefore your shadow receiver fragment program is likely to be the same as the bare lighting pass of your normal material, except that you insert an extra texture sampler at index 0, which you will use to adjust the result by (modulating diffuse and specular components).