阴影贴图 - 与光正交的薄壁上的伪影

时间:2012-11-14 01:49:28

标签: opengl-es 3d opengl-es-2.0 shadow-mapping

我遇到了背面(光线)和阴影贴图的问题,我似乎无法通过。我仍然处于优化引擎的相对早期阶段,但是我似乎无法实现这一点,即使手动调整这一块几何形状,它仍然看起来像垃圾。

它是一个瘦墙,通过约5个不同的墙块“弯曲”。当我创建我的深度图时,我正在剔除前脸(对光线)。这肯定有帮助,但墙的另一侧的正面似乎是导致z战斗/投射阴影。

Artifacts on bent wall

截图上的一些注释:

  • 正在绘制深度纹理(来自灯光)
  • 时,正面会被剔除
  • 我的近距离和远距离飞机仅针对这一块几何形状进行了调整(分别设置为20和25)
  • 一个方向光源,朝向场景右侧稍微倾斜,足以表明墙应该被遮挡,但大多是直线下来
  • 使用荒谬的大型4096x4096阴影贴图纹理
  • 所有灯光都被禁用,但我知道即使在这面墙上,我也在做柔和的灯光(因此也就是顶点的顶点法线)

正如所提到的here,它得出结论,你不应该遮挡从光线背面的多边形。我正在努力解决这个问题,因为我不想将面法线一直传递到片段着色器以排除那里真正的背面 - 但是如果有人觉得这是最好的/唯一的解决方案这种几何形状就是我必须要做的。考虑到管道如何不容易/明显地通过面法线通过它让我觉得这不是阻力最小的路径。请注意,我传递的法线是顶点法线,以允许边缘周围更柔和的光照效果(可能包括非阴影和阴影表面)。

请注意,我有一些讨厌的Perspective Aliasing,但我希望我的下一步工作是cascaded shadow maps,但如果不解决这个问题,我觉得我只是在拖延不可避免的事情,因为我尽我所能(或者我认为)尽可能地收紧了观点。

无论如何我觉得我错过了什么,所以如果你有任何想法或帮助,我将非常感激!

修改

为了清楚起见,根据光线的来源,墙壁技术上不应该处于阴影中。

Overhead view

下面是阴影关闭的图像。这只是使用顶点法线来计算漫反射光照 - 它不漂亮(太多的几何体是可见的),但它确实显示某些边缘有些可见。

Without shadowing turned on

所以是的,墙应该在阴影中,但我希望我可以让平滑效果更好,所以边缘可以有一些漫射光。如果我需要将它完全放在阴影中,那么如果它的阴影贴图将它置于阴影中,或者我的代码专门将它置于阴影中,因为面部法线不在,我对此很好 - 但将面部正常通过我的顶点/片段着色器似乎不是阻力最小的路径。

也许这些将有助于更好地说明我的问题,或者可能揭示我缺少的一些基本理解。

编辑#2

我在下方加入了深度纹理。你可以在左下方看到有问题的墙,从截图中你可以看到我如何将深度值修剪为~0.4-> 1。这意味着该墙的深度值从0.4范围开始。所以它没有完美地剪裁它,但它的关闭。这看起来合情合理吗?我非常确定它是一个完整的24或32位深度缓冲区,是iOS上的DEPTH_COMPONENT扩展。对于@starmole,这有助于确定我的投影中是否存在缩放误差?你认为我的地图所覆盖的尺寸/面积是否太大,因此如果它更接近它可能有帮助吗?

enter image description here

1 个答案:

答案 0 :(得分:2)

问题似乎是你

  1. 剔除正面
  2. 看着背面
  3. 没有从背面移除光线,因为它实际上没有被正常照亮 - 或者计算中存在一些不准确性
  4. 可能没有添加一些epsilon
  5. (1)和(2)表示阴影贴图和背面之间会有Z战斗。

    此外,阴影贴图分辨率对您没有帮助 - 只需看一下阴影贴图中的墙,它就是一个像素厚。

    建议:

    1. Epsilons。确保Z> lightZ + epsilon
    2. Epsilons。确保墙面朝向光线(正常的点> epsilon),以确保墙壁是阴影的,如果它几乎是正交的