GLSL multiple shaderprogram VS uniforms switches

Viewed 9249

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!

3 Answers
Related