2014-03-19 114 views
9

我刚在我的引擎中实现了一个灯光系统。在下面的截图中,你可以看到在行动一光(黄色方块):漫射光/阴影

1 要考虑到在光的顶部光照的情况下,其还实施了FOV,将堵塞你的视野之外的任何内容。这就是为什么阴影的左侧看起来如此关闭。

正如您所看到的,灯光的阴影非常“硬”,因为它们甚至不会照亮直接触及范围之外的区域。 为了使灯光看起来更好,我申请一个过滤器对他们来说,这几乎限制了被照亮的范围内,并且也略有还有iLuminate这个限度内的区域:

2

在黄色的大即使没有直射光线到达,您也可以看到该区域是如何照亮的。

然而,这种解决方案带来了一些不良的副作用。正如你可以在下面的截图中看到,即使没有光在所有到达的区域,将在点亮它太靠近光源:

10

我想知道是否有什么办法通过适当地使用着色器来实现我要做的事情。 我遇到的主要问题来自我如何绘制这些阴影。

1)首先我把结构放在灯的范围内。

在这一点上,我与顶点的工作,因为他们明确规定阴影投射项目的区域:) 3

2然后,对于每个对象,我估计他们单独的阴影: 4

5

6 它们的阴影是由CPU完成的,通过calpulating突起为身体的每个顶点。

3)然后GPU绘制这些形状到纹理组成​​最终的影子:

7

我发现的问题是,使这个弥漫性阴影效果,我需要最终的影子。如果我要计算步骤2)中的漫射阴影,则实体B和C之间会出现光线间隙。

但是,如果我在步骤3中弥散阴影,则不再具有顶点信息,因为所有我所拥有的信息是3个局部纹理在一个最终纹理中加在一起。

那么,有没有办法做到这一点?我的第一个想法是将变化传递给碎片生成器来计算有多少光进入黑暗区域,但是由于我将在最终的影子上处理这个信息,该信息没有顶点信息,所以我完全失去了什么我应该使用这种方法。

我对这种方法可能完全错误,因为我对着色器的使用经验非常有限。

这里是什么,我有一个例子,现在,我的愿望: 我有什么:普通照明withing光半径(这会导致穿墙夹光 7

我想要什么:阴影越强,距离光线越远距离越远 7

+0

s/difuse/diffuse/ –

+0

感谢您指出错字。 Fix'd。编辑:我无法输入! :( – Leo

+0

我想我们需要更多关于你在哪里做算法部分的信息。你计算CPU上的影子卷吗? –

回答

1

我认为不管你做什么,你都必须对场景中的区域进行不同的光衰减计算不能直接看到原始光源,我不确定你是如何实际应用的将阴影音量添加到场景中,但是当您生成阴影音量时,您可能可以执行诸如对边缘进行分类等操作。他们是从墙上还是从灯光到角落?),并相应地对待它们。

总之,我不认为有任何聪明的着色器特定的技巧,你可以解决这个问题。这是您使用的算法的限制,因此您需要改进算法以考虑阴影体中边缘的不同特性。

---编辑---

好吧,我想你最好的选择将是创建两个影子卷(或相当阴影区域,因为我们在2D正在努力)。一个会像现在一样,另一个会更小 - 你会想要排除处于“柔和”阴影的区域。然后在片段着色器中有三个类别:全部阴影,柔和阴影和未被遮蔽。

要创建第二个阴影贴图,我认为您需要做一些操作,例如为由角落周围的光线创建的边缘添加固定角度。

---编辑#2 ---

我想你可以通过阴影区域的轮廓和场景的外包装盒解决的对象B和C之间的差距问题。因此,对于每个阴影区域,您都会找到与外框相交的两个最外面的点,然后丢弃其中的所有线段并将它们替换为该框的该部分。我觉得我应该能来命名的算法,但它脱离了我的那一刻...

原始场景: Original scene

个人“硬”的阴影: Individual "hard" shadows

现在工会的阴影一起: Union

最后,跟踪阴影周围,保持框的边缘。你想识别的角落是黄色的角落。当你在阴影的周围寻找时,你想要穿过盒子的边缘,直到到达对面的角落。不是最容易的事情代码,但如果你已经远远得到这个我认为你可以或者看着办吧:)

Silhouette

,可能更容易简单地考虑照亮的区域。例如,你可以做一些事情,如采取场景框和工会阴影区域的区别。这通常会给你多个多边形;抛弃除了包含光之外的所有东西,因为其余的都是虚假的差距。

+0

是的,我想我需要改进算法,但这正是我所要求的。 关于着色器的问题只是对我可能忽略或忽略的着色器的一些缺失概念或原理进行双重检查,因为正如我所说的,我的经验非常有限。 – Leo

+1

@ user2215331 Ok编辑相应... –

+0

我已经实现了类似的东西。如果您查看第一张截图,右侧阴影的边缘会以一定角度扩散,而漫射区域会随着远离角落而变大。我试图使用这种方法,但问题仍然与问题中所述的相同:如果在处理小阴影(即仍在使用顶点的过程的最后一步)时构造软阴影,则会增加柔和阴影我不会等于我正在寻找的那么大的软阴影。真正的问题是如何从产生的总影子中构建这个软阴影。 – Leo