嗨计算机图形和数学人:-)
简短的问题:如何让艺术家在世界空间中为通过百分比更接近过滤 (PCF) 过滤的阴影贴图选择有意义的灯光大小,是否可以使用相同的技术来支持点光源和定向光源?
更长的问题:我已经实现了阴影映射并通过应用百分比更接近过滤(PCF)过滤边缘。与常规的矩形滤波器内核相比,滤波器内核是泊松盘。您可以将泊松盘视为或多或少随机分布在单位圆内的样本位置。因此,过滤器区域的大小只是乘以内核(泊松盘)的每个 2D 样本位置的因子。
我可以调整泊松圆盘的半径/因子,并在运行时为聚光灯(透视平截头体)或定向光(正交平截头体)更改半影的大小。这很好用,但参数的值并没有任何意义,这对于小型 3d 样本甚至可以投入一些时间来根据经验调整值的游戏来说都很好。我想要的是一个名为“LightSize”的参数,它在世界空间中具有实际意义。例如,一个大型场景,一个 100 单位长的建筑物,LightSize 必须比书架特写的场景更大,才能产生相同的平滑阴影。另一方面,固定的 LightSize 会导致架子上的阴影非常平滑,而建筑物外的阴影则非常硬。这个问题不是关于柔和的阴影,
哦,看看我很棒的 MS Paint 插图:
想法1:如果我直接使用 LightSize 作为过滤器大小,0.5 的系数将导致对角线为 1.0 和半径为 0.5 的泊松盘。由于纹理坐标在 [0,1] 范围内,这导致过滤器大小评估每个片段的整个纹理:想象一个片段位于阴影贴图的中心,该片段将获取分布在整体内部的相邻纹素纹理区域。这当然会产生非常大的半影,但我们称之为“最大值”。例如,0.05 的半影因子将导致对角线为 0.1,因此每个片段将评估大约 10% 的相邻纹素(忽略圆圈等。从侧面看 2d 视图)。这种方法有效,但是当聚光灯的角度变大或定向光的平截头体改变其大小时,由于 LightSize 在纹理空间(UV 空间)中定义了半影,所以半影改变了它的宽度。半影应该保持不变,与近平面的大小无关。想象一个合适的正交平截头体。当相机旋转时,安装的平截头体的大小会发生变化,半影的大小也会发生变化,这是错误的。
想法2:将LightSize除以世界空间中近平面的大小。这对于正交投影非常有效,因为当截头体的尺寸变大时,LightSize 会除以更大的值,这样半影在世界空间中保持不变。不幸的是,这不适用于透视平截头体,因为近平面的距离会导致近平面的大小发生变化,因此半影大小现在取决于近平面距离,这是令人讨厌和错误的。
感觉必须有一种方法让艺术家可以在世界空间中选择有意义的灯光尺寸。我知道 PCF 只是物理上合理的光源的(相当糟糕的)近似值,但想象一下:当在世界空间中使用泊松盘对光源进行多次采样时,可以通过渲染来创建物理上准确的阴影每个样本位置的硬阴影。这适用于聚光灯。定向灯的情况有所不同。可以使用“定向光原点的角度”并为每个略微旋转的平截头体渲染多个硬阴影。这在现实世界中根本没有任何物理意义,但不存在定向光,所以……顺便说一下,光源的采样通常被称为多视图软阴影(MVSS)。
你有什么建议吗?是不是必须以不同的方式处理聚光灯和定向光,而 PCF 不允许我使用有意义的真实世界光大小来制作透视平截头体?