WebGL2 - 我可以查询具有非世界位置的阴影贴图立方体贴图吗?

WebGL2 - Can I query a shadowmap cubemap with non world position?

我正在尝试使用 Webgl2 为点光源实现阴影贴图。为此,我使用了深度缓冲区的立方体贴图,我从光线位置向其渲染 6 轴对齐的视图。

在我用来渲染光照的片段着色器中,我使用这些行查询这个立方体贴图:

vec3 lightToPos = lightPos-fragPos;
float closestDepth = texture(shadowMap, lightToPos).r;

注意lightPos和fragPos在'view'引用中,即:viewMat * worldMat * objPos。在我遵循的教程中,这应该处于世界位置 (http://ogldev.atspace.co.uk/www/tutorial43/tutorial43.html)。现在,我看不出我的方法行不通的原因,因为两个位置的差异应该是相同的,无论它们的坐标是从哪个角度来表达的,对吧?我得到的结果不是我所期望的,一切都在阴影中。我可能在其他地方犯了错误,但我想确保我理解它是如何工作的,并且错误不是出自此处。

the difference of two positions should be the same regardless of the point of view their coordinates are expressed in, right?

不,他们不是。

考虑一个世界,其中光线直接位于世界原点上方,"above" 表示在 +Y 方向。这就是生成阴影贴图的方向。它是从 world-space.

生成的

现在,考虑世界原点处的相机。它向下看 -Z 轴,+Y 指向上方。在这种情况下,相机 space 和世界 space 之间没有方向差异。因此,在这两种情况下,光线方向都是(0, 1, 0).

但是,如果您将相机围绕其观察轴旋转 90 度,会发生什么情况?好吧,相机相对于世界是侧卧的。这意味着光线方向是 (1, 0, 0) 或 (-1, 0, 0),具体取决于您旋转的方向。而且那个方向不同于世界space方向,还是(0, 1, 0).

是的,相对于世界,光没有移动。但是 相机 做到了。因此,camera-space 光照方向的值不同于 world-space 光照方向的值。

如果光线位置和片段位置确实都在相机 space 中,那么减去它们将给出 相机中光线的方向 space.如果阴影贴图真的是在space世界建造的,这个方向就完全没用了