Here is an example (above) of an object rendered using bezier surfaces. In this case, I ran adaptive subdivision with a maximum error threshold of 0.005. The teapot is rendered with smooth shading.
In the above image, I have rendered the same bezier surface teapot along with the mesh containing the control points for each bezier patch.
This is a close-up shot (above) of the teapot showing the smooth shading results.
Here is a close-up image (above) of the teapot after rendering it using uniform subdivision with flat shading.
In this image (above), I have rendered the bezier surface teapot using adaptive subdivision and flat shading. In my implementation of the subdivision algorithm, I split the quads into triangles in order to avoid cracking.