处理场景中的许多灯光(带有着色器)


9

我很好奇如何处理场景中的许多灯光。给定角色扮演游戏中非常大的地图,其中包括地牢(其中有灯光)等。我知道延迟照明,但这只能回答如何渲染许多灯光。但是我的问题更多:如何渲染很多灯光。仅渲染影响场景的灯光显然是可取的,但是我不知道将其存档的技术/算法。没有人希望甚至能够渲染500个点光源,仅仅是因为地图上的某个地方。但是,人们不能只是从灯光到玩家的直线,并测试两者之间是否有直线。距离似乎也不是一个好的指标。(阳光?)

tl; dr:如何找出仅影响渲染的灯光会影响场景?


OpenGL或DirectX?
克拉韦米尔

6
实际上,只要您不希望所有阴影都可以使用延迟照明,那么500盏灯就很有可能;)

例如,对于点和圆锥贴图,可以使用咬合剔除-点光源只是一个球体。随处可见定向光
Kikaimaru 2012年

4
@Darkwings您基本上在这里描述blubb的要求。我怎么走?好吧,我认为这里的解决方案只是步行!(为我工作。);-)“您需要知道该光源是否在视锥中照亮某些东西。” <- 正是他所要的,他想知道他该怎么做。^^虽然来自Kikaimaru的圆锥体/球体可能会有所帮助。
cooky451

1
对于OP来说,检查视锥不是很明显,因为他提到的只是距离。每盏灯将具有一些参数来确定这一点。如果使用定向光,它们将到达任何地方,聚光灯将具有目标区域(因此可以通过矢量平面相交来解决),依此类推。考虑到如果确实有很多灯光彼此非常接近,那么最好进行近似(用于阴影投射),因此您应该更多地考虑影响场景的灯光。IE:古董吊灯上的100支蜡烛可以单灯处理。
Darkwings,2012年

Answers:


5

比边界体积更简单;

为每个灯光分配一个半径。在渲染场景时,只需检查场景对象与每个光源之间的距离是否小于光源的半径。如果是这样,请使用灯,否则请跳过它。

取决于性能的重要性,只是稍微复杂一点:

您也可以对此进行某种广泛的阶段检查。只需定义一个空间网格即可在网格单元的基础上存储灯光的句柄,然后仅对场景对象最大半径内的单元中的灯光执行距离检查。


5
+
1-

有点晚了...无论如何,这恰好是一个边界球。使用该方法,您仍将渲染完全被墙壁等遮挡的灯光,因此与场景无关。同样,并非所有的光都向各个方向传播。
Darkwings,2012年

5

我能想到的最简单的方法(老实说,我想到的唯一方法)是给每盏灯指定一个边界体积。如果边界体积与视锥视图相交(或视锥视图的边界体积),请应用光。

即使它们不影响任何可见的对象,仍然可以应用灯光,但是它既简单又快速。场景图的智能排列可能意味着只需几个交叉点就能检查掉大部分的灯光(就像对对象剔除所做的一样)。

诸如太阳之类的东西可能没有边界体积(表示应该始终应用它)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.