Test Images
 

Click for larger images.

Most of the last five years of my life has been spent writing a renderer for PDI. Along the way, I've created a few test images.

Starting with a full 3D scene, I generated brush strokes in 2D using the surface orientation and color. I tried to keep the brushstrokes mostly within the object, but not entirely.

Here is the original 3D scene. The really neat part is that the brushes stuck to the object when the camera moved. New strokes are added behind existing strokes when the camera zooms in close.

Here are some other painterly looks. I painted a sphere with yellow on top, orange strokes in the middle to purple on bottom. I orient that ball toward the light, and choose a color off the sphere.

The trick is to choose a point around the sphere coherently, so that your strokes are visible in the final image, and stick with the object as the camera moves.




When we started working on Shrek, we knew we would have to deal with really complex, moving backgrounds. We tested out some of Fabrice Neyret's volumetric ellipsoids until we realized that it was much easier for us to render millions of polygons.

Each voxel contains an ellipsoid that is constructed by averaging together polygon ellipsoids. The voxel data define a distribution of normal vectors which are used during shading.

It was important that shadows worked correctly and we had to handle scenes with sharp corners. We did closeup tests to see when the sytem broke down. All of this worked really well.

The voxels are applied to a thick volumetric skin overlaying a soft fractal hillside. Our inhouse renderer handles volumes by rendering transparent geometry and using the segment endpoints along a pixel to shade a volume segment. This is a view of the memory used per pixel to represent a hillside.

We cover the hillside with voxel grids and use a 3D form of MIP-mapping to filter down the voxels by averaging together the ellipsoids. I kept having trouble getting the level interpolation to work smoothly. The result was that you could see the level changes in motion.

Notice the two horizontal lines near the horizon in the last picture.






Our renderer is broken into two separate programs. A rasterizer generates a "deep" file that is passed to the shading program. The deep file contains all the geometry visible from the camera's viewpoint.

This is a test which shows what happens when you render a deep file from a different camera view. In this test, the camera tracks in front of the scene. Black regions are unknown.

The first image is complete, the second and third images are from different camera positions. Notice how the hidden regions are revealed and the patterns which result from the pixel boundaries.

I think this sort of technique would be great to use for motion blur. You can rerender only the unknown regions after rendering the scene at a set of inter-frame times.

Look at one of these images and try to figure out what it is.

Give up?

These are unwrapped spheres with points where the renderer has sampled them during shading. Any patterns could cause aliasing. Notice all the regular patterns? We don't like that. We prefer the one with the randomized sample points.



This is a set of displaced spheres (without shadowing). The idea is to simulate a diffuse surface by increasing the roughness of the surface. Rougher surfaces don't have specular highlights like smooth surfaces and the light tends to wrap around the object.

I really liked how even small displacements broke up the shading along the shading line.

This was one of the first fur tests I did before we started working on Shrek. One of the main characters is a donkey voiced by Eddie Murphy, so we needed fur. I decided to try a brute force approach, and it worked pretty well the first time. Shadows are tough, but they seem to work just fine with a little practice.