Shadows are an important way to add realism to a scene. There are a number of trade-offs possible when rendering a scene with shadows . Just as with lighting, there are increasing levels of realism possible, paid for with decreasing levels of rendering performance.
Shadows are composed of two parts, the umbra and the penumbra. The umbra is the area of a shadowed object that is not visible from any part of the light source. The penumbra is the area of a shadowed object that can receive some, but not all of the light. A point source light would have no penumbra, since no part of a shadowed object can receive part of the light.
Penumbrae form a transition region between the umbra and the lighted parts of the object; they vary as function of the geometry of the light source and the shadowing object. Since shadows tend to have high contrast edges, They are more unforgiving with respect to aliasing artifacts and other rendering errors.
Although OpenGL does not support shadows directly, there are a number of ways to implement them with the library. They vary in difficulty to implement, and quality of results. The quality varies as a function of two parameters. The complexity of the shadowing object, and the complexity of the scene that is being shadowed.