To specify entry point of a shader. Why only
restricted to main()?
To compile into ARB assembly shader into a string
buffer for debugging purpose.
To read pixel values from a render buffer target
or depth buffer using a position relative to the current
fragment position. This is good for blending.
To change the position of the incoming fragment.