超过8灯没有延期阴影/照明

我想知道在使用OpenGL和GLSL制作的场景中是否有任何技术(高效)使用超过8个灯光。 不使用延期着色/照明。

我还没有实施这些技术,因为它们的局限性,无法使用透明度或抗锯齿。

如果有一个好的select,用一个例子来描述它。

我使用OpenGL 2.0。

谢谢。

你发现的限制与OpenGL的历史有些相关。 在OpenGL 3之前,使用了一个固定function的stream水线。 这大致意味着比OpenGL将在所有顶点上执行完全相同的处理。 您可以修改输出的唯一方法是更改​​管道的input参数(顶点位置,颜色,光源属性…)。 这意味着OpenGL API包含了很多function来改变这些input参数。 具体来说,为了设置灯的属性,OpenGL提供了8种不同的灯来改变属性。

在现代的OpenGL中,固定functionstream水线被可编程stream水线所取代。 这大致意味着您可以编程管道来执行任何types的顶点处理。 您可以针对您尝试模拟的不同纹理/材质使用广泛的不同处理。 这些程序被编程为“着色器”。 这个“负面”的一面是没有为你提供任何function。 你从一个空管道开始,需要从头开始写。 你需要的最less是至less一个顶点着色器和一个片段着色器。 优点是,您可以根据自己的喜好编程管道。 例如,您可以传递20个灯光arrays(而不是固定function管线OpenGL中的8个灯光的默认灯光)。 所以,一个解决scheme就是切换到一个更新的版本的OpenGL。

然而! 在大多数情况下,你将不需要超过8个灯。 照明计算相当复杂。 如果你想要优秀的灯光,你可能会使用顶点着色器中的每像素点亮(phong shading)。 对于每一个额外的灯光,你需要额外的计算每个像素。 灯光越多,处理时间越多,这意味着您会注意到放缓。

解决scheme是聪明的禁用灯。 在现代游戏中,一次只有less量灯光是活跃的。 灯被禁用,并根据摄像机位置,遮挡等因素重新启用。 考虑例如点光源。 物体reflection的光线强度越低,光线越弱。 这就是所谓的距离衰减。 在一定的距离,你不会注意到光的影响了。 因此禁用光线是安全的,释放了大量的处理时间(对每个片段都进行计算!)而没有视觉影响。 另一种解决scheme是通过单一来源来近似多个光源。 例如,考虑让100只萤火虫在你的游戏地图上飞行。 您可以安全地靠近群体中心的单一来源近似这100个光源。 100个单灯的总和贡献将几乎无法与单源近似区分开来。

总之:如果你真的想要8个以上的灯,看看现代的OpenGL(OpenGL 3 +),并写你的着色器来适应这一点。 但是,超过8个灯几乎不需要。 考虑启用和禁用灯(例如,在每个帧中仅启用与球员/摄像机最近的8个灯)。 尝试通过单一来源来近似多个closures光源。

正如你已经知道的GLSL,你可能会发现现代的OpenGL非常有趣。 虽然从零开始编写整个着色器管道更加困难,但是一旦stream畅操作,您将会很高兴,因为它为graphics处理提供了大量的function!