Custom shapes with gradients can easily be created with a vertex array: if you assign different colors to the vertices that compose a primitive (ie. a triangle or quad), these colors are linearly interpolated by the graphics card to fill the primitive, and you get a smooth gradient with no effort.