LIGHT SPACE PERSPECTIVE SHADOW MAPS =================================== This programn is a demonstration of the Light Space Perspective Shadow Mapping algorithm described in the respective paper. Additional information and sample images are available at http://www.cg.tuwien.ac.at/research/vr/lispsm/ Copyright and Disclaimer: This code is copyright Vienna University of Technology, 2004. Please feel FREE to COPY and USE the code to include it in your own work, provided you include this copyright notice. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Authors: Daniel Scherzer (scherzer@cg.tuwien.ac.at) Michael Wimmer (wimmer@cg.tuwien.ac.at) Date: October 14, 2004 ---------- Input ---------- Help for keybord and mouse is available with F1. In the light view, the view frustum is shown as a semitransparent body and the view vector as a red line emanating from the near plane. ---------- The scene ---------- The scene used in this program is designed to show all known shadow mapping problems: projection aliasing, perspective aliasing and offset problems. For instance, self shadowing artefacts at the spiky cones are visible, and offset problems can be generated at certain viewing angles towards the hills. The LiSPSM algorithm is designed to reduce perspective aliasing only. Projection aliasing and offset problems appear just like in uniform or perspective shadow maps. To reduce offset problems we implemented two strategies: shadow map rendering with polygon offset enabled and back side rendering. this can be switched with the
key. Hint: Some driver implementations give better results with back side rendering, others with polygon offset. Note that due to the perspective warp, a constant polygon offset may not be sufficient in some scenes. This can be fixed using a fragment shader that carries over the original z-coordinate and uses this coordinate (including a bias) for comparison, however this functionality is not implemented in this demo. ---------- Installation ---------- A binary for Win32 is included. The program should compile under Windows and Linux, a CMAKE makefile for multi-platform compilation is included (see www.cmake.org for details). For Linux, you need to have a working GLUT and GLEW installation. ---------- Structure ---------- This demo is written in C and uses OpenGL in order to keep it as universal as possible. It has few external needs like limits.h, stdlib.h, math.h, string.h, stdio.h and a C-compiler ;) It expects the ARB_Shadow extension (GeForce3/Radeon 9500 or higher for hardware support) and uses ARB_Shadow_ambient if available. The program and especially the mathematical routines are not designed for speed or efficiency, but for simplicity and clarity. The shadow map size is set to 512x512 pixel. As a rule of thumb the shadow map resolution should be twice the size of the viewport. In this demo we choose this small size for compatibility, because we don't use the PBuffer extension (because this would blow up the code significantly) and have to render the shadow map into the back-buffer. The resulting shadows are therefore not as good as the results shown in our sample pictures, where we used a pBuffer with twice the size of the viewport. LiSPSM.c: contains the algorithm described in the paper glInterface: includes gl, glut and glew headers Main.c: contains the OpenGl setup code, glut stuff, and basic shadow mapping code; Main.h: declares global variables for use in Main.c and LispSM.c DataTypes.h: declares basic geometric datatypes DataTypes.c: defines basic routines for these datatypes MathStuff.h: declares mathematical routines used in the rest of the program MathStuff.h: defines some handy mathematical routines SceneData.h: declares some scene related datastructures and routines SceneData.c: handles the drawing of the scene; If you find any problem with the code or have any comments, we would like to hear from you! ---------- Change Log ---------- 19. Aug. 2004: the variable name "cosGamma" was corrected to "sinGamma" 20. Sep. 2004: float -> double for better numerical stability 26. Sep. 2004: solved problem with certain special cases with a low sun setting. the solution is to use the "body vector" of the intersection body B as up vector 28. Sep. 2004: shadow matrix can be calculated with viewDir as up vector or the body vector of B as up vector (switch with 'n' key). code changes are marked with a //CHANGED comment