I'm working on a shader manager architecture and I have several questions for more advanced people. My current choice oppose two designs which are:
1. Per material shader program
=> Create one shader program per material used in the program.Potential cons:
- Considering every object might have its own material, it involves a lot of glUseProgram calls.
- Implies the creation of a lot of shaderprogram objects.
- More complex architecture that #2.
Pros:
- Shader code can be generated specifically for each "options" used in the material.
- If i'm not wrong, uniforms have to be set only one time (when the shaderprogram is created).
2. Global shader programs
=> Create one shader program per shader functionality (lightning, reflection, parallax mapping...) and use configuration variables to enable or discard options depending on the material to render.Potential cons:
- Uniforms have to be changed many times per frame.
Pros:
- Lower shader programs count.
- Less SP swich (glUseProgram).
You might notice that my current tendency is #1, but I wanted to know your opinion about it.
- Does initial uniforms setting offset the glUseProgram call overhead (I'm not especially speed freak) ?
- In the case #1, for any memory or performance consideration, should I call glLinkProgram only once when I create the SP, or I must unlink/link each time I call glUseProgram?
- Are there better solutions ?
Thanks!
question from:https://stackoverflow.com/questions/6539774/glsl-multiple-shaderprogram-vs-uniforms-switches