这里是光栅化的最后一部分,讲这个光栅化里面怎么实现这个阴影
实际上阴影就是光源看不到的地方但是是我们能看到的地方,那这个地方就应该有阴影,那具体怎么做呢,这个就叫做Shadow Mapping,分两步做
我们之前说过这个解决远近问题用的深度缓冲Z-Buffer,会用一个depth buffer存储像素的深度,类似的,这里把这个光源当作摄像机,然后去记录一次像素的深度,这样记录到的像素的深度都是光源可以看到的点的深度,因为光源看不到的点的深度会被覆盖对不对
然后我再从摄像机出发去记录像素的深度,这时记录下的像素的深度都是我能够看到的点的深度,如果这个点投影到光源的深度和第一轮记录的深度一样,那么说这个点光源和我都能看到,那这里应该没有阴影
如果摄像机看到的点投影到光源的深度和第一轮记录的深度不一样,那么说明这个点我能够看到,但是光源看不到,那么说明此处应该有阴影
实际操作中那么第一轮就会得到这个和深度缓冲Z-buffer一样的depth buffer深度图
然后去比较摄像机能够看到的点投影到光源的距离是否和depth buffer记录的相等,就是下面的绿色部分,非绿色部分就是应该存在阴影
然后其实可以看到这里绿色的部分不是很均匀,这几个球上颜色有点混乱,这个说明这个阴影不是非常理想,为什么会出现这种情况呢?主要有两个原因,一呢是因为浮点数精度问题,计算机二进制存储嘛,有些小数无法精确表示,那么就导致这个比较浮点数相等这个事情比较困难,那改成大于行不行呢,其实还是不行,还有大于某个阈值也不能根本解决这个问题;二呢是因为这个分辨率问题,就是这个采样问题,一个像素可能覆盖很多点,那每个点都有距离对吧,那我这个像素上不上阴影呢,这也是问题
还有就是它只能解决这个点光源的硬阴影,就是下面这个上面的阴影,就是阴影都是一样的,而无法表示这个软阴影,就是渐变的阴影,因为如果这个光源它不是点光源,它就会产生这种软阴影