问题
- 着色是局部的,这种方便但不对;
- 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
在生成阴影的过程中不需要找到几何信息。
具体过程
该过程包含两个步骤:
- 从光源看向具体的物体;
- 从人眼看向具体的物体;
具体如上图所示:
- 首先,从光源看向物体,可以得到光源能够看到的图,该图不进行着色,只记录看到的点的深度信息;
Depth image from light source
- 从人眼看向具体的物体,对于看到的物体上的点,将其投影回从光源角度看得到的平面,如第3部分,能够得到该点对应深度图上的哪个像素;
Standard image (with depth) from eye
Project visible points in eye view back to light source
- 比较投影到Depth image上的点的深度信息,与Depth image的深度信息,可以得到两个结果:
- (Reprojected) depths match for light and eye:说明该点能够被看见,不在阴影中;
- depths from light and eye are not the same:该点不能被看见,在阴影中;
实例操作过程
The depth buffer from the light’s point-of-view
Comparing Dist(light, shading point) with shadow map
效果
问题
精度问题
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,即要么在阴影中,要么不在——硬阴影。
- 硬阴影:完全看不到光,界限明显,光源是点光源;
- 软阴影:能看到部分光,界限圆滑,光源有一定大小;
总结
- 即便有很多问题,仍然是Well known rendering technique;
- Basic shadowing technique for early animations and 3D video game;