GAMES101:Rasterization - Shadow Mapping


问题

  • 着色是局部的,这种方便但不对;
  • shading中无法解决阴影问题;

那么:How to draw shadows using rasterization?

方法:Shadow Mapping

idea

the points NOT in shadow must be seen both by the light and by the camera

在该方法中,如果点不在“阴影”中,指的是其既能被光看见,也能被人眼看见。换句话说,当一个点在阴影中时,说明其或者不能被光看见,或者不能被人眼看见。

含义

该方法是An Image-space Algorithm,如何理解?

no knowledge of scene’s geometry during shadow computation

在生成阴影的过程中不需要找到几何信息。

具体过程

Shadow Mapping具体过程

该过程包含两个步骤:

  • 从光源看向具体的物体;
  • 从人眼看向具体的物体;

具体如上图所示:

  1. 首先,从光源看向物体,可以得到光源能够看到的图,该图不进行着色,只记录看到的点的深度信息;

    Depth image from light source

  2. 从人眼看向具体的物体,对于看到的物体上的点,将其投影回从光源角度看得到的平面,如第3部分,能够得到该点对应深度图上的哪个像素;

    Standard image (with depth) from eye

    Project visible points in eye view back to light source

  3. 比较投影到Depth image上的点的深度信息,与Depth image的深度信息,可以得到两个结果:
    • (Reprojected) depths match for light and eye:说明该点能够被看见,不在阴影中;
    • depths from light and eye are not the same:该点不能被看见,在阴影中;

实例操作过程

  1. The depth buffer from the light’s point-of-view

    步骤1

  2. Comparing Dist(light, shading point) with shadow map

    步骤2

效果

有无阴影效果

问题

精度问题

Involves equality comparison of floating point depth values means issues of scale, bias, tolerance.

由于需要判断深度信息是否相等,当构建阴影时,会因为浮点数难以判断相等,导致阴影非常“脏”。如上图中的绿色图片所示。

一些方法:

  • 不判断相等,判断大小;
  • 同时,加一个小的误差范围;

但这些方法不能根本解决问题。

Depth image分辨率的影响

Quality depends on shadow map resolution (general problem with image-based techniques).

当shadow map的分辨率很低时,其对应的深度信息可以覆盖多个重投影到该图上的点,因此会出现走样的问题,因此must deal with aliasing artifacts。增加分辨率能解决问题,但是开销增加。

只能用于点光源

该方法只能处理点光源:因此其中的阴影,非0即1,即要么在阴影中,要么不在——硬阴影。

  • 硬阴影:完全看不到光,界限明显,光源是点光源;
  • 软阴影:能看到部分光,界限圆滑,光源有一定大小;

Hard shadows vs. Soft shadows

总结

  • 即便有很多问题,仍然是Well known rendering technique;
  • Basic shadowing technique for early animations and 3D video game;

文章作者: alex Li
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 alex Li !
  目录