0

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

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

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

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

4

1 回答 1

2

两个位置的差异应该是相同的,无论它们的坐标以何种角度表示,对吧?

不,他们不是。

考虑一个世界,其中光线直接位于世界原点上方,“上方”表示 +Y 方向。这就是生成阴影贴图的方向。它是从世界空间生成的。

现在,考虑位于世界起源的相机。它向下看 -Z 轴,+Y 指向正上方。在这种情况下,相机空间和世界空间之间没有方向差异。因此,在这两种情况下,光的方向都是 (0, 1, 0)。

但是,如果您将相机绕其观察轴旋转 90 度会发生什么?好吧,相对于世界,相机是侧躺的。这意味着光的方向是 (1, 0, 0) 或 (-1, 0, 0),具体取决于您旋转的方式。而且那个方向和世界空间方向不同,仍然是(0, 1, 0)。

是的,光没有移动,相对于世界。但相机做到了。因此,相机空间光方向的值与世界空间光方向的值不同。

如果灯光位置和片段位置都确实在相机空间中,那么减去它们将给出相机空间中灯光的方向。如果阴影贴图确实建在世界空间中,那么这个方向将毫无用处。

于 2017-08-04T02:22:10.677 回答