The goal of this project is to reduce performance implications for shadow rendering. The need arises from the fact that many games’ shadow rendering methods result in too large of an FPS decrease for users to even bother using. Most conventional shadow rendering is done by a technique known as shadow volumes. Volumes are constructed using silhouette edges and rendered into a stencil buffer. This is repeated for each light source and the resulting images are combined to form a final frame, a process called multi-pass rendering. This idea is by no means novel and has been used for decades with various optimizations and tweaks increasing performance over the years. This technique is slow because it requires many passes and shadow volume construction which consists of quickly finding silhouette edges, usually stored as additional information in the vertex buffer, and must be transformed to infinity.
The first step of the project will be to attain a visual studio C++ project that consists of a scene with several moving objects illuminated by one or more point light sources. This project will have the option of turning shadows on which will use a conventional shadow rendering technique. Turning shadows on will reduce FPS from say 60 to 40. The goal of the project will be to be able to turn on an additional, perhaps less physically accurate shadow rendering mode which results in a non noticeable drop in FPS. One idea that might attain the goal of this project is to render shadows as a post processing effect. Inspired by screen space ambient occlusion, I propose gathering randomly distributed occlusion samples that lie within a cone from the sample point to each light source. Determining the number of points in the cone that occlude the sample point and weighting them in different ways might be a way to estimate whether the point should be in shadow. An additional technique that I have seen in some games is to render shadows quickly on a large number of objects is to use drop shadows. I have still noticed a significant performance impact in using simple drop shadows, although much less worse so than using regular shadows. Since drop shadows are simple dark circles underneath each object, it should be a simple matter of doing drop shadows as a post processing effect on the GPU. Regardless of the method, I firmly believe there should be a way to render shadows or at last an approximation with absolutely no performance hit. This project will attempt to discover and implement that method in a scene with many dynamically moving objects.