I guess this class should not be used directly because it's abstract? maybe create an abstract initializeShader method