如何使用无限数量的灯光构建游戏的照明效果如何?

Mat*_*wig 4 opengl graphics lighting

例如,在"我的世界"中,您可以将火炬放置在任何地方,每个火炬都会影响世界上的光照水平,并且您可以在世界范围内放置的火炬/光源数量没有限制.我99%确定火炬的照明在CPU上处理并为每个块存储,因此当在某个块上渲染光值时,只需要将其传递到着色器,但是光源不能为此移动原因.如果你有一个游戏,你可以放置可以四处移动的光源(箭头着火,带有灯光的矿车,发光的能量球)和照明不是那么简单(包括颜色)什么是最有效的计算灯光效果的方法.

根据我的研究,我发现不同的渲染,不同的光照,动态创建具有不同光量的着色器并使用for循环(不能使用由于展开的制服)和静态光照贴图(这些可能仅用于还是灯)有没有其他方法可以进行照明计算,例如做除了允许移动灯光之外做什么类型的Minecraft,或者是否可以采用无限量的灯光并在数学上将它们组合成仅涉及几个灯光的近似值(这是一个想法我想出来但我无法弄清楚它是如何完成的?)

如果它有帮助,我是一个在OpenGL(传统和现代)方面具有良好经验的程序员,所以你可以给我代码片段,虽然我没有做太多的照明,所以简短的解释将不胜感激.如果你能指出我正确的方向,我也愿意做研究!

Spe*_*tre 7

你的头衔有点误导,infinite light意味着像太阳一样无限距离的定向光.我会unlimited number of lights改用.这里有一些方法,我知道:

  1. (背面)射线追踪器

    他们可以原生处理任意数量的光源.光只是引擎中的另一个对象.如果射线击中光源,它只需要光强度并停止递归.不幸的是,当前的gfx硬件不适合这种渲染.有GPU增强引擎,但专业的gfx硬件仍在开发中,尚未上市.内存要求与标准BR渲染没有太大差别,您仍然可以使用BR网格,但数学(分析)网格本身支持,并且更好.

  2. 标准BR渲染

    BR意味着boundary representation这样的引擎(像OpenGL固定功能)只能处理有限数量的灯.这是因为每个基元/片段需要完整的光列表,并且对每个基元或每个片段的所有光进行计算.如果你有很多光,这将是缓慢的.

    此外,当前GPU对于存储灯光和其他渲染参数的制服(寄存器)的内存有限,因此有可能的解决方法,例如将光参数存储在纹理中,并在GLSL着色器内的每个基元/片段上迭代所有这些参数,但是光的数量会影响粗糙的性能,因此您受到目标帧速率和计算能力的限制.对此的额外内存要求只是具有光参数的纹理,而不是那么多(每个光的矢量很少).

  3. 光照贴图

    即使是移动物体也可以计算它们.可以缓慢地计算复杂的光照贴图(不是每帧).这会导致较小的光照效果,但您需要知道要查找的内容.光照贴图和阴影贴图非常相似,通常会立即计算出来.那里有简单的光照贴图和复杂的辐射图模型

    这些是:

    • 投影的二维地图(难以实施/使用,往往不太精确)
    • 3D体素贴图(内存要求高但易于计算/使用)

    一些方法使用预渲染的Z-Buffer作为几何源,然后通过Radiosity或任何其他技术填充灯光.这些可以处理任意数量的灯,因为这些地图可以是计算要求它们通常在后台计算并且偶尔更新一次.

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

    • 将相机设置为较大的可见表面
    • 渲染场景并将结果处理为光/阴影贴图
    • 将其存储为2D或3D纹理或体素贴图
    • 然后从摄像机视图继续正常渲染

    因此,您需要每帧/地图更新渲染一次场景,并且还需要额外的缓冲区来存储渲染结果,这对于高分辨率或体素映射可能是一大块内存.

  4. 多通光层

    有些情况下,渲染场景后添加光,例如我用它

    这里有所有多通道渲染技术,您需要额外的缓冲区来存储子结果,并且通常多次渲染在同一视图/场景上完成,因此使用预渲染几何体,无论是锁定的VAO还是已经渲染的第一遍的Z缓冲区颜色和索引缓冲区.在此句柄之后作为单个或几个四边形传递(如在大气散射链接中),因此与基本BR渲染相比,所需的计算能力并不大得多

  5. 前向渲染与延迟渲染

    在谷歌这个前向渲染与延迟渲染是我发现的第一个相关命中.它不是很好(我的口味有点模糊)但对于初学者来说就足够了

    • 前向渲染技术通常是标准的单通道BR渲染
    • deffered渲染是标准的多遍渲染.在第一遍中将场景的所有几何体渲染成Z缓冲区,颜色缓冲区和一些辅助缓冲区,只是为了知道结果的哪个片段属于哪个对象,材质,......然后在接下来的传递中添加效果,光,阴影,......但几何体不会再次渲染而只是单个或几个覆盖QUAD /每次传递渲染所以下一次传递通常非常快...

    该链接表明,对于高亮度数字而言,自然渲染更适合,但这在很大程度上取决于使用以前的技术.通常使用多次通过光层(具有标准的自然渲染技术之一),因此在这种情况下它是真的,并且存储器和计算能力需求是相同的,参见前一节.