at 24 frames per second in one year allows 3 minutes rendering time per frame, on average. Image quality: Any image containing unwanted, algorithm-related artifacts is considered unacceptable. Flexibility: The architecture should be flexible enough to incorporate new techniques as they become available, without the need for a complete reimplementation of the algorithm. Reyes efficiently achieves several effects that were deemed necessary for film-quality rendering: Smooth, curved surfaces; surface texturing; motion blur; and depth of field. Reyes renders curved surfaces, such as those represented by parametric patches, by dividing them into micropolygons, small quadrilaterals each less than one pixel in size. Although many micropolygons are necessary to approximate curved surfaces accurately, they can be processed with simple, parallelizable operations. A Reyes renderer tessellates high-level primitives into micropolygons on demand, dividing each primitive only as finely as necessary to appear smooth in the final image. Next, a shader system assigns a color and opacity to each vertex of a micropolygon. Most Reyes renderers allow users to supply arbitrary lighting and texturing functions written in a shading language. Micropolygons are processed in large grids which allow computations to be vectorized. Shaded micropolygons are sampled in screen space to produce the output image. Reyes employs an innovative hidden-surface algorithm or hider which performs the necessary integrations for motion blur and depth of field without requiring more geometry or shading samples than an unblurred render would need. The hider accumulates micropolygon colors at each pixel across time and lens position using a Monte Carlo method called stochastic sampling. Pipeline The basic Reyes pipeline has the following steps: Bound. Calculate the bounding volume of each geometric primitive. Split. Split large primitives into smaller, diceable primitives. Dice. Convert the primitive into a grid of micropolygons, each approximately the size of a pixel. Shade. Calculate lighting and shading at each vertex of the micropolygon grid. Bust the grid into individual micropolygons, each of which is bounded and checked for visibility. Hide. Sample the micropolygons, producing the final 2D image. In this design, the renderer must store the entire frame buffer in memory since the final image cannot be output until all primitives have been processed. A common memory optimization introduces a step called bucketing prior to the dicing step. The output image is divided into a coarse grid of "buckets," each typically 16 by 16 pixels in size. The objects are then split roughly along the bucket