Shadow Mapping Using OpenGL

这个Demo是基于codesampler的“shadow mapping”例子。他那个使用了NVIDIA专有的扩展WGL_NV_render_depth_texture来设置pbuffer直接渲染到深度纹理,这个可能在ATI显卡上不能正确运行。我改进了一下,用glCopyTexSubImage2D来取代WGL_NV_render_depth_texture扩展,虽然速度可能没有后者快,但用的都是ARB核心扩展,通用性很好。

Shadow mapping的基本思想比较简单。首先,从光源位置为视点来渲染深度缓存,得到depth map(shadow map),其本质是表示离光源最近像素的深度的2D函数;其次,从眼睛位置为视点来渲染场景,即对每个光栅化的片断,确定片断相对于光源的XYZ位置,该光源的位置应对应用于创建depth map的frustum;最后,将depth map中的在光位置XY处的深度值与片断的光位置Z比较,如果后者大于前者,则必有比该片断离光源更近的物体,所以该片断在阴影中;若两者近似相等,则片断被光照。

本演示主要使用了GL_ARB_depth_texture、GL_ARB_shadow、WGL_ARB_pbuffer、WGL_ARB_pixel_format和WGL_ARB_render_texture扩展,所以你的显卡必须支持这些扩展才能运行(最好是支持OpenGL 1.5)。

下面是截图(黄色小球为光源):

程序下载:

shadow_mapping.rar

你可能感兴趣的:(mapping)