0

我目前正在实施和修改一些用于阴影映射的替代偏置解决方案。我当然会将它们与不同的柔和阴影技术结合起来。

我在 PCF 上遇到了一些问题。我通过测试光线方向和片段法线的点积是否大于 0 来对表面的背面进行阴影处理,因此它只能是任何东西的背面。对硬阴影效果非常好。

所以基本上我的片段着色器中的这行代码会遮蔽任何对象的背面:

 isLit= dot(lsFragNormal.xyz, lightViewPos.xyz) > 0.0f ? 0.0 : isLit;

并且在硬阴影下可以正常工作。当谈到 PCF 时,我的第一个意图是像上面一样使用它,以检查过滤器内核中的当前纹素是否处于阴影中。这是用于阴影测试 PCF 过滤器内核的当前纹素的语句:

if((currentDepth < shadowMapDepth) && !(dot(lsFragNormal.xyz, lightViewPos.xyz) > 0.0f ))

但是从物体前面到物体后面的“阴影边缘”仍然是硬“阴影边缘”。这当然是有道理的,因为对于 PCF 过滤器内核的任何纹素,总是会测试当前片段的法线,因此如果片段位于对象的背面,则该片段将完全被遮蔽。但是,当我删除“点积测试”时,在物体从正面到背面的褪色过程中,由于掠光,我遇到了出现伪影的问题。

使用“点积测试”:如您所见,实际投射的阴影看起来不错,但物体背面的阴影是硬阴影: 在此处输入图像描述

没有“点积测试”:“背面阴影”的边缘开始向光前软化,但随后仍以硬边缘结束。您还可以看到一些伪像,我猜这些伪像来自该区域的欠采样: 在此处输入图像描述

我该怎么做才能在“背面阴影”的边缘获得一个好的(或至少更好的)柔和阴影?如果不引入“查询虚拟阴影贴图”之类的非常复杂的算法,这当然是该情况的完美解决方案,但这是针对交互式应用程序的,因此无法使用这样的过程。

还是我根本没有机会针对交互式应用程序进行这样的混叠。

如果您认为“背面阴影”的硬边是可以接受的,我很感兴趣?

4

0 回答 0