# Materials for developers
Advanced
Programmer
This diagram shows the Material interfaces and implementation classes:

- The interface @'Stride.Rendering.Materials.IMaterialDescriptor' is the root interface for a material description.
- The @'Stride.Rendering.Materials.IMaterialShaderGenerator' is the main interface used to generate a material shader of the material.
- Each attribute and layer implements this interface to modify the final material shader.
- The @'Stride.Rendering.Materials.MaterialDescriptor' is the editor-time description of the material before being compiled into a material shader.
- The @'Stride.Rendering.Material' class is the runtime material shader generated from the @'Stride.Rendering.Materials.MaterialDescriptor'
# Modifying parameters at runtime
The file @'Stride.Rendering.Materials.MaterialKeys' contains most material keys you might need to use, have a look through it to figure out which one you might need to get to modify the parameter you are interested in.
Let's say you have this fairly simple material:

And you want to clone that material, but change its color to red at runtime.
Searching through the different keys contained in @'Stride.Rendering.Materials.MaterialKeys' you would find `MaterialKeys.DiffuseValue` and use it as the key to set the new color value you want:
```csharp
var clone = SerializerExtensions.Clone(MyMaterial);
clone.Passes[0].Parameters.Set(MaterialKeys.DiffuseValue, new Color4(1, 0, 0));
```
If you aren't too sure which parameter keys your material uses, the best way to figure it out would be to inspect the material's variables with a debugger.
Here's an example of that through Rider's *Threads & Variables* window:

## See also
- [Material maps](material-maps.md)
- [Material attributes](material-attributes.md)
- [Material layers](material-layers.md)
- [Material slots](material-slots.md)