此第 3 阶段过滤来自 Tile Group Light Mask Buffer 的光index,对每个 Shadow Tile 进行更准确的每pixels测试。由于之前的结果由多个阴影图块共享,并且 Froxel 测试会产生误报,因此我们在下一步计算阴影之前尽可能多地消除阴影 当每个计算线程处理 1 个pixels时,我们读取场景深度并迭代 Tile Group Light Mask Buffer 条目中的 Tile Group 灯光。shadow tiles考虑当光源在其至少一个pixels的范围内时,该光源是有效的。
在阴影图块中发现的光源近似值的精度误差。此处显示了两个 Froxel,由它们的 Shadow Tile 绑定加上最小和最大像素深度分隔。在Shadow Tile 1中,使用精确测试时,只有灯光A和D才能找到。通过更快的近似值,灯光 B 和 C 也会被错误地检测到(对这个阴影图块的像素没有影响)。Light B,因为它位于 Shadow Tile Froxel 内部。和光 C,因为它在邻居中有效,并且结果在 8x8 Tiles 之间共享。
注:这张图主要说明查找光源时的误差,但我并没理清误差到底如何产生的,原文提到 Few Shadow Tiles contain a high number of lights and allocating the same fixed amount of memory for all to handle the maximum count is wasteful. Instead, a flexible memory approach is used where each Shadow Tile reserves enough memory in a shared buffer to handles their approximated light count. 大意为有一个共享的缓冲区存储所有的光index?加上part2中的算法为^=去除已经查过的光源,所以这里我猜测当光源B是因为在内部(范围大,一次查到了ABD)所以没有除去,而C是因为Froxel比较短里面并没有光源所以^=也没有除去,如果你看到后不对,请在下面评论指出谢谢 :)
这两个为在每个shadowTile中查到的光源信息 左图为Early Light List Buffer 每4byte存储3个index用来压缩(4个2^8次方->3个2^10次方) 右边图为Final Light List Buffer 存储当前tile 的光index与可见