如何选择世界空间中的光照大小进行阴影贴图和百分比更近的过滤?

时间:2015-04-04 13:46:55

标签: opengl 3d directx shader shadow-mapping

嗨计算机图形和数学人: - )

简短问题:如何让艺术家在世界空间中为通过百分比近距离过滤(PCF)过滤的阴影贴图选择有意义的光照尺寸,是否可以使用相同的技术来支持斑点和定向光源?

更长的问题:我已经实施了阴影贴图并通过应用百分比近距离过滤(PCF)来过滤边缘。与常规矩形滤波器内核相比,滤波器内核是泊松磁盘。您可以将泊松盘视为在单位圆内或多或少随机分布的样本位置。所以滤波器区域的大小只是一个因子乘以内核的每个2D采样位置(泊松盘)。

我可以调整Poisson磁盘的半径/系数,并在运行时为聚光灯(透视平截头体)或定向光(orhtographic frustum)更改半影的大小。这很有效,但参数的值对于小型3D样本甚至游戏都没有任何意义,因为人们可以投入一些时间来根据经验调整值。我想要的是一个名为" LightSize"的参数。这在世界空间中具有实际意义。例如,一个大型场景,其建筑物长度为100个单位,LightSize必须比具有书架特写的场景大,以产生相同的平滑阴影。另一方面,固定的LightSize会在架子上产生极其平滑的阴影,并在建筑物外部产生相当硬的阴影。这个问题不是关于软阴影,接触硬化等问题所以忽略物理上准确的阻塞接收器估计; - )

哦,看看我真棒的MS Paint插图: Perspective Light Frustum (Spot Light) Orthographic Light Frustum (Directional Light)

想法1:如果我直接使用LightSize作为滤镜大小,因子0.5将导致对角线1.0和半径0.5的泊松盘。由于纹理坐标在[0,1]范围内,这导致了一个过滤器大小,用于评估每个片段的整个纹理:想象一个片段在阴影贴图的中心,这个片段将获取分布在整个片段内的相邻纹素纹理区域。这当然会产生非常大的半影,但是我们称之为“#34;最大值”。例如,半影因子为0.05将导致对角线为0.1,使得每个片段将评估其相邻纹素的约10%(忽略圆等,仅从侧视图中考虑2d)。这种方法有效,但是当聚光灯的角度变大或方向光的平截头体改变其大小时,半影会改变其宽度,因为LightSize定义了纹理空间(UV空间)中的半影。半影应保持不变,与近平面的大小无关。想象一下合适的正字形截头体。当相机旋转时,拟合平截头体的大小会发生变化,半影的大小也会发生变化,这是错误的。

想法2:将LightSize除以世界空间中近平面的大小。这对于正交投影非常有用,因为当平截头体的大小变大时,LightSize会被更大的值除以使半影在世界空间中保持相同。不幸的是,这对于透视平截头体并不起作用,因为近平面的距离导致近平面的尺寸变化,因此半影大小现在取决于近平面距离,这是令人讨厌和错误的。

感觉必须有一种方式让艺术家可以在世界空间中选择有意义的光线大小。我知道PCF只是物理上合理光源的近似(非常糟糕),但想象如下: 当通过在世界空间中使用泊松盘对光源进行多次采样时,可以通过为每个样本位置渲染硬阴影来创建物理上精确的阴影。这适用于聚光灯。方向灯的情况不同。可以在定向光的原点使用"角度"并为每个略微旋转的平截头体渲染多个硬阴影。这在现实世界中根本没有任何物理意义,但是方向灯不存在,所以...顺便说一下,光源的采样通常被称为多视图软阴影(MVSS)。

你有什么建议吗?可能是斑点和方向灯必须以不同的方式处理,而且PCF不允许我使用有意义的真实世界光线尺寸来制作透视平截头体吗?

0 个答案:

没有答案