阴影技术中最简单的一种(其他的可以算作他的变种)是所谓的shadow mapping(适用于平行光)
他需要事先为场景中的物体,在以光源为视角的视口内,渲染一张深度图。
在那个视口里,只有最靠近光源的片元才能将自己的深度写入这张深度图。
随后,就正式开始渲染场景了。在正式的片元着色器中,需要先求出片元在光源坐标系内的位置,用xy当作uv坐标值去采样深度图里的深度值,同时用z值和这个深度值比较,如果自己的z值大于深度值,就判定自己在阴影里,光照结果会忽略除了环境光以外的所有成分,反之,判定自己不在阴影里,使用正常的光照结果。
看起来滴水不漏,但是这里面隐含着一个严重的问题,就是所谓的shadow asne ,他会造成画面中出现不可言状的光暗相间的条纹。当物体表面越和光源方向倾斜且越远,越容易产生这样的问题。他的成因可以用这张图表达(图中的camera居然代表光源位置...)。
首先思考,所谓的“片元在光源坐标系内的位置”是怎么得到的? 他是通过插值 顶点在顶点着色器乘以矩阵后的结果得到的(把顶点变换到世界坐标系再变换到光源坐标系),所以他是连续的(图中的GeometryPlane)。而深度图的采样点是离散的(图中蓝线),不同的uv坐标值完全可能采样到同一个离散的点上,这样就出了问题。因为随后,我们会用片元的z值去和采样到的深度值做比对,如图所示