No need to recreate the material to switch a texture.
Save shader variables upon shader creation to avoid costly state queries during rendering. Also convert things to maps in order to cause runtime failures on bad user input.