预烘烤软阴影的限制

时间:2016-10-27 14:31:41

标签: glsl webgl shadow shadow-mapping precompute

我在使用WebGL中的cubeTextures预先烘焙nVidia的PCSS工作了2个月。 我成功地实现了野兽。 Prebaking它最终也有效,但有一些明显的文物。

简而言之,我突出了我的主要神器,我解释了为什么我得到它,在一般情况下,每个人都应该遇到,如果他试图预先烘烤软阴影。 总结这个主题,围绕这个问题的每一条建议都可以帮助我:

我们如何处理预烘焙的软阴影瑕疵?

让我们通过谈论软阴影而不是关注PCSS来简化这种情况。这意味着我们正在使用包含每个纹素的可见性值范围从0到1 的shadowMap(而硬阴影生成只有2个可能值的shadowMaps:0或1)。

由于我们不是实时的,我们必须修复一个观点,而不是在每一帧使用相机视点。我的柔和阴影是从光的角度计算出来的。为了构建它们,我:

  • 使用所有阻挡程序(遮挡物)计算基本shadowMap
  • 在第二遍中,只包含接收器,我使用shadowMap计算软阴影,并存储每个像素的可见性

这给了我一个可以实时采样的预先计算的shadowMap。

预烘烤软阴影的第一个限制是阻挡器不能成为接收器的一部分。想象一个充满遮挡物的房间,然后唯一的接收器肯定是房间。否则,你会在房间网格上丢失一些阴影。 原因是我们陷入了光明的视野,所以如果我们把它作为接收器,我们也看不到拦截器背后的东西。

这种限制导致阴影地图具有良好的可见度值,但显然不是阻挡者阴影的好处。 我不介意在阻挡者身上获得正确的能见度值,我希望能够使用房间的阴影作为阻挡者阴影的近似值。但实际上,you'll get hard shadows on blockers因为在阻挡者背后,房间阴影的能见度值完全是黑色。

Here is a graphic to illustrate why this is happening.

在最好的情况下,我只把房间作为接收器。在底部的情况下,我也使用阻塞作为接收器。您可以轻松地看到两种情况都出现问题。 因为对于shadowMap的相同纹理元素,我们需要两个不同的可见性值:房间上的点是全黑的,而阻挡点上的点是半影。

我有很多想法来处理这个神器:

  1. 向着色器发送每个网格物体的meshId并评估此ID以了解我们是否正在遮挡阻挡物。
  2. 分别为每个阻止程序进行PCSS传递,并在末尾混合所有shadowMaps。
  3. 分别为每个接收者制作一份PCSS通行证(考虑到阻截者)。
  4. 预计算一半计算并实时制作另一半。
  5. 从几个角度预先计算shadowMap,而不是光源。
  6. 我失败了1& 2。 想法3似乎与想法2相同。 4是愚蠢的,它不再是预先计算。 而且我担心我无法创造出5个通用的想法。

    关于这个主题的文档很少。我发现的大多数文档都使用了理想的场景,没有阻挡器遮挡另一个阻塞,就好像它不是一般的情况。 那么也许这里有人已经遇到过这个问题或者对这个问题感兴趣?希望它能帮助其他人跟在我后面。

    但是,感谢您考虑这个问题。

0 个答案:

没有答案