建筑游戏中无限数量灯光的照明原理是什么?

5
例如在《我的世界》中,您可以在任何地方放置火把,每个火把都会影响世界中的光照水平,并且您可以在世界中放置无限数量的火把/光源。我有99%的把握,火把的照明效果是由CPU处理并存储在每个方块中的,因此在渲染时,只需要将该特定方块的光值传递到着色器中,但由于这个原因,光源无法移动。如果您有一个可以放置可以移动的光源(点燃的箭头,带灯的矿车,发光的能量球)并且光照不是很简单(包括颜色),那么计算光照效果最有效的方法是什么。
从我的研究中,我发现了多种渲染、多种光照、动态创建具有不同数量光源的着色器以及使用for循环(由于展开无法使用uniforms)和静态光线图(这些可能仅用于静止的灯光)。是否有其他计算光照的方法,例如执行《我的世界》所做的操作,但允许移动光源,或者是否可以采用无限数量的光源,将它们数学组合成仅涉及少量光源的近似值(这是我想出的一个主意,但我无法弄清楚它如何完成)?
如果有帮助的话,我是一名在OpenGL(传统和现代)方面具有相当经验的程序员,因此您可以给我提供代码片段,尽管我在照明方面做得不太多,但简要的解释将不胜感激。如果您能指点我正确的方向,我也愿意做进一步研究!

“由于展开,无法使用统一变量”是什么意思?平铺延迟渲染和正向+渲染是最强大的技术之一,但它们需要循环遍历包含灯光数量的统一变量。 - Jerem
据我所读,当编译着色器时,编译器会展开循环,因此在for循环中,您迭代的次数必须是一个常量。 - Matthew Ludwig
1
这仅适用于WebGL 1.0和OpenGL ES 2.0。如果你的目标平台是PC,你将没有这个限制。 - Jerem
1个回答

9
你的标题有些误导性,“无限光”意味着无限远处的定向光,就像太阳一样。我建议使用“无限数量的灯光”。以下是我所知道的一些方法:
  1. (back) ray-tracers

    它们可以本地处理任意数量的光源。光只是引擎中的另一个对象。如果光线击中光源,它只会采取光强度并停止递归。不幸的是,当前的图形硬件不适合这种渲染。有用于此类引擎的GPU增强引擎,但专门的图形硬件仍在开发中,尚未进入市场。内存要求与标准BR渲染没有太大区别,您仍然可以使用BR网格,但数学(分析)网格得到本地支持,并且更适用于此。

  2. 标准BR渲染

    BR表示边界表示,这样的引擎(如OpenGL固定功能)只能处理有限数量的灯光。这是因为每个基元/片段需要完整的灯光列表,并且计算是基于每个基元或每个片段进行的。如果你有很多光,这将很慢。

    此外,当前的GPU对于存储灯光和其他渲染参数的统一变量(寄存器)具有有限的内存,因此可能会出现解决方法,例如将灯光参数存储在纹理中,并在GLSL着色器中的每个基元/片段上迭代所有这些内容,但是光的数量会影响性能,因此您受到目标帧速率和计算能力的限制。对于此项工作的额外内存要求仅为带有轻量级参数的纹理(每个光几个向量)。

  3. 光照贴图

    它们甚至可以针对移动对象进行计算。复杂的光照贴图可以缓慢地计算(不是每帧)。这导致小的照明伪影,但您需要知道要查找的内容才能发现它。光照贴图和阴影贴图非常相似,并且通常同时计算。这里有一些简单的光照贴图和复杂的辐射贴图模型。

    这些是:

    • 投影2D贴图(难以实现/使用并且通常不太精确)
    • 3D体素贴图(内存需求大但更容易计算/使用)

    某些方法使用预渲染的Z缓冲区作为几何源,然后通过Radiosity或任何其他技术填充灯光。这些可以处理任意数量的光,因为这些贴图可能需要计算,它们经常在后台计算并偶尔更新一次。

    快速移动的光源通常更新得更频繁,或者从贴图中排除并呈现为透明几何体,以产生光的印象。这需要的计算能力取决于计算方法,基本上是:

    • 将相机设置为可见表面最大的位置
    • 渲染场景并将结果处理为光/阴

我已按照您的建议更改了标题,谢谢。这些方法在速度和内存使用方面与前向渲染和延迟渲染相比如何?此外,根据Jerem提供的非常量for循环表达式信息,将光信息数组传递进去,然后使用灯光数量的统一变量是否与这些方法相比是可行的选择,或者这是否属于具有无限灯光的BR渲染。 - Matthew Ludwig
@MatthewLudwig 在回答的每个部分中添加了所要请求的信息。只是为了确保,Forward 和 Deffered rendering 都是如何呈现我在答案中列出的技术提供的输入的技术。Deffered 渲染用于多通道渲染,而 Forward 则用于标准 BR 渲染。 - Spektre
谢谢,我无法要求更好的了!+1 和已接受的答案! - Matthew Ludwig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接