Opengl 更好地理解暗影痤疮

Opengl 更好地理解暗影痤疮,opengl,shader,shadow,shadow-mapping,directional-light,Opengl,Shader,Shadow,Shadow Mapping,Directional Light,我目前正在从学习阴影贴图 我试图弄清楚为什么暗影粉刺会发生,我试着查看了我在网上找到的每一个视频/资源,一些人把这个问题与浮点舍入错误联系起来,另一些人说它与暗影贴图的大小有关,如果它可以无限大,那么这个问题就不会发生,但我所看到的解释中没有一个与我为什么看到这种三叉线模式有关: 一些解释甚至包括某种抽象的绘图,可以在视觉上与屏幕上的现象联系起来,但实际上并不能很好地解释发生这种情况的根本原因: 一整天以来,我一直在为这个现象挠头,到处寻找一个足够的解释。我基本上是在为这个现象寻找一个新的解

我目前正在从学习阴影贴图

我试图弄清楚为什么暗影粉刺会发生,我试着查看了我在网上找到的每一个视频/资源,一些人把这个问题与浮点舍入错误联系起来,另一些人说它与暗影贴图的大小有关,如果它可以无限大,那么这个问题就不会发生,但我所看到的解释中没有一个与我为什么看到这种三叉线模式有关:

一些解释甚至包括某种抽象的绘图,可以在视觉上与屏幕上的现象联系起来,但实际上并不能很好地解释发生这种情况的根本原因:

一整天以来,我一直在为这个现象挠头,到处寻找一个足够的解释。我基本上是在为这个现象寻找一个新的解释,希望是一个清晰友好的解释


另外,我希望在了解了这一问题的原因后,了解偏见/面部剔除如何帮助解决这一问题,以及他们如何将这一问题与peter penning问题交换,因为我认为没有明确的解释来解释为什么会发生这种情况而不是这一情况。

影子Acnee可能来自不同的原因

第一个问题是阴影贴图的精度和在着色器中计算的实际深度存在问题。存储在深度贴图中的深度从[近,远]映射到[0,1]

从[0,1]范围内的32位线性化浮点值到[0,1]范围内的非线性化深度,精度越高,可能存储在24位中。换句话说,在片段着色器中计算的某些深度值将映射到相同的纹理颜色,这将导致深度测试失败

例如,使用给定的公式

近距离=1,远距离=1000

如果由于精度错误,深度贴图中的这两个值映射为0.9995,则不显示。 当您计算深度测试时,其中一个将失败,原因是0.9995<0.9957

另一个问题可能来自阴影贴图太小,不适合实际的摄影机视点透视别名

正如您在这张照片中看到的,树的一侧在相机视角中的位置比在sadowMap中的位置要多。屏幕中覆盖树侧面的像素比阴影贴图中的像素多,如果在摄影机视点中计算的某些像素将在光点视点中使用相同的深度信息,则某些测试可能指向相同的阴影贴图像素,并将fai。d>ds


在这两种情况下添加一个偏差,将消除浮点错误,或者将补偿两个深度测试点到同一阴影贴图像素时的错误。增加偏差可以被视为误差幅度。有了这种偏见,你们可以接受一些以前被拒绝的测试,这些测试可能来自不同的原因

第一个问题是阴影贴图的精度和在着色器中计算的实际深度存在问题。存储在深度贴图中的深度从[近,远]映射到[0,1]

从[0,1]范围内的32位线性化浮点值到[0,1]范围内的非线性化深度,精度越高,可能存储在24位中。换句话说,在片段着色器中计算的某些深度值将映射到相同的纹理颜色,这将导致深度测试失败

例如,使用给定的公式

近距离=1,远距离=1000

如果由于精度错误,深度贴图中的这两个值映射为0.9995,则不显示。 当您计算深度测试时,其中一个将失败,原因是0.9995<0.9957

另一个问题可能来自阴影贴图太小,不适合实际的摄影机视点透视别名

正如您在这张照片中看到的,树的一侧在相机视角中的位置比在sadowMap中的位置要多。屏幕中覆盖树侧面的像素比阴影贴图中的像素多,如果在摄影机视点中计算的某些像素将在光点视点中使用相同的深度信息,则某些测试可能指向相同的阴影贴图像素,并将fai。d>ds


在这两种情况下添加一个偏差,将消除浮点错误,或者将补偿两个深度测试点到同一阴影贴图像素时的错误。增加偏差可以被视为误差幅度。带着偏见,你们接受了一些以前被拒绝的测试,这个图表似乎很好地解释了这一点。你有什么不明白的?另外,我不确定我是否在你的照片上看到暗影痤疮。它看起来更像是一个破碎的阴影映射实现。阴影痤疮往往发生在阴影的边缘。@NicolBolas转到我链接的资源,你可以看到他们提到阴影痤疮,图片显示了与我类似的问题。如果我理解正确的话,你说的是透视图别名,这不是我想要的
我说的是。而这些图片和一些资源中通常附带的解释是缺乏的。他们解释说,楼梯是投影在地面上的阴影贴图,我不太理解,因为我认为阴影贴图的想法是在第一次通过时创建阴影贴图纹理,对于第二个过程,使用用于生成阴影贴图的相同视图投影矩阵将每个顶点变换为光空间,然后使用它获得纹理中的深度值。我不确定在地面上投影阴影贴图是否符合我的描述。使用与生成阴影贴图相同的视图投影矩阵将每个顶点转换为光空间。你刚才描述了投影纹理的工作原理。很抱歉,正如我所说,有些事情我理解,有些事情我不理解。这就是为什么我在寻找一个令人耳目一新的关于暗疮原因的解释,也许你可以提供一个你自己写的解释,它可能会帮助我从不同的角度来看待这个问题。这个图表似乎解释得很好。你有什么不明白的?另外,我不确定我是否在你的照片上看到暗影痤疮。它看起来更像是一个破碎的阴影映射实现。阴影痤疮往往发生在阴影的边缘。@NicolBolas转到我链接的资源,你可以看到他们提到阴影痤疮,图片显示了与我类似的问题。如果我理解正确的话,你说的是透视图别名,这不是我说的。而这些图片和一些资源中通常附带的解释是缺乏的。他们解释说,楼梯是投影在地面上的阴影贴图,我不太理解,因为我认为阴影贴图的想法是在第一次通过时创建阴影贴图纹理,对于第二个过程,使用用于生成阴影贴图的相同视图投影矩阵将每个顶点变换为光空间,然后使用它获得纹理中的深度值。我不确定在地面上投影阴影贴图是否符合我的描述。使用与生成阴影贴图相同的视图投影矩阵将每个顶点转换为光空间。你刚才描述了投影纹理的工作原理。很抱歉,正如我所说,有些事情我理解,有些事情我不理解。这就是为什么我要寻找一个令人耳目一新的解释来解释暗疮的原因,也许你可以提供一个自己写的,它可能会帮助我从不同的角度来看这一点。我认为这是一个很好的解释,我很高兴感谢你的例子和插图:如果你能解释正面面部剔除如何修复暗疮以及/或导致peter Panning进行面部剔除,也会很好,这需要另一个答案。这对我帮助很大。我一直在研究不同的定义,没有弄清楚什么是精度问题。相机像素和阴影纹理与图片的比较确实帮助了我。谢谢。我认为这是一个很好的解释,我很高兴感谢你的例子和插图:如果你能解释正面除皱如何修复暗疮和/或导致peter Panning进行面部除皱,那将需要其他答案。这对我帮助很大。我一直在研究不同的定义,没有弄清楚什么是精度问题。相机像素和阴影纹理与图片的比较确实帮助了我。谢谢
F(700) = 0.99957, F(701) = 0.99948 ~= 0.9995