已剪辑自: https://techbrood.com/zh/news/webgl/%E6%B7%B1%E5%BA%A6%E8%B4%B4%E5%9B%BE%EF%BC%88depth-map%EF%BC%89%E6%A6%82%E5%BF%B5%E7%AE%80%E4%BB%8B%E5%92%8C%E7%94%9F%E6%88%90%E6%B5%81%E7%A8%8B.html


Depth Map

  • 深度图是一张2D图片,每个像素都记录了从视点(viewpoint)到遮挡物表面(遮挡物就是阴影生成物体)的距离,这些像素对应的顶点对于观察者而言是“可见的”。
  • Depth map中像素点记录的深度值为lenth1;然后从视点出现,计算物体顶点v到视点的距离,记为lenth2;比较二者大小,来确定“v”是否被遮挡。该术语的同义词有depth buffer, Z-buffer, Z-buffering 和 Z-depth。这里的”Z”是相对于相机(即视点)视图中心轴线而言的,也就是相机的z轴线,而不是场景的绝对坐标中的z轴线。
  • 深度图示例

image.png

  • Shadow texture 阴影贴图,就是日常所见的阴影保存为纹理图片;
  • Depth texture保存的是“从视点到物体顶点的距离,通常称为深度值”。
  • Shadow map 以depth map 为技术基础,通过比较“光源可见点到光源的深度”和“任何点到光源的深度”来判断点是否被物体遮挡;

    shadow texture 技术,将生成的阴影图形作为投影纹理来处理,也就是将一张阴影图投影映射到一个物体上(阴影接收体)。这种方法的缺点在于:设计者必须确认哪个物体是遮挡物,哪个物体是阴影接受体,并且不能产生自阴影现象(按照常识,物体的阴影不会投射到自己身上)。

生成深度图

  • 以光源所在位置为相机位置,光线发射方向为观察方向进行相机参数设置;
  • 将世界视点投影矩阵 worldViewProjMatrix 传入顶点着色程序中,并在其中计算每个点的投影坐标,投影坐标的Z 值即为深度值(将Z 值保存为深度值只是很多方法中的一种)。在片段shadow 程序中将深度值进行归一化,即转化到【0,1】区间。然后将深度值赋给颜色值
  • 从 frame buffer 中读取颜色值,并渲染到一张纹理上,就得到了depthmap。

注意:在实际运用中,如果遇到动态光影,则depth map 通常是实时计算的,这就需要场景渲染两次,第一次渲染出depth map,然后基于depth map 做阴影渲染。

用途

  • 模拟在一个场景中的密度均匀的半透明介质效果-如雾,烟或大量的水;
  • 模拟场景表面的深度域(depth of field (DOF));
  • 可用于高效的变形体碰撞检测。