much better design for nuiShaderState and nuiShaderDesc