赞
踩
什么是阴影
当来自光源的至少一个点在空间中被遮挡时,就产生了阴影区域。
阴影的前提
阴影体(Shadow Volumes)——空间中黑暗部分的几何
阴影映射(Shadow Map)——在场景中没有背光源找到的地方
绿色的点没有阴影。
红色点在摄像机视角看是在阴影里,但在光源的视角看在盒子后面,不代表一定在阴影中(例如多光源情况)。
相机视角渲染的深度图与光照视角渲染的深度图进行比较。
传统Shadow Map因为自阴影出现的问题——阴影失真(Shadow Acne)
红色斜着的区域对应了ShadowMap上每块片段(像素)的位置,因为阴影贴图受限于分辨率,在距离光源比较远的情况下,多个片段可能从ShadowMap的同一个值中去采样。图片每个斜坡代表ShadowMap一个单独的纹理像素。你可以看到,多个片段从同一个深度值进行采样。有些在地板上面,有些在地板下面;在和屏幕空间深度做比较的时候就会出现误差,这样我们所得到的阴影就有了差异。
我们可以用一个叫做阴影偏移(shadow bias)的技巧来解决这个问题,我们简单的对表面的深度(或深度贴图)应用一个偏移量,这样片段就不会被错误地认为在表面之下了。
举个栗子:
这四个fragment分别取名a,b,c,d,由于光源的位置会导致求得的四个距离会不一样,先求a到光源的距离假设为9.8<10,b到光源的距离是11.6 >10,c到光源的距离12.1>10,c到光源的距离9.5<10,。就会导致a和d亮,b和c暗,他们本来应该都是亮的才对。然后整个光源视椎体下各个片段都会出现这个问题,就会出现上面的明暗交错的条纹。
如果Bias值过大也会导致一个问题——悬浮
与OpenGL优化原理差不多。
人们期望,正常情况下Shadow Map上的像素可以对应上屏幕空间的像素,这种情况仅在目标Light垂直于目标物体(平面)时才会出现,但通常并不会满足上述条件。
因此人们开始针对此类问题进行优化,主要优化点如下:
主要误差类型
解决方案:
小结
流程:
Wpenumbra=P sz- Zavg / Zavg * Wlight
Wlight为光源的大小
Wf = Znear / PSZ *Wpernumbra
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。