词条 | Shadow Map |
释义 | 一种用于生成实时阴影的技术。另外一种是Shadow Volume(原理复杂,编写复杂,运算的复杂度与场景复杂度有关) Shadow Map的基本实现方法: 1、将场景的深度值预先渲染到 以光源位置为原点、光线发射方向为观察方向的投影坐标系中,形成深度纹理。 2、再次渲染场景的过程中,将每个片断(像素)变换到前述眼坐标系中,并缩放到[0,1]的范围内以便查询纹理。 3、以当前片断在眼坐标中的S、T坐标查询深度纹理获得深度值,将此深度值与当前片断的R坐标进行比较,若R坐标大于深度值,则当前片断在阴影中;否则当前片断受光照。 上述是基本原理,希望能够理解。 但令人失望的是,这种方法只适合于灯类型是聚光灯(Spot light )的场合。 如果灯类型是点光源(Point light)的话,则在第一步中需要生成的不是一张深度纹理,是一个立方深度纹理(cube texture)。 如果灯类型是方向光(Directional light)的话:第一步要做的工作是: 1、需要把视点(camera,view)的视椎体(camera frustum)搬到光源的view space 2、求得view matrix的各个参数:farZ参数为在view space中视椎体的maxZ-minZ;nearZ为0.0;upVector是方向光的任意一个垂直向量;lookAt是视椎体的“质心” 3、计算view matrix,把veiw matrix搬到平行投影坐标系(orthographic projection space) Shadow Map可以正确地形成自阴影,但会出现几种失真。 第一种失真是阴影边缘有锯齿。这容易明白,主要是因为深度纹理的分辨率有限。 第二种是阴影内部甚至是整个场景都有不规则阴影。这是因为深度纹理每一个像素点的精度有限,当这个深度像素点在pixel shader里和当前处理的点做比较时,由于这两点的z都很相近,产生z-fighting。可以通过在做比较时设置一个z偏移(即把这两点人为的分开一点距离)来避免z-fighting;也可缩小投影视椎体大小(即减小fov,减小Zn和Zf的距离,特别的,尽量增大Zn,原因请参考投影矩阵的原理),提高深度纹理像素点的数值大小,从而提高精度。 此外还受深度纹理尺寸的限制,所形成的阴影边缘锯齿较严重。需要进行模糊处理,甚至是半影处理 |
随便看 |
|
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。