Opengl es 阴影贴图-与灯光正交的薄壁上的瑕疵

Opengl es 阴影贴图-与灯光正交的薄壁上的瑕疵,opengl-es,3d,opengl-es-2.0,shadow-mapping,Opengl Es,3d,Opengl Es 2.0,Shadow Mapping,我的背面(对光)和阴影贴图有问题,我似乎无法通过。我仍处于优化引擎的相对早期阶段,但我似乎无法达到这一点,因为即使为这一块几何体手动调整了所有东西,它看起来仍然像垃圾 它是一堵薄墙,通过大约5块不同的墙“弯曲”。当我创建深度贴图时,我正在剔除前面的面(对着灯光)。这当然有帮助,但墙另一侧的正面似乎是导致z战斗/投射阴影的原因 屏幕截图上的一些注释: 绘制深度纹理(来自灯光)时,将剔除前面 我已经为这一块几何体调整了近平面和远平面(分别设置为20和25) 一个方向光源,朝场景右侧以一个微小的角

我的背面(对光)和阴影贴图有问题,我似乎无法通过。我仍处于优化引擎的相对早期阶段,但我似乎无法达到这一点,因为即使为这一块几何体手动调整了所有东西,它看起来仍然像垃圾

它是一堵薄墙,通过大约5块不同的墙“弯曲”。当我创建深度贴图时,我正在剔除前面的面(对着灯光)。这当然有帮助,但墙另一侧的正面似乎是导致z战斗/投射阴影的原因

屏幕截图上的一些注释:

  • 绘制深度纹理(来自灯光)时,将剔除前面
  • 我已经为这一块几何体调整了近平面和远平面(分别设置为20和25)
  • 一个方向光源,朝场景右侧以一个微小的角度向下照射,足以指示墙应该被遮挡,但大部分是笔直向下
  • 使用非常大的4096x4096阴影贴图纹理
  • 所有照明都已禁用,但要知道,即使在这面墙上,我也在进行软照明(因此顶点的顶点法线)
如前所述,它的结论是,您不应该对光线背面的多边形进行阴影处理。我正在努力解决这个问题,因为我不想将面法线一直传递到片段着色器,以排除光线的真实背面-但是如果有人认为这是该几何体的最佳/唯一解决方案,我将不得不这样做。考虑到管道如何不容易/明显地通过面法线,我觉得这不是阻力最小的路径。请注意,我要传递的法线是顶点法线,以允许边缘周围有更柔和的照明效果(可能包括非阴影曲面和阴影曲面)

请注意,我有一些讨厌的,但我希望我的下一步是工作,但没有解决这个问题,我觉得我只是推迟了不可避免的,因为我已经用手尽可能地收紧视图(或者我认为是这样)

不管怎样,我觉得我错过了什么,所以如果你有任何想法或帮助,我将不胜感激

编辑

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

下面是禁用阴影的图像。这只是使用顶点法线来计算漫反射照明-它并不漂亮(太多的几何体可见),但它确实显示了一些边在某种程度上是可见的

所以,是的,墙应该在阴影中,但我希望我可以得到更好的平滑工作,使边缘可以有一些漫射照明。如果我需要将其完全置于阴影中,那么如果是阴影贴图将其置于阴影中,或者我的代码专门将其置于阴影中,因为面法线不在,我对此没有意见-但是将面法线传递到顶点/片段着色器似乎不是阻力最小的路径

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

编辑#2

我已经包括了下面的深度纹理。您可以在左下角看到有问题的墙,从屏幕截图可以看到我如何将深度值修剪为~0.4->1。这意味着该墙的深度值从0.4范围开始。因此,它不是完美的剪辑,但它的密切。这看起来合理吗?我敢肯定它是一个完整的24或32位深度缓冲区,是iOS上的la depth_组件扩展。对于@starmole,这是否有助于确定我的投影中是否存在缩放错误?你认为我的地图的大小/面积太大了吗?因此,如果它聚焦得更近,可能会有帮助吗


问题似乎在于你

  • 剔除正面
  • 看着后面的脸
  • 不从背面移除灯光,因为它实际上不是由法线照亮的-或者计算中存在一些不精确性
  • 可能没有添加一些ε
  • (1) 和(2)意味着在阴影贴图和背面之间将发生Z-战斗

    另外,阴影贴图的分辨率也帮不了你-只要看看阴影贴图中的墙,它有一个像素厚

    建议:

  • ε。确保Z>lightZ+epsilon
  • ε。确保墙朝向灯光(法线的点>ε),以确保墙在非常接近正交的情况下被遮挡

  • 为了确保我能正确理解这一点,这堵墙应该被遮蔽还是被照亮?在图像中添加一些指示平行光角度的注释可能也会有所帮助。添加了一些编辑,但总而言之,从技术上讲,基于几何结构,它应该在阴影中。。。但我猜使用阴影贴图在与光线成一定角度的陡坡上对人脸进行阴影处理是不可取的(因为存在瑕疵,即错误的自阴影)。也许我仍然遗漏了一些东西,那么如果面向观看者的那部分墙背对光线,它不应该已经变暗了吗?希望构成墙顶面的顶点和面向观察者的部分之间没有法线共享。此外,灯光的箭头是否指示灯光的位置,或灯光的照射方向?实际上,我认为您希望使墙的各个部分具有正确的法线,即使这意味着复制拐角处的顶点以确保每个面都具有正确的法线。只需计算阴影就会得到一个二进制(in/out)结果,而不是我假设您正在寻找的阴影。阴影映射实现的问题是,最终会出现阴影中断的情况,您需要处理ε和技巧以使其更好。的确如此