This project formed the final dissertation for my degree. It was an investigation into (what was at the time) modern real-time lighting and shadow rendering techniques. As part of this investigation, I developed a device-independent rendererer architecture that supported rendering meshes using one of three per-pixel lighting models:
In addition, there is support for normal mapping, point lights, directional lights and spot lights, with varying support for shadow rendering from these lights - point lights use SSM and spot lights can use either SSM or LiSPSM.
A quick rundown of some of the other big features that were developed:
- Renderer is a standalone DLL that can be linked to by applications wishing to use it.
- External API is entirely independent from a particular graphics API (such as OpenGL or Direct3D).
- Renderer is designed to manage all aspects of rendering objects in the scene, including resource management, shadow map generation and shader selection.
- The client application simply has to implement methods for responding to renderer requests for "renderables"
The end result is that the sample applications - that range from simple examples of different lighting and shadow models to flying through a Quake 3 BSP or geomipmapped landscape could be built with minimum concern as to how the rendering would be performed.