You can use one shader instance for multiple objects. In fact, you should. I tend to solve the uniform problem this way:
private static class GrassShader extends GLSLShader implements IRenderHook {
private float trans = 0;
public GrassShader(String vertexShaderSource, String fragmentShaderSource) {
super(vertexShaderSource, fragmentShaderSource);
}
@Override
public void afterRendering(int arg0) {
// TODO Auto-generated method stub
}
@Override
public void beforeRendering(int arg0) {
// TODO Auto-generated method stub
}
@Override
public void onDispose() {
// TODO Auto-generated method stub
}
@Override
public boolean repeatRendering() {
// TODO Auto-generated method stub
return false;
}
@Override
public void setCurrentObject3D(Object3D obj) {
this.setUniform("alpha", trans);
this.setUniform("random", Ticker.getShaderTime());
}
@Override
public void setTransparency(float val) {
trans = val;
}
@Override
public void setCurrentShader(GLSLShader arg0) {
// TODO Auto-generated method stub
}
}