what's the advantage of ShaderProgram::Substitute? why design the shader pipeline and architecture like this: substitue string to get the real final shader; find by name every frame then SetUniform?

the shader pipeline and architecture, why ?

substitue string to get the real final shader; Why not write some real shader maby uber shader?
and isn’t too hard to read the shader? i’m new to VTK, and very curious about where to read the final shader…

find by name then SetUniform; Why not support get the uniform location then SetUniform by location?

@jaswantp @LucasGandel @lgivord @Thomas_Galland