【问题标题】:Rendering a point light using 6 spot lights?使用 6 个聚光灯渲染点光源?
【发布时间】:2009-12-11 18:50:20
【问题描述】:
我正在尝试渲染 6 个聚光灯来为阴影映射算法创建一个点光源。
我不确定我这样做是否正确,我在设置视图和投影矩阵时或多或少遵循了here 的说明,但最终结果如下所示:
白色区域是被 6 个阴影贴图之一覆盖的部分,较暗的区域是没有被阴影贴图覆盖的部分。显然,我对将阴影投射到场景中的茶壶和盒子没有任何问题,但是正如您所看到的 6 个阴影贴图有盲点。这是立方体阴影贴图的外观吗?看起来不像是点光源的阴影贴图……
【问题讨论】:
标签:
mapping
directx
projection
shadow
hlsl
【解决方案1】:
实际上,您可以调整您的六个点,使锥体完美地填充立方体贴图的每个面。您可以通过设置每个圆锥体的孔径以在每个立方体贴图面周围创建一个外接圆来实现此目的。在这种情况下,您不必担心重叠,因为 会重叠 部分超出了面部区域。
换句话说:调整灯光的投影矩阵的FOV,所以它不会包含光锥的视锥体,但锥体会包含视锥体。
整个实现see this paper。
【解决方案2】:
您在这里看到的是一个圆和两条双曲线(圆锥截面),这正是您使用双端圆锥并将其与平面相交时所期望的结果。
这个数学可能看起来与情况无关,但它解释了你的问题。聚光灯会产生一个锥形光,您不能用来自同一点的一堆锥形光完全填充一个实心空间。 (我建议把一堆纸卷起来,然后用胶带把它们粘在一起试试。)
但是,当您远离模拟点源的原点时,锥体会收敛到它们的渐近线,并且光线中会出现无限窄的间隙。
解决这个问题的一个方法是改变视锥细胞的焦点,使它们稍微重叠——这会产生曝光过度的区域,但过度曝光只会随着距离的增加而变得明显。只要您的所有对象都靠近点光源,这可能不是什么大问题。
另一种选择是将所有灯光的焦点移到更靠近其光源的位置。这样,它们会更快地收敛到它们的渐近线。